From dc8949047f37625c8b3aa14aa7f1915dde69721d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Krzemi=C5=84ski?=
 <3110813+krzema12@users.noreply.github.com>
Date: Tue, 2 Apr 2024 13:55:16 +0200
Subject: [PATCH] Fix setting width greater than the default (#154)

Resolves #152.

It looks like a coding error when porting snakeyaml-engine to Kotlin.
The original project contains:

https://github.com/krzema12/snakeyaml-engine-kmp/blob/04614c75c124d30c58221ab11255c5d45d913a14/src/main/java/org/snakeyaml/engine/v2/emitter/Emitter.java#L213-L216

which I'm reimplementing in this PR.

BTW, there's no unit test for this behavior in snakeyaml-engine, and
ideally we'd like to add it there as well. It would have prevented this
regression.
---
 .../org/snakeyaml/engine/v2/emitter/Emitter.kt  |  4 ++--
 .../engine/v2/emitter/EmitterTest.java          | 17 +++++++++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/commonMain/kotlin/org/snakeyaml/engine/v2/emitter/Emitter.kt b/src/commonMain/kotlin/org/snakeyaml/engine/v2/emitter/Emitter.kt
index d447eac68..ce02448c3 100644
--- a/src/commonMain/kotlin/org/snakeyaml/engine/v2/emitter/Emitter.kt
+++ b/src/commonMain/kotlin/org/snakeyaml/engine/v2/emitter/Emitter.kt
@@ -97,7 +97,7 @@ class Emitter(
     private val bestIndent: Int = if (opts.indent in VALID_INDENT_RANGE) opts.indent else DEFAULT_INDENT
     private val indicatorIndent: Int get() = opts.indicatorIndent
     private val indentWithIndicator: Boolean get() = opts.indentWithIndicator
-    private val bestWidth: Int = opts.width.coerceAtMost(MAX_WIDTH)
+    private val bestWidth: Int = if (opts.width > this.bestIndent * 2) opts.width else DEFAULT_WIDTH
     private val bestLineBreak: String get() = opts.bestLineBreak
     private val splitLines: Boolean get() = opts.isSplitLines
     private val maxSimpleKeyLength: Int get() = opts.maxSimpleKeyLength
@@ -1571,7 +1571,7 @@ class Emitter(
 
         private const val DEFAULT_INDENT = 2
 
-        private const val MAX_WIDTH = 80
+        private const val DEFAULT_WIDTH = 80
 
         private const val SPACE = " "
 
diff --git a/src/jvmTest/java/org/snakeyaml/engine/v2/emitter/EmitterTest.java b/src/jvmTest/java/org/snakeyaml/engine/v2/emitter/EmitterTest.java
index 439dbac0d..1470b1dd2 100644
--- a/src/jvmTest/java/org/snakeyaml/engine/v2/emitter/EmitterTest.java
+++ b/src/jvmTest/java/org/snakeyaml/engine/v2/emitter/EmitterTest.java
@@ -298,4 +298,21 @@ public void testIndicatorIndentRange() {
         "indicator indent range end must be one less than the indent range end"
     );
   }
+
+  @Test
+  public void testAllowSettingBigWidth() {
+    DumpSettingsBuilder builder =
+      DumpSettings.builder().setDefaultScalarStyle(ScalarStyle.DOUBLE_QUOTED)
+        .setDefaultFlowStyle(FlowStyle.FLOW).setWidth(1000);
+    Map<String, Object> map = new TreeMap<>();
+    map.put("12345", "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 " +
+      "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 " +
+      "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890");
+
+    String output = dump(builder.build(), map);
+    assertEquals("{\"12345\": \"1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 " +
+      "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 " +
+      "1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890\"}\n",
+      output);
+  }
 }