diff --git a/RestSharp.Tests/JsonTests.cs b/RestSharp.Tests/JsonTests.cs index 9eb5e310b..9f6329b47 100644 --- a/RestSharp.Tests/JsonTests.cs +++ b/RestSharp.Tests/JsonTests.cs @@ -31,9 +31,9 @@ namespace RestSharp.Tests { public class JsonTests { - private const string AlternativeCulture = "pt-PT"; + private const string AlternativeCulture = "pt-PT"; - private const string GuidString = "AC1FC4BC-087A-4242-B8EE-C53EBE9887A5"; + private const string GuidString = "AC1FC4BC-087A-4242-B8EE-C53EBE9887A5"; [Fact] public void Can_Deserialize_4sq_Json_With_Root_Element_Specified() @@ -190,8 +190,8 @@ public void Can_Deserialize_Elements_to_Nullable_Values() Assert.Equal(123, output.Id); Assert.NotNull(output.StartDate); Assert.Equal( - new DateTime(2010, 2, 21, 9, 35, 00, DateTimeKind.Utc).ToString("u"), - output.StartDate.Value.ToString("u")); + new DateTime(2010, 2, 21, 9, 35, 00, DateTimeKind.Utc), + output.StartDate.Value); Assert.Equal(new Guid(GuidString), output.UniqueId); } @@ -315,14 +315,14 @@ public void Can_Deserialize_With_Default_Root() Assert.Equal("Foe 2", p.Foes["dict2"].Nickname); } - [Fact] - public void Can_Deserialize_With_Default_Root_Alternative_Culture() - { - using (new CultureChange(AlternativeCulture)) - { - Can_Deserialize_With_Default_Root(); - } - } + [Fact] + public void Can_Deserialize_With_Default_Root_Alternative_Culture() + { + using (new CultureChange(AlternativeCulture)) + { + Can_Deserialize_With_Default_Root(); + } + } [Fact] public void Can_Deserialize_Names_With_Underscores_With_Default_Root() @@ -353,14 +353,14 @@ public void Can_Deserialize_Names_With_Underscores_With_Default_Root() Assert.Equal("Foe 2", p.Foes["dict2"].Nickname); } - [Fact] - public void Can_Deserialize_Names_With_Underscores_With_Default_Root_Alternative_Culture() - { - using (new CultureChange(AlternativeCulture)) - { - Can_Deserialize_Names_With_Underscores_With_Default_Root(); - } - } + [Fact] + public void Can_Deserialize_Names_With_Underscores_With_Default_Root_Alternative_Culture() + { + using (new CultureChange(AlternativeCulture)) + { + Can_Deserialize_Names_With_Underscores_With_Default_Root(); + } + } [Fact] public void Can_Deserialize_Names_With_Dashes_With_Default_Root() @@ -391,14 +391,14 @@ public void Can_Deserialize_Names_With_Dashes_With_Default_Root() Assert.Equal("Foe 2", p.Foes["dict2"].Nickname); } - [Fact] - public void Can_Deserialize_Names_With_Dashes_With_Default_Root_Alternative_Culture() - { - using (new CultureChange(AlternativeCulture)) - { - Can_Deserialize_Names_With_Dashes_With_Default_Root(); - } - } + [Fact] + public void Can_Deserialize_Names_With_Dashes_With_Default_Root_Alternative_Culture() + { + using (new CultureChange(AlternativeCulture)) + { + Can_Deserialize_Names_With_Dashes_With_Default_Root(); + } + } [Fact] public void Ignore_Protected_Property_That_Exists_In_Data() @@ -423,22 +423,19 @@ public void Ignore_ReadOnly_Property_That_Exists_In_Data() } [Fact] - public void Can_Deserialize_TimeSpan() - { - var doc = File.ReadAllText(Path.Combine("SampleData", "timespans.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + public void Can_Deserialize_TimeSpan() + { + var payload = GetPayLoad("timespans.txt"); - Assert.Equal(new TimeSpan(468006), payload.Tick); - Assert.Equal(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond); - Assert.Equal(new TimeSpan(0, 0, 8), payload.Second); - Assert.Equal(new TimeSpan(0, 55, 2), payload.Minute); - Assert.Equal(new TimeSpan(21, 30, 7), payload.Hour); - Assert.Null(payload.NullableWithoutValue); - Assert.NotNull(payload.NullableWithValue); - Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value); - } + Assert.Equal(new TimeSpan(468006), payload.Tick); + Assert.Equal(new TimeSpan(0, 0, 0, 0, 125), payload.Millisecond); + Assert.Equal(new TimeSpan(0, 0, 8), payload.Second); + Assert.Equal(new TimeSpan(0, 55, 2), payload.Minute); + Assert.Equal(new TimeSpan(21, 30, 7), payload.Hour); + Assert.Null(payload.NullableWithoutValue); + Assert.NotNull(payload.NullableWithValue); + Assert.Equal(new TimeSpan(21, 30, 7), payload.NullableWithValue.Value); + } [Fact] public void Can_Deserialize_Iso_Json_Dates() @@ -465,50 +462,38 @@ public void Can_Deserialize_Unix_Json_Dates() [Fact] public void Can_Deserialize_JsonNet_Dates() { - var doc = File.ReadAllText(Path.Combine("SampleData", "person.json.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var person = d.Deserialize(response); + var person = GetPayLoad("person.json.txt"); Assert.Equal( - new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"), - person.StartDate.ToString("u")); + new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), + person.StartDate); } [Fact] public void Can_Deserialize_DateTime() { - var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + var payload = GetPayLoad("datetimes.txt"); Assert.Equal( - new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"), - payload.DateTime.ToString("u")); + new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), + payload.DateTime); } [Fact] public void Can_Deserialize_Nullable_DateTime_With_Value() { - var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + var payload = GetPayLoad("datetimes.txt"); Assert.NotNull(payload.NullableDateTimeWithValue); Assert.Equal( - new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"), - payload.NullableDateTimeWithValue.Value.ToString("u")); + new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), + payload.NullableDateTimeWithValue.Value); } [Fact] public void Can_Deserialize_Nullable_DateTime_With_Null() { - var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + var payload = GetPayLoad("datetimes.txt"); Assert.Null(payload.NullableDateTimeWithNull); } @@ -516,37 +501,58 @@ public void Can_Deserialize_Nullable_DateTime_With_Null() [Fact] public void Can_Deserialize_DateTimeOffset() { - var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + var payload = GetPayLoad("datetimes.txt"); Assert.Equal( - new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"), - payload.DateTimeOffset.ToString("u")); + new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), + payload.DateTimeOffset); + } + + [Fact] + public void Can_Deserialize_Iso8601DateTimeLocal() + { + var payload = GetPayLoad("iso8601datetimes.txt"); + + Assert.Equal( + new DateTime(2012, 7, 19, 10, 23, 25, DateTimeKind.Utc), + payload.DateTimeLocal); + } + + [Fact] + public void Can_Deserialize_Iso8601DateTimeZulu() + { + var payload = GetPayLoad("iso8601datetimes.txt"); + + Assert.Equal( + new DateTime(2012, 7, 19, 10, 23, 25, 544, DateTimeKind.Utc), + payload.DateTimeUtc.ToUniversalTime()); + } + + [Fact] + public void Can_Deserialize_Iso8601DateTimeWithOffset() + { + var payload = GetPayLoad("iso8601datetimes.txt"); + + Assert.Equal( + new DateTime(2012, 7, 19, 10, 23, 25, 544, DateTimeKind.Utc), + payload.DateTimeWithOffset.ToUniversalTime()); } [Fact] public void Can_Deserialize_Nullable_DateTimeOffset_With_Value() { - var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + var payload = GetPayLoad("datetimes.txt"); Assert.NotNull(payload.NullableDateTimeOffsetWithValue); Assert.Equal( - new DateTime(2011, 6, 30, 8, 15, 46, DateTimeKind.Utc).ToString("u"), - payload.NullableDateTimeOffsetWithValue.Value.ToString("u")); + new DateTime(2011, 6, 30, 8, 15, 46, 929, DateTimeKind.Utc), + payload.NullableDateTimeOffsetWithValue); } [Fact] public void Can_Deserialize_Nullable_DateTimeOffset_With_Null() { - var doc = File.ReadAllText(Path.Combine("SampleData", "datetimes.txt")); - var d = new JsonDeserializer(); - var response = new RestResponse { Content = doc }; - var payload = d.Deserialize(response); + var payload = GetPayLoad("datetimes.txt"); Assert.Null(payload.NullableDateTimeOffsetWithNull); } @@ -759,5 +765,13 @@ public string CreateDynamicJsonStringDictionary () doc["ThingBlue"] = new JObject (new JProperty("Name", "ThingBlue"), new JProperty ("Color", "Blue")); return doc.ToString (); } + + private T GetPayLoad(string fileName) + { + var doc = File.ReadAllText(Path.Combine("SampleData", fileName)); + var response = new RestResponse { Content = doc }; + var d = new JsonDeserializer(); + return d.Deserialize(response); + } } } diff --git a/RestSharp.Tests/RestSharp.Tests.csproj b/RestSharp.Tests/RestSharp.Tests.csproj index f5c937fde..f2e260c3d 100644 --- a/RestSharp.Tests/RestSharp.Tests.csproj +++ b/RestSharp.Tests/RestSharp.Tests.csproj @@ -112,6 +112,9 @@ Always + + Always + Always diff --git a/RestSharp.Tests/SampleClasses/misc.cs b/RestSharp.Tests/SampleClasses/misc.cs index f8ad380d1..2ebef5925 100644 --- a/RestSharp.Tests/SampleClasses/misc.cs +++ b/RestSharp.Tests/SampleClasses/misc.cs @@ -165,6 +165,13 @@ public class DateTimeTestStructure public DateTimeOffset? NullableDateTimeOffsetWithValue { get; set; } } + public class Iso8601DateTimeTestStructure + { + public DateTime DateTimeLocal { get; set; } + public DateTime DateTimeUtc { get; set; } + public DateTime DateTimeWithOffset { get; set; } + } + public class TimeSpanTestStructure { public TimeSpan Tick { get; set; } diff --git a/RestSharp.Tests/SampleData/iso8601datetimes.txt b/RestSharp.Tests/SampleData/iso8601datetimes.txt new file mode 100644 index 000000000..99c88b1c8 --- /dev/null +++ b/RestSharp.Tests/SampleData/iso8601datetimes.txt @@ -0,0 +1,5 @@ +{ + "DateTimeLocal": "2012-07-19T10:23:25", + "DateTimeUtc": "2012-07-19T10:23:25.544Z", + "DateTimeWithOffset": "2012-07-19T03:23:25.544-07:00", +} \ No newline at end of file diff --git a/RestSharp/Extensions/StringExtensions.cs b/RestSharp/Extensions/StringExtensions.cs index 64a56246d..ded87049e 100644 --- a/RestSharp/Extensions/StringExtensions.cs +++ b/RestSharp/Extensions/StringExtensions.cs @@ -157,6 +157,11 @@ private static DateTime ParseFormattedDate(string input, CultureInfo culture) return date; } + if (DateTime.TryParse(input, culture, DateTimeStyles.None, out date)) + { + return date; + } + return default(DateTime); }