Skip to content

Commit c0ee405

Browse files
authored
Merge branch 'master' into add-odata
2 parents 7a5c39a + aaf4161 commit c0ee405

File tree

4 files changed

+143
-8
lines changed

4 files changed

+143
-8
lines changed

src/Microsoft.OpenApi/Writers/OpenApiWriterBase.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,21 @@ public virtual void WriteValue(long value)
157157
}
158158

159159
/// <summary>
160-
/// Write dateTimeOffset value.
160+
/// Write DateTime value.
161161
/// </summary>
162-
/// <param name="value">The decimal value.</param>
162+
/// <param name="value">The DateTime value.</param>
163+
public virtual void WriteValue(DateTime value)
164+
{
165+
this.WriteValue(value.ToString("o"));
166+
}
167+
168+
/// <summary>
169+
/// Write DateTimeOffset value.
170+
/// </summary>
171+
/// <param name="value">The DateTimeOffset value.</param>
163172
public virtual void WriteValue(DateTimeOffset value)
164173
{
165-
WriteValueSeparator();
166-
Writer.Write(value.ToString("o"));
174+
this.WriteValue(value.ToString("o"));
167175
}
168176

169177
/// <summary>
@@ -218,6 +226,10 @@ public virtual void WriteValue(object value)
218226
{
219227
WriteValue((decimal)value);
220228
}
229+
else if ( type == typeof(DateTime) || type == typeof(DateTime?) )
230+
{
231+
WriteValue((DateTime)value);
232+
}
221233
else if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?))
222234
{
223235
WriteValue((DateTimeOffset)value);

test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections;
56
using System.Collections.Generic;
67
using System.IO;
@@ -134,6 +135,17 @@ public static IEnumerable<object[]> WriteMapAsJsonShouldMatchExpectedTestCasesCo
134135
}
135136
};
136137

138+
// DateTime
139+
yield return new object[]
140+
{
141+
new Dictionary<string, object>
142+
{
143+
["property1"] = new DateTime(1970, 01, 01),
144+
["property2"] = new DateTimeOffset(new DateTime(1970, 01, 01)),
145+
["property3"] = new DateTime(2018, 04, 03),
146+
}
147+
};
148+
137149
// Nested map
138150
yield return new object[]
139151
{
@@ -183,7 +195,12 @@ public static IEnumerable<object[]> WriteMapAsJsonShouldMatchExpectedTestCasesCo
183195

184196
private void WriteValueRecursive(OpenApiJsonWriter writer, object value)
185197
{
186-
if (value == null || value.GetType().IsPrimitive || value is decimal || value is string)
198+
if (value == null
199+
|| value.GetType().IsPrimitive
200+
|| value is decimal
201+
|| value is string
202+
|| value is DateTimeOffset
203+
|| value is DateTime)
187204
{
188205
writer.WriteValue(value);
189206
}
@@ -230,5 +247,49 @@ public void WriteMapAsJsonShouldMatchExpected(IDictionary<string, object> inputM
230247
// Assert
231248
parsedObject.ShouldBeEquivalentTo(expectedObject);
232249
}
250+
251+
public static IEnumerable<object[]> WriteDateTimeAsJsonTestCases()
252+
{
253+
yield return new object[]
254+
{
255+
new DateTimeOffset(2018, 1, 1, 10, 20, 30, TimeSpan.Zero),
256+
};
257+
258+
yield return new object[]
259+
{
260+
new DateTimeOffset(2018, 1, 1, 10, 20, 30, 100, TimeSpan.FromHours(14)),
261+
};
262+
263+
yield return new object[]
264+
{
265+
DateTimeOffset.UtcNow + TimeSpan.FromDays(4)
266+
};
267+
268+
yield return new object[]
269+
{
270+
DateTime.UtcNow + TimeSpan.FromDays(4)
271+
};
272+
}
273+
274+
[Theory]
275+
[MemberData(nameof(WriteDateTimeAsJsonTestCases))]
276+
public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset)
277+
{
278+
// Arrange
279+
var outputString = new StringWriter();
280+
var writer = new OpenApiJsonWriter(outputString);
281+
282+
// Act
283+
writer.WriteValue(dateTimeOffset);
284+
285+
var writtenString = outputString.GetStringBuilder().ToString();
286+
var expectedString = JsonConvert.SerializeObject(dateTimeOffset, new JsonSerializerSettings
287+
{
288+
DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffK",
289+
});
290+
291+
// Assert
292+
writtenString.Should().Be(expectedString);
293+
}
233294
}
234295
}

test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,10 @@ public void WriteOpenApiDateTimeAsJsonWorks(string inputString)
9797
var dateTimeValue = new OpenApiDateTime(input);
9898

9999
var json = WriteAsJson(dateTimeValue);
100+
var expectedJson = "\"" + input.ToString("o") + "\"";
100101

101102
// Assert
102-
json.Should().Be(input.ToString("o"));
103+
json.Should().Be(expectedJson);
103104
}
104105

105106
[Theory]

test/Microsoft.OpenApi.Tests/Writers/OpenApiYamlWriterTests.cs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4+
using System;
45
using System.Collections;
56
using System.Collections.Generic;
67
using System.IO;
@@ -171,6 +172,20 @@ public static IEnumerable<object[]> WriteMapAsYamlShouldMatchExpectedTestCasesCo
171172
property11: ''"
172173
};
173174

175+
// DateTime
176+
yield return new object[]
177+
{
178+
new Dictionary<string, object>
179+
{
180+
["property1"] = new DateTime(1970, 01, 01),
181+
["property2"] = new DateTimeOffset(new DateTime(1970, 01, 01), TimeSpan.FromHours(3)),
182+
["property3"] = new DateTime(2018, 04, 03),
183+
},
184+
@"property1: '1970-01-01T00:00:00.0000000'
185+
property2: '1970-01-01T00:00:00.0000000+03:00'
186+
property3: '2018-04-03T00:00:00.0000000'"
187+
};
188+
174189
// Nested map
175190
yield return new object[]
176191
{
@@ -237,13 +252,18 @@ public static IEnumerable<object[]> WriteMapAsYamlShouldMatchExpectedTestCasesCo
237252

238253
private void WriteValueRecursive(OpenApiYamlWriter writer, object value)
239254
{
240-
if (value == null || value.GetType().IsPrimitive || value is decimal || value is string)
255+
if (value == null
256+
|| value.GetType().IsPrimitive
257+
|| value is decimal
258+
|| value is string
259+
|| value is DateTimeOffset
260+
|| value is DateTime)
241261
{
242262
writer.WriteValue(value);
243263
}
244264
else if (value.GetType().IsGenericType &&
245265
(typeof(IDictionary<,>).IsAssignableFrom(value.GetType().GetGenericTypeDefinition()) ||
246-
typeof(Dictionary<,>).IsAssignableFrom(value.GetType().GetGenericTypeDefinition())))
266+
typeof(Dictionary<,>).IsAssignableFrom(value.GetType().GetGenericTypeDefinition()) ) )
247267
{
248268
writer.WriteStartObject();
249269
foreach (var elementValue in (dynamic)(value))
@@ -284,5 +304,46 @@ public void WriteMapAsYamlShouldMatchExpected(IDictionary<string, object> inputM
284304
expectedYaml = expectedYaml.MakeLineBreaksEnvironmentNeutral();
285305
actualYaml.Should().Be(expectedYaml);
286306
}
307+
308+
public static IEnumerable<object[]> WriteDateTimeAsJsonTestCases()
309+
{
310+
yield return new object[]
311+
{
312+
new DateTimeOffset(2018, 1, 1, 10, 20, 30, TimeSpan.Zero)
313+
};
314+
315+
yield return new object[]
316+
{
317+
new DateTimeOffset(2018, 1, 1, 10, 20, 30, 100, TimeSpan.FromHours(14))
318+
};
319+
320+
yield return new object[]
321+
{
322+
DateTimeOffset.UtcNow + TimeSpan.FromDays(4)
323+
};
324+
325+
yield return new object[]
326+
{
327+
DateTime.UtcNow + TimeSpan.FromDays(4)
328+
};
329+
}
330+
331+
[Theory]
332+
[MemberData(nameof(WriteDateTimeAsJsonTestCases))]
333+
public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset)
334+
{
335+
// Arrange
336+
var outputString = new StringWriter();
337+
var writer = new OpenApiYamlWriter(outputString);
338+
339+
// Act
340+
writer.WriteValue(dateTimeOffset);
341+
342+
var writtenString = outputString.GetStringBuilder().ToString();
343+
var expectedString = " '" + dateTimeOffset.ToString("o") + "'";
344+
345+
// Assert
346+
writtenString.Should().Be(expectedString);
347+
}
287348
}
288349
}

0 commit comments

Comments
 (0)