Skip to content

Commit 1a28f1f

Browse files
committed
Merge pull request #302 from friism/improve-support-for-parsing-iso8601-dates
Improve support for parsing iso8601 dates
2 parents a15b2a4 + 4f6aef3 commit 1a28f1f

File tree

5 files changed

+115
-81
lines changed

5 files changed

+115
-81
lines changed

RestSharp.Tests/JsonTests.cs

Lines changed: 95 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ namespace RestSharp.Tests
3131
{
3232
public class JsonTests
3333
{
34-
private const string AlternativeCulture = "pt-PT";
34+
private const string AlternativeCulture = "pt-PT";
3535

36-
private const string GuidString = "AC1FC4BC-087A-4242-B8EE-C53EBE9887A5";
36+
private const string GuidString = "AC1FC4BC-087A-4242-B8EE-C53EBE9887A5";
3737

3838
[Fact]
3939
public void Can_Deserialize_4sq_Json_With_Root_Element_Specified()
@@ -190,8 +190,8 @@ public void Can_Deserialize_Elements_to_Nullable_Values()
190190
Assert.Equal(123, output.Id);
191191
Assert.NotNull(output.StartDate);
192192
Assert.Equal(
193-
new DateTime(2010, 2, 21, 9, 35, 00, DateTimeKind.Utc).ToString("u"),
194-
output.StartDate.Value.ToString("u"));
193+
new DateTime(2010, 2, 21, 9, 35, 00, DateTimeKind.Utc),
194+
output.StartDate.Value);
195195
Assert.Equal(new Guid(GuidString), output.UniqueId);
196196
}
197197

@@ -315,14 +315,14 @@ public void Can_Deserialize_With_Default_Root()
315315
Assert.Equal("Foe 2", p.Foes["dict2"].Nickname);
316316
}
317317

318-
[Fact]
319-
public void Can_Deserialize_With_Default_Root_Alternative_Culture()
320-
{
321-
using (new CultureChange(AlternativeCulture))
322-
{
323-
Can_Deserialize_With_Default_Root();
324-
}
325-
}
318+
[Fact]
319+
public void Can_Deserialize_With_Default_Root_Alternative_Culture()
320+
{
321+
using (new CultureChange(AlternativeCulture))
322+
{
323+
Can_Deserialize_With_Default_Root();
324+
}
325+
}
326326

327327
[Fact]
328328
public void Can_Deserialize_Names_With_Underscores_With_Default_Root()
@@ -353,14 +353,14 @@ public void Can_Deserialize_Names_With_Underscores_With_Default_Root()
353353
Assert.Equal("Foe 2", p.Foes["dict2"].Nickname);
354354
}
355355

356-
[Fact]
357-
public void Can_Deserialize_Names_With_Underscores_With_Default_Root_Alternative_Culture()
358-
{
359-
using (new CultureChange(AlternativeCulture))
360-
{
361-
Can_Deserialize_Names_With_Underscores_With_Default_Root();
362-
}
363-
}
356+
[Fact]
357+
public void Can_Deserialize_Names_With_Underscores_With_Default_Root_Alternative_Culture()
358+
{
359+
using (new CultureChange(AlternativeCulture))
360+
{
361+
Can_Deserialize_Names_With_Underscores_With_Default_Root();
362+
}
363+
}
364364

365365
[Fact]
366366
public void Can_Deserialize_Names_With_Dashes_With_Default_Root()
@@ -391,14 +391,14 @@ public void Can_Deserialize_Names_With_Dashes_With_Default_Root()
391391
Assert.Equal("Foe 2", p.Foes["dict2"].Nickname);
392392
}
393393

394-
[Fact]
395-
public void Can_Deserialize_Names_With_Dashes_With_Default_Root_Alternative_Culture()
396-
{
397-
using (new CultureChange(AlternativeCulture))
398-
{
399-
Can_Deserialize_Names_With_Dashes_With_Default_Root();
400-
}
401-
}
394+
[Fact]
395+
public void Can_Deserialize_Names_With_Dashes_With_Default_Root_Alternative_Culture()
396+
{
397+
using (new CultureChange(AlternativeCulture))
398+
{
399+
Can_Deserialize_Names_With_Dashes_With_Default_Root();
400+
}
401+
}
402402

403403
[Fact]
404404
public void Ignore_Protected_Property_That_Exists_In_Data()
@@ -423,22 +423,19 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data()
423423
}
424424

425425
[Fact]
426-
public void Can_Deserialize_TimeSpan()
427-
{
428-
var doc = File.ReadAllText(Path.Combine("SampleData", "timespans.txt"));
429-
var d = new JsonDeserializer();
430-
var response = new RestResponse { Content = doc };
431-
var payload = d.Deserialize<TimeSpanTestStructure>(response);
426+
public void Can_Deserialize_TimeSpan()
427+
{
428+
var payload = GetPayLoad<TimeSpanTestStructure>("timespans.txt");
432429

433-
Assert.Equal(new TimeSpan(468006), payload.Tick);
434-
Assert.Equal(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond);
435-
Assert.Equal(new TimeSpan(0, 0, 8), payload.Second);
436-
Assert.Equal(new TimeSpan(0, 55, 2), payload.Minute);
437-
Assert.Equal(new TimeSpan(21, 30, 7), payload.Hour);
438-
Assert.Null(payload.NullableWithoutValue);
439-
Assert.NotNull(payload.NullableWithValue);
440-
Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value);
441-
}
430+
Assert.Equal(new TimeSpan(468006), payload.Tick);
431+
Assert.Equal(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond);
432+
Assert.Equal(new TimeSpan(0, 0, 8), payload.Second);
433+
Assert.Equal(new TimeSpan(0, 55, 2), payload.Minute);
434+
Assert.Equal(new TimeSpan(21, 30, 7), payload.Hour);
435+
Assert.Null(payload.NullableWithoutValue);
436+
Assert.NotNull(payload.NullableWithValue);
437+
Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value);
438+
}
442439

443440
[Fact]
444441
public void Can_Deserialize_Iso_Json_Dates()
@@ -465,88 +462,97 @@ public void Can_Deserialize_Unix_Json_Dates()
465462
[Fact]
466463
public void Can_Deserialize_JsonNet_Dates()
467464
{
468-
var doc = File.ReadAllText(Path.Combine("SampleData", "person.json.txt"));
469-
var d = new JsonDeserializer();
470-
var response = new RestResponse { Content = doc };
471-
var person = d.Deserialize<PersonForJson>(response);
465+
var person = GetPayLoad<PersonForJson>("person.json.txt");
472466

473467
Assert.Equal(
474-
new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"),
475-
person.StartDate.ToString("u"));
468+
new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc),
469+
person.StartDate);
476470
}
477471

478472
[Fact]
479473
public void Can_Deserialize_DateTime()
480474
{
481-
var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt"));
482-
var d = new JsonDeserializer();
483-
var response = new RestResponse { Content = doc };
484-
var payload = d.Deserialize<DateTimeTestStructure>(response);
475+
var payload = GetPayLoad<DateTimeTestStructure>("datetimes.txt");
485476

486477
Assert.Equal(
487-
new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"),
488-
payload.DateTime.ToString("u"));
478+
new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc),
479+
payload.DateTime);
489480
}
490481

491482
[Fact]
492483
public void Can_Deserialize_Nullable_DateTime_With_Value()
493484
{
494-
var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt"));
495-
var d = new JsonDeserializer();
496-
var response = new RestResponse { Content = doc };
497-
var payload = d.Deserialize<DateTimeTestStructure>(response);
485+
var payload = GetPayLoad<DateTimeTestStructure>("datetimes.txt");
498486

499487
Assert.NotNull(payload.NullableDateTimeWithValue);
500488
Assert.Equal(
501-
new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"),
502-
payload.NullableDateTimeWithValue.Value.ToString("u"));
489+
new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc),
490+
payload.NullableDateTimeWithValue.Value);
503491
}
504492

505493
[Fact]
506494
public void Can_Deserialize_Nullable_DateTime_With_Null()
507495
{
508-
var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt"));
509-
var d = new JsonDeserializer();
510-
var response = new RestResponse { Content = doc };
511-
var payload = d.Deserialize<DateTimeTestStructure>(response);
496+
var payload = GetPayLoad<DateTimeTestStructure>("datetimes.txt");
512497

513498
Assert.Null(payload.NullableDateTimeWithNull);
514499
}
515500

516501
[Fact]
517502
public void Can_Deserialize_DateTimeOffset()
518503
{
519-
var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt"));
520-
var d = new JsonDeserializer();
521-
var response = new RestResponse { Content = doc };
522-
var payload = d.Deserialize<DateTimeTestStructure>(response);
504+
var payload = GetPayLoad<DateTimeTestStructure>("datetimes.txt");
523505

524506
Assert.Equal(
525-
new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"),
526-
payload.DateTimeOffset.ToString("u"));
507+
new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc),
508+
payload.DateTimeOffset);
509+
}
510+
511+
[Fact]
512+
public void Can_Deserialize_Iso8601DateTimeLocal()
513+
{
514+
var payload = GetPayLoad<Iso8601DateTimeTestStructure>("iso8601datetimes.txt");
515+
516+
Assert.Equal(
517+
new DateTime(2012, 7, 19, 10, 23, 25, DateTimeKind.Utc),
518+
payload.DateTimeLocal);
519+
}
520+
521+
[Fact]
522+
public void Can_Deserialize_Iso8601DateTimeZulu()
523+
{
524+
var payload = GetPayLoad<Iso8601DateTimeTestStructure>("iso8601datetimes.txt");
525+
526+
Assert.Equal(
527+
new DateTime(2012, 7, 19, 10, 23, 25, 544, DateTimeKind.Utc),
528+
payload.DateTimeUtc.ToUniversalTime());
529+
}
530+
531+
[Fact]
532+
public void Can_Deserialize_Iso8601DateTimeWithOffset()
533+
{
534+
var payload = GetPayLoad<Iso8601DateTimeTestStructure>("iso8601datetimes.txt");
535+
536+
Assert.Equal(
537+
new DateTime(2012, 7, 19, 10, 23, 25, 544, DateTimeKind.Utc),
538+
payload.DateTimeWithOffset.ToUniversalTime());
527539
}
528540

529541
[Fact]
530542
public void Can_Deserialize_Nullable_DateTimeOffset_With_Value()
531543
{
532-
var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt"));
533-
var d = new JsonDeserializer();
534-
var response = new RestResponse { Content = doc };
535-
var payload = d.Deserialize<DateTimeTestStructure>(response);
544+
var payload = GetPayLoad<DateTimeTestStructure>("datetimes.txt");
536545

537546
Assert.NotNull(payload.NullableDateTimeOffsetWithValue);
538547
Assert.Equal(
539-
new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"),
540-
payload.NullableDateTimeOffsetWithValue.Value.ToString("u"));
548+
new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc),
549+
payload.NullableDateTimeOffsetWithValue);
541550
}
542551

543552
[Fact]
544553
public void Can_Deserialize_Nullable_DateTimeOffset_With_Null()
545554
{
546-
var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt"));
547-
var d = new JsonDeserializer();
548-
var response = new RestResponse { Content = doc };
549-
var payload = d.Deserialize<DateTimeTestStructure>(response);
555+
var payload = GetPayLoad<DateTimeTestStructure>("datetimes.txt");
550556

551557
Assert.Null(payload.NullableDateTimeOffsetWithNull);
552558
}
@@ -759,5 +765,13 @@ public string CreateDynamicJsonStringDictionary ()
759765
doc["ThingBlue"] = new JObject (new JProperty("Name", "ThingBlue"), new JProperty ("Color", "Blue"));
760766
return doc.ToString ();
761767
}
768+
769+
private T GetPayLoad<T>(string fileName)
770+
{
771+
var doc = File.ReadAllText(Path.Combine("SampleData", fileName));
772+
var response = new RestResponse { Content = doc };
773+
var d = new JsonDeserializer();
774+
return d.Deserialize<T>(response);
775+
}
762776
}
763777
}

RestSharp.Tests/RestSharp.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@
112112
<Content Include="SampleData\boolean_from_number.xml">
113113
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
114114
</Content>
115+
<Content Include="SampleData\iso8601datetimes.txt">
116+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
117+
</Content>
115118
<Content Include="SampleData\datetimes.txt">
116119
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
117120
</Content>

RestSharp.Tests/SampleClasses/misc.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,13 @@ public class DateTimeTestStructure
165165
public DateTimeOffset? NullableDateTimeOffsetWithValue { get; set; }
166166
}
167167

168+
public class Iso8601DateTimeTestStructure
169+
{
170+
public DateTime DateTimeLocal { get; set; }
171+
public DateTime DateTimeUtc { get; set; }
172+
public DateTime DateTimeWithOffset { get; set; }
173+
}
174+
168175
public class TimeSpanTestStructure
169176
{
170177
public TimeSpan Tick { get; set; }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"DateTimeLocal": "2012-07-19T10:23:25",
3+
"DateTimeUtc": "2012-07-19T10:23:25.544Z",
4+
"DateTimeWithOffset": "2012-07-19T03:23:25.544-07:00",
5+
}

RestSharp/Extensions/StringExtensions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ private static DateTime ParseFormattedDate(string input, CultureInfo culture)
157157
return date;
158158
}
159159

160+
if (DateTime.TryParse(input, culture, DateTimeStyles.None, out date))
161+
{
162+
return date;
163+
}
164+
160165
return default(DateTime);
161166
}
162167

0 commit comments

Comments
 (0)