Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/NJsonSchema.CodeGeneration.CSharp.Tests/EnumTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,27 @@ public async Task When_enum_list_uses_string_enums_then_ItemConverterType_is_set
CSharpCompiler.AssertCompile(code);
}

[Fact]
public async Task When_enum_list_uses_string_enums_then_ItemConverterType_is_set_for_STJ_target()
{
// Arrange
var schema = NewtonsoftJsonSchemaGenerator.FromType<MyStringEnumListTest>();
var data = schema.ToJson();
var generator =
new CSharpGenerator(schema, new CSharpGeneratorSettings
{
ClassStyle = CSharpClassStyle.Poco,
JsonLibrary = CSharpJsonLibrary.SystemTextJson
});

// Act
var code = generator.GenerateFile();

// Assert
await VerifyHelper.Verify(code);
CSharpCompiler.AssertCompile(code);
}

[Fact]
public async Task When_enum_is_nullable_then_StringEnumConverter_is_set()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ namespace MyNamespace
public enum MyClassSize
{

[System.Text.Json.Serialization.JsonStringEnumMemberName(@"small")]
[System.Runtime.Serialization.EnumMember(Value = @"small")]
Small = 0,


[System.Text.Json.Serialization.JsonStringEnumMemberName(@"medium")]
[System.Runtime.Serialization.EnumMember(Value = @"medium")]
Medium = 1,


[System.Text.Json.Serialization.JsonStringEnumMemberName(@"large")]
[System.Runtime.Serialization.EnumMember(Value = @"large")]
Large = 2,


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ namespace MyNamespace
public enum MyClassSize
{

[System.Text.Json.Serialization.JsonStringEnumMemberName(@"small")]
[System.Runtime.Serialization.EnumMember(Value = @"small")]
Small = 0,


[System.Text.Json.Serialization.JsonStringEnumMemberName(@"medium")]
[System.Runtime.Serialization.EnumMember(Value = @"medium")]
Medium = 1,


[System.Text.Json.Serialization.JsonStringEnumMemberName(@"large")]
[System.Runtime.Serialization.EnumMember(Value = @"large")]
Large = 2,


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//----------------------
// <auto-generated>
// </auto-generated>
//----------------------


namespace MyNamespace
{
#pragma warning disable // Disable all warnings

public enum MyStringEnum
{

[System.Runtime.Serialization.EnumMember(Value = @"Foo")]
Foo = 0,


[System.Runtime.Serialization.EnumMember(Value = @"Bar")]
Bar = 1,


}

public partial class MyStringEnumListTest
{

[System.Text.Json.Serialization.JsonPropertyName("Enums")]
// TODO(system.text.json): Add ItemConverterType with enum converter when supported
public System.Collections.Generic.ICollection<MyStringEnum> Enums { get; set; }

[System.Text.Json.Serialization.JsonPropertyName("NullableEnum")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<MyStringEnum>))]
public MyStringEnum? NullableEnum { get; set; }

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ public CSharpGeneratorSettings()
/// <summary>Gets or sets the CSharp JSON library to use (default: 'NewtonsoftJson', 'SystemTextJson' is experimental/not complete).</summary>
public CSharpJsonLibrary JsonLibrary { get; set; }

/// <summary>Gets or sets the CSharp JSON library version to use (applies only to System.Text.Json, default: 8.0).</summary>
public decimal JsonLibraryVersion { get; set; } = 8.0m;

/// <summary>Gets or sets the CSharp JSON polymorphic serialization style (default: 'NJsonSchema', 'SystemTextJson' is experimental/not complete).</summary>
public CSharpJsonPolymorphicSerializationStyle JsonPolymorphicSerializationStyle { get; set; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ public EnumTemplateModel(string typeName, JsonSchema schema, CSharpGeneratorSett
/// <summary>Gets a value indicating whether to use System.Text.Json</summary>
public bool UseSystemTextJson => _settings.JsonLibrary == CSharpJsonLibrary.SystemTextJson;

/// <summary>Gets or sets the CSharp JSON library version to use.</summary>
public decimal JsonLibraryVersion => _settings.JsonLibraryVersion;

/// <summary>Gets a value indicating whether the enum needs another base type to representing an extended value range.</summary>
public bool HasExtendedValueRange => _schema.Format == JsonFormatStrings.Long;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
{%- if UseSystemTextJson -%}
[System.Text.Json.Serialization.JsonPropertyName("{{ property.Name }}")]
{%- if property.IsStringEnumArray -%}
// TODO(system.text.json): Add string enum item converter
// TODO(system.text.json): Add ItemConverterType with enum converter when supported
{%- endif -%}
{%- else -%}
[Newtonsoft.Json.JsonProperty("{{ property.Name }}", Required = {{ property.JsonPropertyRequiredCode }}{% if property.IsStringEnumArray %}, ItemConverterType = typeof(Newtonsoft.Json.Converters.StringEnumConverter){% endif %})]
Expand Down
4 changes: 4 additions & 0 deletions src/NJsonSchema.CodeGeneration.CSharp/Templates/Enum.liquid
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@
{%- for enum in Enums %}
{%- if IsStringEnum -%}
{%- if UseSystemTextJson -%}
{%- if JsonLibraryVersion >= 9.0 -%}
[System.Text.Json.Serialization.JsonStringEnumMemberName(@"{{ enum.Value | replace: '"', '""' }}")]
{%- else -%}
[System.Runtime.Serialization.EnumMember(Value = @"{{ enum.Value | replace: '"', '""' }}")]
{%- endif -%}
{%- else -%}
[System.Runtime.Serialization.EnumMember(Value = @"{{ enum.Value | replace: '"', '""' }}")]
{%- endif -%}
Expand Down
30 changes: 27 additions & 3 deletions src/NJsonSchema.CodeGeneration.Tests/EnumGenerationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task When_export_types_is_true_add_export_before_enum_in_typescript
var schema = NewtonsoftJsonSchemaGenerator.FromType<StringAndIntegerEnumTestClass>(new NewtonsoftJsonSchemaGeneratorSettings());
var data = schema.ToJson();

TypeScriptGeneratorSettings typeScriptGeneratorSettings = new TypeScriptGeneratorSettings()
TypeScriptGeneratorSettings typeScriptGeneratorSettings = new TypeScriptGeneratorSettings
{
ExportTypes = true
};
Expand All @@ -72,8 +72,8 @@ public async Task When_add_export_keyword_is_false_dont_add_export_before_enum_i
// Arrange
var schema = NewtonsoftJsonSchemaGenerator.FromType<StringAndIntegerEnumTestClass>(new NewtonsoftJsonSchemaGeneratorSettings());
var data = schema.ToJson();

TypeScriptGeneratorSettings typeScriptGeneratorSettings = new TypeScriptGeneratorSettings()
TypeScriptGeneratorSettings typeScriptGeneratorSettings = new TypeScriptGeneratorSettings
{
ExportTypes = false
};
Expand Down Expand Up @@ -144,6 +144,30 @@ public async Task When_enum_has_string_value_then_CS_code_has_EnumMember_attribu
await VerifyHelper.Verify(code);
CSharpCompiler.AssertCompile(code);
}

#if NET9_0_OR_GREATER

[Fact]
public async Task When_enum_has_string_value_then_CS_code_has_JsonStringEnumMemberName_attribute()
{
// Arrange
var schema = NewtonsoftJsonSchemaGenerator.FromType<ClassWithStringEnum>();
var schemaData = schema.ToJson();

// Act
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings
{
JsonLibraryVersion = 9.0m,
JsonLibrary = CSharpJsonLibrary.SystemTextJson
});
var code = generator.GenerateFile("MyClass");

// Assert
await VerifyHelper.Verify(code);
CSharpCompiler.AssertCompile(code);
}

#endif

[Fact]
public async Task When_enum_has_string_value_then_TS_code_has_string_value()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net8.0</TargetFrameworks>
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">$(TargetFrameworks);net472</TargetFrameworks>
<IsPackable>false</IsPackable>
<NoWarn>$(NoWarn),1998,1591,618,IDE1006</NoWarn>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//----------------------
// <auto-generated>
// </auto-generated>
//----------------------


namespace MyNamespace
{
#pragma warning disable // Disable all warnings

public enum StringEnum
{

[System.Text.Json.Serialization.JsonStringEnumMemberName(@"0562")]
_0562 = 0,


[System.Text.Json.Serialization.JsonStringEnumMemberName(@"0532")]
_0532 = 1,


}

public partial class MyClass
{

[System.Text.Json.Serialization.JsonPropertyName("Bar")]
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.JsonStringEnumConverter<StringEnum>))]
public StringEnum Bar { get; set; }

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "IntegerEnumContainer",
"type": "object",
"additionalProperties": false,
"properties": {
"IntegerCloudCover": {
"$ref": "#/definitions/IntegerCloudCover"
}
},
"definitions": {
"IntegerCloudCover": {
"type": "integer",
"description": "",
"x-enumNames": [
"Clear",
"Partial",
"Overcast"
],
"enum": [
0,
1,
2
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "StringEnumMemberContainer",
"type": "object",
"additionalProperties": false,
"properties": {
"CloudCover": {
"$ref": "#/definitions/CloudCoverWithEnumMember"
}
},
"definitions": {
"CloudCoverWithEnumMember": {
"type": "string",
"description": "",
"x-enumNames": [
"Clear",
"Partial",
"Overcast"
],
"enum": [
"Clear",
"Partly cloudy",
"Overcast"
]
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "StringJsonStringEnumMemberNameContainer",
"type": "object",
"additionalProperties": false,
"properties": {
"CloudCover": {
"$ref": "#/definitions/CloudCoverWithJsonStringEnumMemberName"
}
},
"definitions": {
"CloudCoverWithJsonStringEnumMemberName": {
"type": "string",
"description": "",
"x-enumNames": [
"Clear",
"Partial",
"Overcast"
],
"enum": [
"Clear",
"Partly cloudy",
"Overcast"
]
}
}
}
Loading