diff --git a/Bonsai.Sgen.Tests/EnumGenerationTests.cs b/Bonsai.Sgen.Tests/EnumGenerationTests.cs index b37913f..8e30f18 100644 --- a/Bonsai.Sgen.Tests/EnumGenerationTests.cs +++ b/Bonsai.Sgen.Tests/EnumGenerationTests.cs @@ -1,4 +1,5 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using NJsonSchema; @@ -44,5 +45,37 @@ public void GenerateStringEnum_SerializerAnnotationsUseStringValues() Assert.IsTrue(code.Contains("EnumMemberAttribute(Value=\"A\")")); Assert.IsTrue(code.Contains("YamlMemberAttribute(Alias=\"A\")")); } + + [TestMethod] + public async Task GenerateStringEnum_StringEnumTypeDefinitionWithStringEnumConverter() + { + var schema = await JsonSchema.FromJsonAsync(@" +{ + ""$schema"": ""http://json-schema.org/draft-04/schema#"", + ""type"": ""object"", + ""title"": ""Container"", + ""additionalProperties"": false, + ""properties"": { + ""Enum"": { + ""$ref"": ""#/definitions/StringEnum"" + } + }, + ""definitions"": { + ""StringEnum"": { + ""enum"": [ + ""This is a string A"", + ""This is a string B"" + ], + ""title"": ""StringEnum"", + ""type"": ""string"" + } + } + } +"); + var generator = TestHelper.CreateGenerator(schema); + var code = generator.GenerateFile(); + Assert.IsTrue(code.Contains("StringEnumConverter")); + CompilerTestHelper.CompileFromSource(code); + } } } diff --git a/Bonsai.Sgen/CSharpEnumTemplate.cs b/Bonsai.Sgen/CSharpEnumTemplate.cs index cabef30..b185aff 100644 --- a/Bonsai.Sgen/CSharpEnumTemplate.cs +++ b/Bonsai.Sgen/CSharpEnumTemplate.cs @@ -3,6 +3,8 @@ using NJsonSchema.CodeGeneration.CSharp.Models; using YamlDotNet.Serialization; using System.Runtime.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace Bonsai.Sgen { @@ -33,6 +35,13 @@ public override void BuildType(CodeTypeDeclaration type) type.Comments.Add(new CodeCommentStatement("", docComment: true)); } + if (Model.IsStringEnum && Settings.SerializerLibraries.HasFlag(SerializerLibraries.NewtonsoftJson)) + { + type.CustomAttributes.Add(new CodeAttributeDeclaration( + new CodeTypeReference(typeof(JsonConverter)), + new CodeAttributeArgument(new CodeTypeOfExpression(typeof(StringEnumConverter))))); + } + if (Model.IsEnumAsBitFlags) { type.CustomAttributes.Add(new CodeAttributeDeclaration(typeof(FlagsAttribute).FullName));