Skip to content

Commit

Permalink
Fix Windows newline in folded scalar. aaubry#361
Browse files Browse the repository at this point in the history
If "\r\n\r\n" was found in an input string, "\r\n\r\n\r\n" would be
output instead of "\r\n\r\n\r\n". Same fix was used as in aaubry#179 for
literal scalars.
  • Loading branch information
willson556 committed Aug 6, 2021
1 parent 25e1975 commit 602301b
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 4 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
26 changes: 25 additions & 1 deletion YamlDotNet.Test/Serialization/SerializationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@

namespace YamlDotNet.Test.Serialization
{
using System.Net;

public class SerializationTests : SerializationTestHelper
{
#region Test Cases
Expand Down Expand Up @@ -1994,7 +1996,7 @@ public void ShouldIndentSequences()

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

[Fact]
public void ExampleFromSpecificationIsHandledCorrectlyWithLateDefine()
{
Expand Down Expand Up @@ -2121,6 +2123,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 @@ -2168,6 +2187,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
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ public class MappingNodeTypeResolver : INodeTypeResolver

public MappingNodeTypeResolver(IDictionary<Type, Type> mappings)
{
if (mappings == null) throw new ArgumentNullException(nameof(mappings));
if (mappings == null)
{
throw new ArgumentNullException(nameof(mappings));
}

foreach (var pair in mappings)
{
Expand Down

0 comments on commit 602301b

Please sign in to comment.