Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 4bcf8ef

Browse files
committed
Merge pull request #466 from yuinlin/FixXsdTimeSpanDeserialize
FixXsdTimeSpanDeserialize
2 parents 045c65d + 18dcfb1 commit 4bcf8ef

File tree

3 files changed

+60
-39
lines changed

3 files changed

+60
-39
lines changed

src/ServiceStack.Text/Support/TimeSpanConverter.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ public static TimeSpan FromXsdDuration(string xsdDuration)
5656
int hours = 0;
5757
int minutes = 0;
5858
double seconds = 0;
59-
var sign = (xsdDuration.StartsWith("-", StringComparison.Ordinal) ? -1 : 1);
59+
int sign = 1;
60+
61+
if (xsdDuration.StartsWith("-", StringComparison.Ordinal))
62+
{
63+
sign = -1;
64+
xsdDuration = xsdDuration.Substring(1); //strip sign
65+
}
6066

6167
string[] t = xsdDuration.Substring(1).SplitOnFirst('T'); //strip P
6268

tests/ServiceStack.Text.Tests/DateTimeOffsetAndTimeSpanTests.cs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,6 @@ public void Can_serialize_TimeSpan_field()
5959
Serialize(model);
6060
}
6161

62-
[Test]
63-
public void Can_serialize_negative_TimeSpan_field()
64-
{
65-
var period = new TimeSpan(0, 0, -15, 0);
66-
67-
var model = new SampleModel { Id = 1, TimeSpan = period };
68-
var json = JsonSerializer.SerializeToString(model);
69-
Assert.That(json, Is.StringContaining("\"TimeSpan\":\"-PT15M\""));
70-
}
71-
72-
[Test]
73-
public void Can_deserialize_negative_TimeSpan_string()
74-
{
75-
var expectedTimeSpan = new TimeSpan(0, 0, -15, 0);
76-
const string timeSpanString = @"-PT15M";
77-
78-
var timeSpan = JsonSerializer.DeserializeFromString<TimeSpan>(timeSpanString);
79-
Assert.That(timeSpan, Is.EqualTo(expectedTimeSpan));
80-
}
81-
8262
[Test]
8363
public void Can_serialize_TimeSpan_field_with_StandardTimeSpanFormat()
8464
{

tests/ServiceStack.Text.Tests/TimeSpanConverterTests.cs

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,69 @@ namespace ServiceStack.Text.Tests
77
[TestFixture]
88
public class TimeSpanConverterTests
99
{
10+
private readonly TimeSpan oneTick = new TimeSpan(1);
11+
private readonly TimeSpan oneDay = new TimeSpan(1, 0, 0, 0);
12+
private readonly TimeSpan oneHour = new TimeSpan(1, 0, 0);
13+
private readonly TimeSpan oneMinute = new TimeSpan(0, 1, 0);
14+
private readonly TimeSpan oneSecond = new TimeSpan(0, 0, 1);
15+
private readonly TimeSpan oneMilliSecond = new TimeSpan(0, 0, 0, 0, 1);
16+
private readonly TimeSpan oneDayHourMinuteSecondMilliSecond = new TimeSpan(1, 1, 1, 1, 1);
17+
private readonly TimeSpan threeThousandSixHundredAndFiveDays = TimeSpan.FromDays(3605);
18+
private readonly TimeSpan arbitraryTimeSpan = new TimeSpan(1, 2, 3, 4, 567).Add(TimeSpan.FromTicks(1));
19+
1020
[Test]
1121
public void Can_Serialize_TimeSpan()
1222
{
13-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1, 0, 0, 0)), Is.EqualTo("P1D"));
14-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1, 0, 0)), Is.EqualTo("PT1H"));
15-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(0, 1, 0)), Is.EqualTo("PT1M"));
16-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(0, 0, 1)), Is.EqualTo("PT1S"));
17-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(0, 0, 0, 0, 1)), Is.EqualTo("PT0.001S"));
18-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1, 1, 1, 1, 1)), Is.EqualTo("P1DT1H1M1.001S"));
19-
20-
Assert.That(TimeSpanConverter.ToXsdDuration(new TimeSpan(1)), Is.EqualTo("PT0.0000001S"));
23+
Assert.That(TimeSpanConverter.ToXsdDuration(oneDay), Is.EqualTo("P1D"));
24+
Assert.That(TimeSpanConverter.ToXsdDuration(oneHour), Is.EqualTo("PT1H"));
25+
Assert.That(TimeSpanConverter.ToXsdDuration(oneMinute), Is.EqualTo("PT1M"));
26+
Assert.That(TimeSpanConverter.ToXsdDuration(oneSecond), Is.EqualTo("PT1S"));
27+
Assert.That(TimeSpanConverter.ToXsdDuration(oneMilliSecond), Is.EqualTo("PT0.001S"));
28+
Assert.That(TimeSpanConverter.ToXsdDuration(oneDayHourMinuteSecondMilliSecond), Is.EqualTo("P1DT1H1M1.001S"));
29+
Assert.That(TimeSpanConverter.ToXsdDuration(arbitraryTimeSpan), Is.EqualTo("P1DT2H3M4.5670001S"));
30+
31+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneDay), Is.EqualTo("-P1D"));
32+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneHour), Is.EqualTo("-PT1H"));
33+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneMinute), Is.EqualTo("-PT1M"));
34+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneSecond), Is.EqualTo("-PT1S"));
35+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneMilliSecond), Is.EqualTo("-PT0.001S"));
36+
Assert.That(TimeSpanConverter.ToXsdDuration(-arbitraryTimeSpan), Is.EqualTo("-P1DT2H3M4.5670001S"));
37+
38+
Assert.That(TimeSpanConverter.ToXsdDuration(oneTick), Is.EqualTo("PT0.0000001S"));
39+
Assert.That(TimeSpanConverter.ToXsdDuration(-oneTick), Is.EqualTo("-PT0.0000001S"));
40+
2141
Assert.That(TimeSpanConverter.ToXsdDuration(TimeSpan.Zero), Is.EqualTo("PT0S"));
22-
Assert.That(TimeSpanConverter.ToXsdDuration(new DateTime(2010,1,1) - new DateTime(2000,1,1)), Is.EqualTo("P3653D"));
42+
43+
Assert.That(TimeSpanConverter.ToXsdDuration(threeThousandSixHundredAndFiveDays), Is.EqualTo("P3605D"));
44+
Assert.That(TimeSpanConverter.ToXsdDuration(-threeThousandSixHundredAndFiveDays), Is.EqualTo("-P3605D"));
2345
}
2446

2547
[Test]
2648
public void Can_deserialize_TimeSpan()
2749
{
28-
Assert.That(TimeSpanConverter.FromXsdDuration("P1D"), Is.EqualTo(new TimeSpan(1, 0, 0, 0)));
29-
Assert.That(TimeSpanConverter.FromXsdDuration("PT1H"), Is.EqualTo(new TimeSpan(1, 0, 0)));
30-
Assert.That(TimeSpanConverter.FromXsdDuration("PT1M"), Is.EqualTo(new TimeSpan(0, 1, 0)));
31-
Assert.That(TimeSpanConverter.FromXsdDuration("PT1S"), Is.EqualTo(new TimeSpan(0, 0, 1)));
32-
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.001S"), Is.EqualTo(new TimeSpan(0, 0, 0, 0, 1)));
33-
Assert.That(TimeSpanConverter.FromXsdDuration("P1DT1H1M1.001S"), Is.EqualTo(new TimeSpan(1, 1, 1, 1, 1)));
34-
35-
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.0000001S"), Is.EqualTo(new TimeSpan(1)));
50+
Assert.That(TimeSpanConverter.FromXsdDuration("P1D"), Is.EqualTo(oneDay));
51+
Assert.That(TimeSpanConverter.FromXsdDuration("PT1H"), Is.EqualTo(oneHour));
52+
Assert.That(TimeSpanConverter.FromXsdDuration("PT1M"), Is.EqualTo(oneMinute));
53+
Assert.That(TimeSpanConverter.FromXsdDuration("PT1S"), Is.EqualTo(oneSecond));
54+
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.001S"), Is.EqualTo(oneMilliSecond));
55+
Assert.That(TimeSpanConverter.FromXsdDuration("P1DT1H1M1.001S"), Is.EqualTo(oneDayHourMinuteSecondMilliSecond));
56+
Assert.That(TimeSpanConverter.FromXsdDuration("P1DT2H3M4.5670001S"), Is.EqualTo(arbitraryTimeSpan));
57+
58+
Assert.That(TimeSpanConverter.FromXsdDuration("-P1D"), Is.EqualTo(-oneDay));
59+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT1H"), Is.EqualTo(-oneHour));
60+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT1M"), Is.EqualTo(-oneMinute));
61+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT1S"), Is.EqualTo(-oneSecond));
62+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT0.001S"), Is.EqualTo(-oneMilliSecond));
63+
Assert.That(TimeSpanConverter.FromXsdDuration("-P1DT1H1M1.001S"), Is.EqualTo(-oneDayHourMinuteSecondMilliSecond));
64+
Assert.That(TimeSpanConverter.FromXsdDuration("-P1DT2H3M4.5670001S"), Is.EqualTo(-arbitraryTimeSpan));
65+
66+
Assert.That(TimeSpanConverter.FromXsdDuration("PT0.0000001S"), Is.EqualTo(oneTick));
67+
Assert.That(TimeSpanConverter.FromXsdDuration("-PT0.0000001S"), Is.EqualTo(-oneTick));
68+
3669
Assert.That(TimeSpanConverter.FromXsdDuration("PT0S"), Is.EqualTo(TimeSpan.Zero));
37-
Assert.That(TimeSpanConverter.FromXsdDuration("P3650D"), Is.EqualTo(TimeSpan.FromDays(3650)));
70+
71+
Assert.That(TimeSpanConverter.FromXsdDuration("P3605D"), Is.EqualTo(threeThousandSixHundredAndFiveDays));
72+
Assert.That(TimeSpanConverter.FromXsdDuration("-P3605D"), Is.EqualTo(-threeThousandSixHundredAndFiveDays));
3873
}
3974
}
4075
}

0 commit comments

Comments
 (0)