diff --git a/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json.Tests/NodaPeriodTest.cs b/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json.Tests/NodaPeriodTest.cs new file mode 100644 index 0000000..87520b1 --- /dev/null +++ b/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json.Tests/NodaPeriodTest.cs @@ -0,0 +1,82 @@ +using DS.NodaTime.Serialization.Utf8Json; +using Utf8Json; +using Utf8Json.Resolvers; +using Xunit; + +namespace NodaTime.Serialization.Utf8Json.Tests +{ + public class NodaPeriodTest + { + private static readonly IJsonFormatterResolver Resolver = CompositeResolver.Create(new IJsonFormatter[] + { + NodaFormatters.NormalizingIsoPeriodFormatter + }, new[] { StandardResolver.Default }); + + [Fact] + public void Days_InObject() + { + var testObj = new PeriodTestObj + { + Str = "abcdefghijklmnopqrstuvwxyz", + Period = Period.FromDays(3) + }; + var json = JsonSerializer.ToJsonString(testObj, Resolver); + + var deserializedObj = JsonSerializer.Deserialize(json, Resolver); + + Assert.Equal(testObj.Period, deserializedObj.Period); + } + + [Fact] + public void Months_InObject() + { + var testObj = new PeriodTestObj + { + Str = "abcdefghijklmnopqrstuvwxyz", + Period = Period.FromMonths(6) + }; + var json = JsonSerializer.ToJsonString(testObj, Resolver); + + var deserializedObj = JsonSerializer.Deserialize(json, Resolver); + + Assert.Equal(testObj.Period, deserializedObj.Period); + } + + [Fact] + public void Years_InObject() + { + var testObj = new PeriodTestObj + { + Str = "abcdefghijklmnopqrstuvwxyz", + Period = Period.FromYears(10) + }; + var json = JsonSerializer.ToJsonString(testObj, Resolver); + + var deserializedObj = JsonSerializer.Deserialize(json, Resolver); + + Assert.Equal(testObj.Period, deserializedObj.Period); + } + + [Fact] + public void Hours_InObject() + { + var testObj = new PeriodTestObj + { + Str = "abcdefghijklmnopqrstuvwxyz", + Period = Period.FromHours(8) + }; + var json = JsonSerializer.ToJsonString(testObj, Resolver); + + var deserializedObj = JsonSerializer.Deserialize(json, Resolver); + + Assert.Equal(testObj.Period, deserializedObj.Period); + } + } + + public class PeriodTestObj + { + public string Str { get; set; } + + public Period Period { get; set; } + } +} diff --git a/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json/NodaPeriodFormatter.cs b/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json/NodaPeriodFormatter.cs index 92557df..d821d4e 100644 --- a/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json/NodaPeriodFormatter.cs +++ b/src/NodaTime.Serialization.Utf8Json/DS.NodaTime.Serialization.Utf8Json/NodaPeriodFormatter.cs @@ -79,7 +79,7 @@ public Period Deserialize(ref JsonReader reader, IJsonFormatterResolver formatte Exceptions.ThrowInvalidPeriodFormat(str); } - while (str.Array[i] != 'T' && i < str.Count) + while (str.Array[i] != 'T' && i - str.Offset < str.Count) { var amount = NumberConverter.ReadInt32(str.Array, i, out var readCount); i += readCount; @@ -106,7 +106,7 @@ public Period Deserialize(ref JsonReader reader, IJsonFormatterResolver formatte if (str.Array[i++] == 'T') { - while (i < str.Count) + while (i - str.Offset < str.Count) { var amount = NumberConverter.ReadInt64(str.Array, i, out var readCount); i += readCount;