Skip to content

Commit

Permalink
Merge pull request #626 from willson556/bugfix/extra-newline
Browse files Browse the repository at this point in the history
Fix #361 - Extra Windows newline in folded scalar.
  • Loading branch information
aaubry committed Aug 6, 2021
2 parents 5f91b4f + ce5c00a commit 35013cd
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 3 deletions.
23 changes: 23 additions & 0 deletions YamlDotNet.Test/Core/EmitterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,7 @@ public void EmptyStringsAreQuoted()

[Theory]
[InlineData("b-carriage-return,b-line-feed\r\nlll", "b-carriage-return,b-line-feed\nlll")]
[InlineData("b-carriage-return,b-line-feed\r\n\r\nlll", "b-carriage-return,b-line-feed\n\nlll")]
[InlineData("b-carriage-return\rlll", "b-carriage-return\nlll")]
[InlineData("b-line-feed\nlll", "b-line-feed\nlll")]
[InlineData("b-next-line\x85lll", "b-next-line\nlll")]
Expand All @@ -379,6 +380,28 @@ public void NewLinesAreNotDuplicatedWhenEmitted(string input, string expected)
StreamEnd);
}

[Theory]
[InlineData("b-carriage-return,b-line-feed\r\nlll", "b-carriage-return,b-line-feed\nlll")]
[InlineData("b-carriage-return,b-line-feed\r\n\r\nlll", "b-carriage-return,b-line-feed\n\nlll")]
[InlineData("b-carriage-return\rlll", "b-carriage-return\nlll")]
[InlineData("b-line-feed\nlll", "b-line-feed\nlll")]
[InlineData("b-next-line\x85lll", "b-next-line\nlll")]
[InlineData("b-line-separator\x2028lll", "b-line-separator\x2028lll")]
[InlineData("b-paragraph-separator\x2029lll", "b-paragraph-separator\x2029lll")]
public void NewLinesAreNotDuplicatedWhenEmittedInFoldedScalar(string input, string expected)
{
var yaml = EmittedTextFrom(StreamOf(DocumentWith(
FoldedScalar(input)
)));

AssertSequenceOfEventsFrom(Yaml.ParserForText(yaml),
StreamStart,
DocumentStart(Implicit),
FoldedScalar(expected),
DocumentEnd(Implicit),
StreamEnd);
}

[Theory]
[InlineData("'.'test")]
[InlineData("'")]
Expand Down
24 changes: 23 additions & 1 deletion YamlDotNet.Test/Serialization/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2001,7 +2001,7 @@ public void ShouldIndentSequences()

Assert.Equal(expected.NormalizeNewLines(), yaml.NormalizeNewLines().TrimNewLines());
}

[Fact]
public void ExampleFromSpecificationIsHandledCorrectlyWithLateDefine()
{
Expand Down Expand Up @@ -2128,6 +2128,23 @@ public void DeserializeCycleWithAnchorsWithDepth(int? depth)
Assert.Same(obj, iterator);
}

[Fact]
public void RoundtripWindowsNewlines()
{
var text = "Line1\r\nLine2\r\nLine3\r\n\r\nLine4";

var sut = new SerializerBuilder().Build();
var dut = new DeserializerBuilder().Build();

using var writer = new StringWriter { NewLine = Environment.NewLine };
sut.Serialize(writer, new StringContainer { Text = text });
var serialized = writer.ToString();

using var reader = new StringReader(serialized);
var roundtrippedText = dut.Deserialize<StringContainer>(reader).Text.NormalizeNewLines();
Assert.Equal(text, roundtrippedText);
}

[TypeConverter(typeof(DoublyConvertedTypeConverter))]
public class DoublyConverted
{
Expand Down Expand Up @@ -2175,6 +2192,11 @@ public class NonSerializable
public string Text { get; set; }
}

public class StringContainer
{
public string Text { get; set; }
}

public class NonSerializableTypeConverter : IYamlTypeConverter
{
public bool Accepts(Type type)
Expand Down
10 changes: 8 additions & 2 deletions YamlDotNet/Core/Emitter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ public void Emit(ParsingEvent @event)

/// <summary>
/// Check if we need to accumulate more events before emitting.
///
///
/// We accumulate extra
/// - 1 event for DOCUMENT-START
/// - 2 events for SEQUENCE-START
Expand Down Expand Up @@ -1256,7 +1256,12 @@ private void WriteFoldedScalar(string value)
var character = value[i];
if (IsBreak(character, out var breakCharacter))
{
if (!previousBreak && !leadingSpaces && character == '\n')
if (character == '\r' && (i + 1) < value.Length && value[i + 1] == '\n')
{
continue;
}

if (!previousBreak && !leadingSpaces && breakCharacter == '\n')
{
var k = 0;
while (i + k < value.Length && IsBreak(value[i + k], out _))
Expand All @@ -1268,6 +1273,7 @@ private void WriteFoldedScalar(string value)
WriteBreak();
}
}

WriteBreak(breakCharacter);
isIndentation = true;
previousBreak = true;
Expand Down

0 comments on commit 35013cd

Please sign in to comment.