Skip to content

Commit a0d770c

Browse files
committed
Merge branch 'master' of github.com:aaubry/YamlDotNet into ec-1018-nullablefixes
2 parents 15bbfbe + d6a3c1f commit a0d770c

File tree

4 files changed

+62
-11
lines changed

4 files changed

+62
-11
lines changed

YamlDotNet.Test/Serialization/DeserializerTest.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,27 @@ public void UnquotedStringTypeDeserialization_RegularNumbers(object expected)
258258
Assert.Equal(expected, resultDict["Value"]);
259259
}
260260

261+
[Theory]
262+
[InlineData(System.Byte.MinValue)]
263+
[InlineData(System.Byte.MaxValue)]
264+
[InlineData(System.Int16.MinValue)]
265+
[InlineData(System.Int16.MaxValue)]
266+
[InlineData(System.Int32.MinValue)]
267+
[InlineData(System.Int32.MaxValue)]
268+
[InlineData(System.Int64.MinValue)]
269+
[InlineData(System.Int64.MaxValue)]
270+
public void UnquotedStringTypeDeserialization_HexNumbers(object expected)
271+
{
272+
var deserializer = new DeserializerBuilder()
273+
.WithAttemptingUnquotedStringTypeDeserialization().Build();
274+
275+
var yaml = $"Value: 0x{expected:X2}";
276+
277+
var resultDict = deserializer.Deserialize<IDictionary<string, object>>(yaml);
278+
Assert.True(resultDict.ContainsKey("Value"));
279+
Assert.Equal(expected, resultDict["Value"]);
280+
}
281+
261282
[Theory]
262283
[InlineData(".nan", System.Single.NaN)]
263284
[InlineData(".NaN", System.Single.NaN)]

YamlDotNet.Test/Serialization/SerializationTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
// SOFTWARE.
2121

2222
using System;
23+
using System.CodeDom.Compiler;
2324
using System.Collections;
2425
using System.Collections.Concurrent;
2526
using System.Collections.Generic;
@@ -329,6 +330,35 @@ public void SerializeWithCRNewLine()
329330
result.Should().Be(expectedResult);
330331
}
331332

333+
334+
/// <summary>
335+
/// Tests the serialization of a dictionary containing a list of strings using IndentedTextWriter.
336+
/// </summary>
337+
[Fact]
338+
public void SerializeWithTabs()
339+
{
340+
var tabString = " ";
341+
using var writer = new StringWriter();
342+
using var indentedTextWriter = new IndentedTextWriter(writer, tabString) { Indent = 2 };
343+
344+
//create a dictionary with a list of strings to test the tabbed serialization
345+
var items = new List<string> { "item 1", "item 2" };
346+
var list = new Dictionary<string, List<string>> { { "key", items } };
347+
348+
SerializerBuilder
349+
.Build()
350+
.Serialize(indentedTextWriter, list);
351+
352+
//split serialized output into lines
353+
var lines = indentedTextWriter.InnerWriter.ToString().Split(new[] { Environment.NewLine }, StringSplitOptions.None);
354+
355+
//expected indentation
356+
var indent = string.Join(string.Empty, Enumerable.Repeat(tabString, indentedTextWriter.Indent).ToList());
357+
358+
//check that the serialized lines (excluding the first and last) start with the expected indentation
359+
lines.Skip(1).Take(lines.Length - 2).Where(element => element.StartsWith(indent)).Should().HaveCount(items.Count);
360+
}
361+
332362
[Fact]
333363
public void DeserializeExplicitType()
334364
{

YamlDotNet/Core/Emitter.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ public class Emitter : IEmitter
6767
private bool isIndentation;
6868
private readonly bool forceIndentLess;
6969
private readonly bool useUtf16SurrogatePair;
70-
private readonly string newLine;
7170

7271
private bool isDocumentEndWritten;
7372

@@ -150,9 +149,9 @@ public Emitter(TextWriter output, EmitterSettings settings)
150149
this.skipAnchorName = settings.SkipAnchorName;
151150
this.forceIndentLess = !settings.IndentSequences;
152151
this.useUtf16SurrogatePair = settings.UseUtf16SurrogatePairs;
153-
this.newLine = settings.NewLine;
154152

155153
this.output = output;
154+
this.output.NewLine = settings.NewLine;
156155
this.outputUsesUnicodeEncoding = IsUnicode(output.Encoding);
157156
}
158157

@@ -1937,7 +1936,7 @@ private void WriteBreak(char breakCharacter = '\n')
19371936
{
19381937
if (breakCharacter == '\n')
19391938
{
1940-
output.Write(newLine);
1939+
output.WriteLine();
19411940
}
19421941
else
19431942
{

YamlDotNet/Serialization/NodeDeserializers/ScalarNodeDeserializer.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -354,20 +354,21 @@ private static object CastInteger(ulong number, TypeCode typeCode)
354354
case "FALSE":
355355
return false;
356356
default:
357-
if (Regex.IsMatch(v, "0x[0-9a-fA-F]+")) //base16 number
357+
if (Regex.IsMatch(v, "^0x[0-9a-fA-F]+$")) //base16 number
358358
{
359-
if (TryAndSwallow(() => Convert.ToByte(v, 16), out result)) { }
360-
else if (TryAndSwallow(() => Convert.ToInt16(v, 16), out result)) { }
361-
else if (TryAndSwallow(() => Convert.ToInt32(v, 16), out result)) { }
362-
else if (TryAndSwallow(() => Convert.ToInt64(v, 16), out result)) { }
363-
else if (TryAndSwallow(() => Convert.ToUInt64(v, 16), out result)) { }
359+
v = v.Substring(2);
360+
if (byte.TryParse(v, NumberStyles.AllowHexSpecifier, formatter.NumberFormat, out var byteValue)) { result = byteValue; }
361+
else if (short.TryParse(v, NumberStyles.AllowHexSpecifier, formatter.NumberFormat, out var shortValue)) { result = shortValue; }
362+
else if (int.TryParse(v, NumberStyles.AllowHexSpecifier, formatter.NumberFormat, out var intValue)) { result = intValue; }
363+
else if (long.TryParse(v, NumberStyles.AllowHexSpecifier, formatter.NumberFormat, out var longValue)) { result = longValue; }
364+
else if (ulong.TryParse(v, NumberStyles.AllowHexSpecifier, formatter.NumberFormat, out var ulongValue)) { result = ulongValue; }
364365
else
365366
{
366367
//we couldn't parse it, default to a string. It's probably to big.
367368
result = v;
368369
}
369370
}
370-
else if (Regex.IsMatch(v, "0o[0-9a-fA-F]+")) //base8 number
371+
else if (Regex.IsMatch(v, "^0o[0-9a-fA-F]+$")) //base8 number
371372
{
372373
if (TryAndSwallow(() => Convert.ToByte(v, 8), out result)) { }
373374
else if (TryAndSwallow(() => Convert.ToInt16(v, 8), out result)) { }
@@ -380,7 +381,7 @@ private static object CastInteger(ulong number, TypeCode typeCode)
380381
result = v;
381382
}
382383
}
383-
else if (Regex.IsMatch(v, @"[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?")) //regular number
384+
else if (Regex.IsMatch(v, @"^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$")) //regular number
384385
{
385386
if (byte.TryParse(v, NumberStyles.Integer, formatter.NumberFormat, out var byteValue)) { result = byteValue; }
386387
else if (short.TryParse(v, NumberStyles.Integer, formatter.NumberFormat, out var shortValue)) { result = shortValue; }

0 commit comments

Comments
 (0)