Skip to content

Commit 96a2ba7

Browse files
committed
Add a non-local DateTimeOffset to serialization tests
Use TimeZoneInfo for DateTime conversions
1 parent d847d5d commit 96a2ba7

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

src/Tests/Nest.Tests.Unit/Internals/Serialize/DateTimeZoneHandlingTests.cs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public void SetUp()
4444
DepartureDateLocal = departureDateLocal,
4545
DepartureDateOffset = new DateTimeOffset(2013, 1, 21, 0, 0, 0, _timeSpanOffset),
4646
DepartureDateOffsetZero = new DateTimeOffset(2013, 1, 21, 0, 0, 0, TimeSpan.Zero),
47+
DepartureDateOffsetNonLocal = new DateTimeOffset(2013, 1, 21, 0, 0, 0, TimeSpan.FromHours(-6.25)),
4748
};
4849

4950
_offset = string.Format("{0}:{1}",
@@ -69,6 +70,7 @@ public void RoundTripKind()
6970
""DepartureDateLocal"": ""2013-01-21T00:00:00" + _offset + @""",
7071
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
7172
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
73+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
7274
}";
7375
jsonWithRoundtripTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithRoundtripTimeZone);
7476

@@ -80,6 +82,7 @@ public void RoundTripKind()
8082
flight.DepartureDateUtc.Kind.Should().Be(_flight.DepartureDateUtc.Kind);
8183
flight.DepartureDateOffset.Offset.Should().Be(_flight.DepartureDateOffset.Offset);
8284
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
85+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
8386
}
8487

8588
/// <remarks>
@@ -94,9 +97,8 @@ public void Utc()
9497
{
9598
var dateTimeZoneHandling = DateTimeZoneHandling.Utc;
9699
var dateTimeKind = DateTimeKind.Utc;
97-
98-
var departureDateLocal = _flight.DepartureDateUtc.Subtract(_timeSpanOffset);
99-
var depatureDateLocalString = departureDateLocal.ToString("yyyy-MM-ddTHH:mm:ssZ");
100+
var departureDateLocalInUtc = TimeZoneInfo.ConvertTimeToUtc(_flight.DepartureDateLocal, TimeZoneInfo.Local);
101+
var depatureDateLocalString = departureDateLocalInUtc.ToString("yyyy-MM-ddTHH:mm:ssZ");
100102

101103
var jsonWithUtcTimeZone = this.SerializeUsing(_flight, dateTimeZoneHandling);
102104
var expected = @" {
@@ -105,6 +107,7 @@ public void Utc()
105107
""DepartureDateLocal"": """ + depatureDateLocalString + @""",
106108
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
107109
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
110+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
108111
}";
109112
jsonWithUtcTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithUtcTimeZone);
110113

@@ -115,7 +118,7 @@ public void Utc()
115118

116119
// The deserialized local will be the UTC DateTime + the local timezone offset,
117120
// AND with a DateTimeKind of UTC when deserialized.
118-
flight.DepartureDateLocal.Should().Be(departureDateLocal);
121+
flight.DepartureDateLocal.Should().Be(departureDateLocalInUtc);
119122
flight.DepartureDateLocal.Kind.Should().Be(dateTimeKind);
120123

121124
flight.DepartureDateUtc.Should().Be(_flight.DepartureDateUtc);
@@ -126,6 +129,9 @@ public void Utc()
126129

127130
flight.DepartureDateOffsetZero.Should().Be(_flight.DepartureDateOffsetZero);
128131
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
132+
133+
flight.DepartureDateOffsetNonLocal.Should().Be(_flight.DepartureDateOffsetNonLocal);
134+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
129135
}
130136

131137
/// <remarks>
@@ -144,6 +150,7 @@ public void Unspecified()
144150
""DepartureDateLocal"": ""2013-01-21T00:00:00"",
145151
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
146152
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
153+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
147154
}";
148155
jsonWithUnspecifiedTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithUnspecifiedTimeZone);
149156

@@ -155,6 +162,7 @@ public void Unspecified()
155162
flight.DepartureDateUtc.Kind.Should().Be(dateTimeKind);
156163
flight.DepartureDateOffset.Offset.Should().Be(_flight.DepartureDateOffset.Offset);
157164
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
165+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
158166
}
159167

160168
/// <remarks>
@@ -169,8 +177,8 @@ public void Local()
169177
var dateTimeKind = DateTimeKind.Local;
170178

171179
var jsonWithLocalTimeZone = this.SerializeUsing(_flight, dateTimeZoneHandling);
172-
var departureDateLocal = _flight.DepartureDateUtc.Add(_timeSpanOffset);
173-
var depatureDateLocalString = departureDateLocal.ToString("yyyy-MM-ddTHH:mm:ss");
180+
var departureDateUtcInLocal = TimeZoneInfo.ConvertTimeFromUtc(_flight.DepartureDateUtc, TimeZoneInfo.Local);
181+
var depatureDateLocalString = departureDateUtcInLocal.ToString("yyyy-MM-ddTHH:mm:ss");
174182

175183
var expected = @"
176184
{
@@ -179,6 +187,7 @@ public void Local()
179187
""DepartureDateLocal"": ""2013-01-21T00:00:00" + _offset + @""",
180188
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
181189
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
190+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
182191
}";
183192
jsonWithLocalTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithLocalTimeZone);
184193

@@ -197,14 +206,17 @@ public void Local()
197206
//
198207
// Calling .ToUniversalTime() will return DepartureDateUtc with correct
199208
// UTC datetime and DateTimeKind.Utc
200-
flight.DepartureDateUtc.Should().Be(departureDateLocal);
209+
flight.DepartureDateUtc.Should().Be(departureDateUtcInLocal);
201210
flight.DepartureDateUtc.Kind.Should().Be(dateTimeKind);
202211

203212
flight.DepartureDateOffset.Should().Be(_flight.DepartureDateOffset);
204213
flight.DepartureDateOffset.Offset.Should().Be(_flight.DepartureDateOffset.Offset);
205214

206215
flight.DepartureDateOffsetZero.Should().Be(_flight.DepartureDateOffsetZero);
207216
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
217+
218+
flight.DepartureDateOffsetNonLocal.Should().Be(_flight.DepartureDateOffsetNonLocal);
219+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
208220
}
209221

210222
private string SerializeUsing(Flight flight, DateTimeZoneHandling handling)
@@ -215,7 +227,6 @@ private string SerializeUsing(Flight flight, DateTimeZoneHandling handling)
215227
.SetDefaultPropertyNameInferrer(p => p)
216228
.SetJsonSerializerSettingsModifier(s =>
217229
{
218-
s.DateFormatHandling = DateFormatHandling.IsoDateFormat;
219230
s.DateTimeZoneHandling = handling;
220231
s.Formatting = Formatting.Indented;
221232
s.ContractResolver = new DefaultDateTimeContractResolver(settings);
@@ -230,7 +241,6 @@ private Flight DeserializeUsing(string json, DateTimeZoneHandling handling)
230241
.SetDefaultPropertyNameInferrer(p => p)
231242
.SetJsonSerializerSettingsModifier(s =>
232243
{
233-
s.DateFormatHandling = DateFormatHandling.IsoDateFormat;
234244
s.DateTimeZoneHandling = handling;
235245
});
236246
var client = new ElasticClient(settings);

src/Tests/Nest.Tests.Unit/Internals/Serialize/Flight.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@ internal class Flight
99
public DateTime DepartureDateLocal { get; set; }
1010
public DateTimeOffset DepartureDateOffset { get; set; }
1111
public DateTimeOffset DepartureDateOffsetZero { get; set; }
12+
public DateTimeOffset DepartureDateOffsetNonLocal { get; set; }
1213

1314
protected bool Equals(Flight other)
1415
{
1516
return DepartureDate.Equals(other.DepartureDate) &&
1617
DepartureDateUtc.Equals(other.DepartureDateUtc) &&
1718
DepartureDateLocal.Equals(other.DepartureDateLocal) &&
1819
DepartureDateOffset.Equals(other.DepartureDateOffset) &&
19-
DepartureDateOffsetZero.Equals(other.DepartureDateOffsetZero);
20+
DepartureDateOffsetZero.Equals(other.DepartureDateOffsetZero) &&
21+
DepartureDateOffsetNonLocal.Equals(other.DepartureDateOffsetNonLocal);
2022
}
2123

2224
public override bool Equals(object obj)
@@ -36,6 +38,7 @@ public override int GetHashCode()
3638
hashCode = (hashCode * 397) ^ DepartureDateLocal.GetHashCode();
3739
hashCode = (hashCode * 397) ^ DepartureDateOffset.GetHashCode();
3840
hashCode = (hashCode * 397) ^ DepartureDateOffsetZero.GetHashCode();
41+
hashCode = (hashCode * 397) ^ DepartureDateOffsetNonLocal.GetHashCode();
3942
return hashCode;
4043
}
4144
}

src/Tests/Nest.Tests.Unit/Internals/Serialize/IsoDateTimeConverterHandlingTests.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public void SetUp()
3131
DepartureDateLocal = departureDateLocal,
3232
DepartureDateOffset = new DateTimeOffset(2013, 1, 21, 0, 0, 0, _timeSpanOffset),
3333
DepartureDateOffsetZero = new DateTimeOffset(2013, 1, 21, 0, 0, 0, TimeSpan.Zero),
34+
DepartureDateOffsetNonLocal = new DateTimeOffset(2013, 1, 21, 0, 0, 0, TimeSpan.FromHours(-6.25)),
3435
};
3536

3637
_offset = string.Format("{0}:{1}",
@@ -57,6 +58,7 @@ public void RoundTripKind()
5758
""DepartureDateLocal"": ""2013-01-21T00:00:00" + _offset + @""",
5859
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
5960
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
61+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
6062
}";
6163
jsonWithRoundtripTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithRoundtripTimeZone);
6264

@@ -68,6 +70,7 @@ public void RoundTripKind()
6870
flight.DepartureDateUtc.Kind.Should().Be(_flight.DepartureDateUtc.Kind);
6971
flight.DepartureDateOffset.Offset.Should().Be(_flight.DepartureDateOffset.Offset);
7072
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
73+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
7174
}
7275

7376
/// <remarks>
@@ -81,15 +84,16 @@ public void Utc()
8184
{
8285
var dateTimeZoneHandling = DateTimeZoneHandling.Utc;
8386
var dateTimeKind = DateTimeKind.Utc;
84-
var departureDateLocal = _flight.DepartureDateUtc.Subtract(_timeSpanOffset);
85-
87+
var departureDateLocalInUtc = TimeZoneInfo.ConvertTimeToUtc(_flight.DepartureDateLocal, TimeZoneInfo.Local);
88+
8689
var jsonWithUtcTimeZone = this.SerializeUsing(dateTimeZoneHandling);
8790
var expected = @" {
8891
""DepartureDate"": ""2013-01-21T00:00:00Z"",
8992
""DepartureDateUtc"": ""2013-01-21T00:00:00Z"",
9093
""DepartureDateLocal"": ""2013-01-21T00:00:00" + _offset + @""",
9194
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
9295
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
96+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
9397
}";
9498
jsonWithUtcTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithUtcTimeZone);
9599

@@ -103,7 +107,7 @@ public void Utc()
103107
//
104108
// Calling .ToLocalTime() will return DepartureDateLocal with correct
105109
// local datetime and DateTimeKind.Local
106-
flight.DepartureDateLocal.Should().Be(departureDateLocal);
110+
flight.DepartureDateLocal.Should().Be(departureDateLocalInUtc);
107111
flight.DepartureDateLocal.Kind.Should().Be(dateTimeKind);
108112

109113
flight.DepartureDateUtc.Should().Be(_flight.DepartureDateUtc);
@@ -114,6 +118,9 @@ public void Utc()
114118

115119
flight.DepartureDateOffsetZero.Should().Be(_flight.DepartureDateOffsetZero);
116120
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
121+
122+
flight.DepartureDateOffsetNonLocal.Should().Be(_flight.DepartureDateOffsetNonLocal);
123+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
117124
}
118125

119126
[Test]
@@ -129,6 +136,7 @@ public void Unspecified()
129136
""DepartureDateLocal"": ""2013-01-21T00:00:00"",
130137
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
131138
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
139+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
132140
}";
133141
jsonWithUnspecifiedTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithUnspecifiedTimeZone);
134142

@@ -140,6 +148,7 @@ public void Unspecified()
140148
flight.DepartureDateUtc.Kind.Should().Be(dateTimeKind);
141149
flight.DepartureDateOffset.Offset.Should().Be(_flight.DepartureDateOffset.Offset);
142150
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
151+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
143152
}
144153

145154
[Test]
@@ -149,7 +158,7 @@ public void Local()
149158
var dateTimeKind = DateTimeKind.Local;
150159

151160
var jsonWithLocalTimeZone = this.SerializeUsing(dateTimeZoneHandling);
152-
var departureDateLocal = _flight.DepartureDateUtc.Add(_timeSpanOffset);
161+
var departureDateUtcInLocal = TimeZoneInfo.ConvertTimeFromUtc(_flight.DepartureDateUtc, TimeZoneInfo.Local);
153162

154163
var expected = @"
155164
{
@@ -158,6 +167,7 @@ public void Local()
158167
""DepartureDateLocal"": ""2013-01-21T00:00:00" + _offset + @""",
159168
""DepartureDateOffset"": ""2013-01-21T00:00:00" + _offset + @""",
160169
""DepartureDateOffsetZero"": ""2013-01-21T00:00:00+00:00"",
170+
""DepartureDateOffsetNonLocal"": ""2013-01-21T00:00:00-06:15""
161171
}";
162172
jsonWithLocalTimeZone.JsonEquals(expected).Should().BeTrue("{0}", jsonWithLocalTimeZone);
163173

@@ -175,14 +185,17 @@ public void Local()
175185
//
176186
// Calling .ToUniversalTime() will return DepartureDateUtc with correct
177187
// UTC datetime and DateTimeKind.Utc
178-
flight.DepartureDateUtc.Should().Be(departureDateLocal);
188+
flight.DepartureDateUtc.Should().Be(departureDateUtcInLocal);
179189
flight.DepartureDateUtc.Kind.Should().Be(dateTimeKind);
180190

181191
flight.DepartureDateOffset.Should().Be(_flight.DepartureDateOffset);
182192
flight.DepartureDateOffset.Offset.Should().Be(_flight.DepartureDateOffset.Offset);
183193

184194
flight.DepartureDateOffsetZero.Should().Be(_flight.DepartureDateOffsetZero);
185195
flight.DepartureDateOffsetZero.Offset.Should().Be(_flight.DepartureDateOffsetZero.Offset);
196+
197+
flight.DepartureDateOffsetNonLocal.Should().Be(_flight.DepartureDateOffsetNonLocal);
198+
flight.DepartureDateOffsetNonLocal.Offset.Should().Be(_flight.DepartureDateOffsetNonLocal.Offset);
186199
}
187200

188201
private string SerializeUsing(DateTimeZoneHandling handling)

0 commit comments

Comments
 (0)