@@ -51,16 +51,25 @@ public class DateTimeTests
5151 [ TestMethod ]
5252 [ DynamicData ( nameof ( GetTestData ) , DynamicDataSourceType . Method ,
5353 DynamicDataDisplayName = nameof ( GetCustomDynamicDataDisplayName ) ) ]
54- public void TestXenDateTimeConverter ( string dateString , DateTime expectedDateTime )
54+ public void TestXenDateTimeConverter ( string dateString , DateTime expectedDateTime , DateTimeKind expectedDateTimeKind )
5555 {
5656 try
5757 {
5858 var jsonDateString = "{ \" Date\" : \" " + dateString + "\" }" ;
59- var actualDateTime = JsonConvert . DeserializeObject < DateTimeObject > ( jsonDateString , _settings ) ;
59+ var actualDateTimeObject = JsonConvert . DeserializeObject < DateTimeObject > ( jsonDateString , _settings ) ;
6060
61- Assert . IsNotNull ( actualDateTime , $ "Failed to convert '{ dateString } '") ;
62- Assert . IsTrue ( expectedDateTime . Equals ( actualDateTime . Date ) ,
63- $ "Conversion of '{ dateString } ' resulted in an incorrect DateTime value") ;
61+
62+ Assert . IsNotNull ( actualDateTimeObject ? . Date , $ "Failed to convert '{ dateString } '") ;
63+ var actualDateTime = actualDateTimeObject . Date ;
64+ Assert . IsTrue ( expectedDateTimeKind . Equals ( actualDateTime . Kind ) ) ;
65+
66+ // expected times are in UTC to ensure these tests do
67+ // not fail when running in other timezones
68+ if ( expectedDateTimeKind == DateTimeKind . Local )
69+ actualDateTime = actualDateTime . ToUniversalTime ( ) ;
70+
71+ Assert . IsTrue ( expectedDateTime . Equals ( actualDateTime ) ,
72+ $ "Conversion of '{ dateString } ' resulted in an incorrect DateTime value. Expected '{ expectedDateTime } but instead received '{ actualDateTime } '") ;
6473 }
6574 catch ( Exception ex )
6675 {
@@ -78,62 +87,62 @@ public static string GetCustomDynamicDataDisplayName(MethodInfo methodInfo, obje
7887 public static IEnumerable < object [ ] > GetTestData ( )
7988 {
8089 // no dashes, no colons
81- yield return new object [ ] { "20220101T123045" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Unspecified ) } ;
82- yield return new object [ ] { "20220101T123045Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) } ;
83- yield return new object [ ] { "20220101T123045+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
84- yield return new object [ ] { "20220101T123045+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
85- yield return new object [ ] { "20220101T123045+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
90+ yield return new object [ ] { "20220101T123045" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Unspecified } ;
91+ yield return new object [ ] { "20220101T123045Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Utc } ;
92+ yield return new object [ ] { "20220101T123045+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
93+ yield return new object [ ] { "20220101T123045+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
94+ yield return new object [ ] { "20220101T123045+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
8695
8796 yield return new object [ ]
88- { "20220101T123045.123" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Unspecified ) } ;
97+ { "20220101T123045.123" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Unspecified } ;
8998 yield return new object [ ]
90- { "20220101T123045.123Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) } ;
99+ { "20220101T123045.123Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Utc } ;
91100 yield return new object [ ]
92- { "20220101T123045.123+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
101+ { "20220101T123045.123+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
93102 yield return new object [ ]
94- { "20220101T123045.123+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
103+ { "20220101T123045.123+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
95104 yield return new object [ ]
96- { "20220101T123045.123+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
105+ { "20220101T123045.123+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
97106
98107 // no dashes, with colons
99108 yield return new object [ ]
100- { "20220101T12:30:45" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Unspecified ) } ;
101- yield return new object [ ] { "20220101T12:30:45Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) } ;
102- yield return new object [ ] { "20220101T12:30:45+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
103- yield return new object [ ] { "20220101T12:30:45+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
109+ { "20220101T12:30:45" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Unspecified } ;
110+ yield return new object [ ] { "20220101T12:30:45Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Utc } ;
111+ yield return new object [ ] { "20220101T12:30:45+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
112+ yield return new object [ ] { "20220101T12:30:45+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
104113 yield return new object [ ]
105- { "20220101T12:30:45+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
114+ { "20220101T12:30:45+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
106115
107116 yield return new object [ ]
108- { "20220101T12:30:45.123" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Unspecified ) } ;
117+ { "20220101T12:30:45.123" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Unspecified } ;
109118 yield return new object [ ]
110- { "20220101T12:30:45.123Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) } ;
119+ { "20220101T12:30:45.123Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Utc } ;
111120 yield return new object [ ]
112- { "20220101T12:30:45.123+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
121+ { "20220101T12:30:45.123+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
113122 yield return new object [ ]
114- { "20220101T12:30:45.123+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
123+ { "20220101T12:30:45.123+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
115124 yield return new object [ ]
116- { "20220101T12:30:45.123+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
125+ { "20220101T12:30:45.123+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
117126
118127 // dashes and colons
119128 yield return new object [ ]
120- { "2022-01-01T12:30:45" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Unspecified ) } ;
121- yield return new object [ ] { "2022-01-01T12:30:45Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) } ;
122- yield return new object [ ] { "2022-01-01T12:30:45+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
129+ { "2022-01-01T12:30:45" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Unspecified } ;
130+ yield return new object [ ] { "2022-01-01T12:30:45Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Utc } ;
131+ yield return new object [ ] { "2022-01-01T12:30:45+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
123132 yield return new object [ ]
124- { "2022-01-01T12:30:45+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
133+ { "2022-01-01T12:30:45+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
125134 yield return new object [ ]
126- { "2022-01-01T12:30:45+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Local ) } ;
135+ { "2022-01-01T12:30:45+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
127136
128137 yield return new object [ ]
129- { "2022-01-01T12:30:45.123" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Unspecified ) } ;
138+ { "2022-01-01T12:30:45.123" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Unspecified } ;
130139 yield return new object [ ]
131- { "2022-01-01T12:30:45.123Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) } ;
140+ { "2022-01-01T12:30:45.123Z" , new DateTime ( 2022 , 1 , 1 , 12 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Utc } ;
132141 yield return new object [ ]
133- { "2022-01-01T12:30:45.123+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
142+ { "2022-01-01T12:30:45.123+03" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
134143 yield return new object [ ]
135- { "2022-01-01T12:30:45.123+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
144+ { "2022-01-01T12:30:45.123+0300" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
136145 yield return new object [ ]
137- { "2022-01-01T12:30:45.123+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Local ) } ;
146+ { "2022-01-01T12:30:45.123+03:00" , new DateTime ( 2022 , 1 , 1 , 9 , 30 , 45 , 123 , DateTimeKind . Utc ) , DateTimeKind . Local } ;
138147 }
139148}
0 commit comments