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); + } }