Skip to content

Commit

Permalink
Fix DateFormatConverter for System.Text.Json (#1490)
Browse files Browse the repository at this point in the history
  • Loading branch information
AroglDarthu committed Feb 5, 2022
1 parent 022ba27 commit 932884e
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1461,6 +1461,39 @@ public async Task When_definition_contains_date_converter_should_be_added_for_da
AssertCompile(code);
}

[Fact]
public async Task When_definition_contains_date_and_use_system_text_json_then_converter_should_be_added_for_datetime()
{
//// Arrange
var json =
@"{
""type"": ""object"",
""properties"": {
""a"": {
""type"": ""string"",
""format"": ""date""
}
}
}";
var schema = await JsonSchema.FromJsonAsync(json);

//// Act
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings
{
ClassStyle = CSharpClassStyle.Poco,
SchemaType = SchemaType.Swagger2,
DateType = "System.DateTime",
JsonLibrary = CSharpJsonLibrary.SystemTextJson
});
var code = generator.GenerateFile("MyClass");

//// Assert
Assert.Contains(@"class DateFormatConverter", code);
Assert.Contains(@"[System.Text.Json.Serialization.JsonConverter(typeof(DateFormatConverter))]", code);

AssertCompile(code);
}

[Fact]
public async Task When_no_typeNameHint_is_available_then_title_is_used_as_class_name()
{
Expand Down Expand Up @@ -1605,6 +1638,39 @@ public async Task When_definition_contains_date_converter_should_be_added_for_da
AssertCompile(code);
}

[Fact]
public async Task When_definition_contains_date_and_use_system_text_json_then_converter_should_be_added_for_datetimeoffset()
{
//// Arrange
var json =
@"{
""type"": ""object"",
""properties"": {
""a"": {
""type"": ""string"",
""format"": ""date""
}
}
}";
var schema = await JsonSchema.FromJsonAsync(json);

//// Act
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings
{
ClassStyle = CSharpClassStyle.Poco,
SchemaType = SchemaType.Swagger2,
DateType = "System.DateTimeOffset",
JsonLibrary = CSharpJsonLibrary.SystemTextJson
});
var code = generator.GenerateFile("MyClass");

//// Assert
Assert.Contains(@"class DateFormatConverter", code);
Assert.Contains(@"[System.Text.Json.Serialization.JsonConverter(typeof(DateFormatConverter))]", code);

AssertCompile(code);
}

[Fact]
public async Task When_definition_contains_datetime_converter_should_not_be_added()
{
Expand Down Expand Up @@ -1637,6 +1703,39 @@ public async Task When_definition_contains_datetime_converter_should_not_be_adde
AssertCompile(code);
}

[Fact]
public async Task When_definition_contains_datetime_and_use_system_text_json_then_converter_should_not_be_added()
{
//// Arrange
var json =
@"{
""type"": ""object"",
""properties"": {
""a"": {
""type"": ""string"",
""format"": ""date-time""
}
}
}";
var schema = await JsonSchema.FromJsonAsync(json);

//// Act
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings
{
ClassStyle = CSharpClassStyle.Poco,
SchemaType = SchemaType.Swagger2,
DateType = "System.DateTime",
JsonLibrary = CSharpJsonLibrary.SystemTextJson
});
var code = generator.GenerateFile("MyClass");

//// Assert
Assert.DoesNotContain(@"class DateFormatConverter", code);
Assert.DoesNotContain(@"[System.Text.Json.Serialization.JsonConverter(typeof(DateFormatConverter))]", code);

AssertCompile(code);
}

[Fact]
public async Task When_record_no_setter_in_class_and_constructor_provided()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,11 @@ public DateFormatConverterTemplateModel(CSharpGeneratorSettings settings)
{
_settings = settings;
}

/// <summary>Gets or sets a value indicating whether to generate the DateFormatConverter class.</summary>
public bool GenerateDateFormatConverterClass => _settings.ExcludedTypeNames?.Contains("DateFormatConverter") != true;

/// <summary>Gets a value indicating whether to use System.Text.Json</summary>
public bool UseSystemTextJson => _settings.JsonLibrary == CSharpJsonLibrary.SystemTextJson;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "{{ ToolchainVersion }}")]
{%- if UseSystemTextJson -%}
internal class DateFormatConverter : JsonConverter<DateTime>
internal class DateFormatConverter : System.Text.Json.Serialization.JsonConverter<System.DateTime>
{
public override System.DateTime Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
var dateTime = reader.GetString();
if (dateTime == null)
{
throw new JsonException("Unexpected JsonTokenType.Null");
}

return System.DateTime.Parse(dateTime);
}

public override void Write(System.Text.Json.Utf8JsonReader writer, System.DateTime value, System.Text.Json.JsonSerializerOptions options)
public override void Write(System.Text.Json.Utf8JsonWriter writer, System.DateTime value, System.Text.Json.JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
}
Expand Down

0 comments on commit 932884e

Please sign in to comment.