diff --git a/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs index af000f453..8472a9e17 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InheritanceTests.cs @@ -88,5 +88,49 @@ public async Task When_class_with_discriminator_has_base_class_then_csharp_is_ge Assert.Contains("class ExceptionBase : Exception", code); Assert.Contains("class MyException : ExceptionBase", code); } + + [Fact] + public async Task When_property_references_any_schema_with_inheritance_then_property_type_is_correct() + { + //// Arrange + var json = @"{ + ""type"": ""object"", + ""properties"": { + ""dog"": { + ""$ref"": ""#/definitions/Dog"" + } + }, + ""definitions"": { + ""Pet"": { + ""type"": ""object"", + ""properties"": { + ""name"": { + ""type"": ""string"" + } + } + }, + ""Dog"": { + ""title"": ""Dog"", + ""description"": """", + ""allOf"": [ + { + ""$ref"": ""#/definitions/Pet"" + }, + { + ""type"": ""object"" + } + ] + } + } +}"; + var schema = await JsonSchema4.FromJsonAsync(json); + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings { ClassStyle = CSharpClassStyle.Poco }); + + //// Act + var code = generator.GenerateFile(); + + //// Assert + Assert.Contains("public Dog Dog { get; set; }", code); + } } } diff --git a/src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs new file mode 100644 index 000000000..751a5c0d7 --- /dev/null +++ b/src/NJsonSchema.CodeGeneration.CSharp.Tests/InterfaceTests.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using NJsonSchema.Generation; +using Xunit; + +namespace NJsonSchema.CodeGeneration.CSharp.Tests +{ + public class InterfaceTests + { + public interface IPerson + { + string LastName { get; set; } + string FirstName { get; set; } + } + + public class Person : IPerson + { + public string LastName { get; set; } + public string FirstName { get; set; } + } + + [Fact] + public async Task When_interface_has_properties_then_properties_are_included_in_schema() + { + //// Arrange + var schema = await JsonSchema4.FromTypeAsync(new JsonSchemaGeneratorSettings()); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.Swagger2 + }); + var code = generator.GenerateFile("Person"); + + //// Assert + Assert.Equal(2, schema.Properties.Count); + Assert.Contains("public string LastName { get; set; }\n", code); + Assert.Contains("public string FirstName { get; set; }\n", code); + } + + [Fact] + public async Task When_class_implements_interface_then_properties_are_included_in_schema() + { + //// Arrange + var schema = await JsonSchema4.FromTypeAsync(new JsonSchemaGeneratorSettings()); + + //// Act + var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings + { + ClassStyle = CSharpClassStyle.Poco, + SchemaType = SchemaType.Swagger2 + }); + var code = generator.GenerateFile("Person"); + + //// Assert + Assert.Equal(2, schema.Properties.Count); + Assert.Contains("public string LastName { get; set; }\n", code); + Assert.Contains("public string FirstName { get; set; }\n", code); + } + } + +} diff --git a/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs b/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs index a38e866c7..3ee7d0a69 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs +++ b/src/NJsonSchema.CodeGeneration.CSharp/CSharpTypeResolver.cs @@ -65,7 +65,7 @@ public string Resolve(JsonSchema4 schema, bool isNullable, string typeNameHint, // Primitive schemas (no new type) - if (schema.ActualTypeSchema.IsAnyType) + if (schema.ActualTypeSchema.IsAnyType && !schema.HasReference) return "object"; var type = schema.ActualTypeSchema.Type; diff --git a/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj b/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj index 8e1e37ee4..11a6d277f 100644 --- a/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj +++ b/src/NJsonSchema.CodeGeneration.CSharp/NJsonSchema.CodeGeneration.CSharp.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj b/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj index f9766a8a7..c2886d589 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj +++ b/src/NJsonSchema.CodeGeneration.TypeScript/NJsonSchema.CodeGeneration.TypeScript.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs b/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs index 4424501a0..659fbe4a1 100644 --- a/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs +++ b/src/NJsonSchema.CodeGeneration.TypeScript/TypeScriptTypeResolver.cs @@ -80,7 +80,7 @@ private string Resolve(JsonSchema4 schema, string typeNameHint, bool addInterfac // Primitive schemas (no new type) - if (schema.ActualTypeSchema.IsAnyType) + if (schema.ActualTypeSchema.IsAnyType && !schema.HasReference) return "any"; var type = schema.ActualTypeSchema.Type; diff --git a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj index cb631e9df..d675aba3a 100644 --- a/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj +++ b/src/NJsonSchema.CodeGeneration/NJsonSchema.CodeGeneration.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net451 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs index 02da9fffd..ee1c63f3e 100644 --- a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs +++ b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs @@ -155,5 +155,29 @@ public async Task When_string_enum_property_has_default_then_default_is_converte //// Assert Assert.Equal("C", schema.Properties["MyEnumeration"].Default); } + + public class Party + { + public MyEnumeration? EnumValue { get; set; } + + public bool ShouldSerializeEnumValue() + { + return EnumValue.HasValue; + } + } + + [Fact] + public async Task When_enum_property_has_should_serialize_then_no_npe() + { + //// Arrange + var schema = await JsonSchema4.FromTypeAsync(new JsonSchemaGeneratorSettings()); + + //// Act + var json = schema.ToJson(); + + //// Assert + Assert.True(schema.Properties.ContainsKey("EnumValue")); + Assert.NotNull(json); + } } } \ No newline at end of file diff --git a/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj b/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj index ad46da1b5..e35ff6945 100644 --- a/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj +++ b/src/NJsonSchema.Yaml/NJsonSchema.Yaml.csproj @@ -2,7 +2,7 @@ netstandard1.3;netstandard2.0;net45 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md diff --git a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs index 1cb09147b..754b68a05 100644 --- a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs +++ b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs @@ -602,10 +602,10 @@ private async Task GeneratePropertiesAsync(Type type, JsonSchema4 schema, JsonSc var info = propertiesAndFields.FirstOrDefault(p => p.Name == property.UnderlyingName); var propertyInfo = info as PropertyInfo; #if !LEGACY - if (Settings.GenerateAbstractProperties || propertyInfo == null || + if (Settings.GenerateAbstractProperties || propertyInfo == null || propertyInfo.DeclaringType.GetTypeInfo().IsInterface || (propertyInfo.GetMethod?.IsAbstract != true && propertyInfo.SetMethod?.IsAbstract != true)) #else - if (Settings.GenerateAbstractProperties || propertyInfo == null || + if (Settings.GenerateAbstractProperties || propertyInfo == null || propertyInfo.DeclaringType.GetTypeInfo().IsInterface || (propertyInfo.GetGetMethod()?.IsAbstract != true && propertyInfo.GetSetMethod()?.IsAbstract != true)) #endif { diff --git a/src/NJsonSchema/NJsonSchema.csproj b/src/NJsonSchema/NJsonSchema.csproj index 1f798bff4..d151de3cf 100644 --- a/src/NJsonSchema/NJsonSchema.csproj +++ b/src/NJsonSchema/NJsonSchema.csproj @@ -2,7 +2,7 @@ netstandard1.0;netstandard2.0;net40;net45 JSON Schema reader, generator and validator for .NET - 9.13.24 + 9.13.25 json schema validation generator .net Copyright © Rico Suter, 2018 https://github.com/rsuter/NJsonSchema/blob/master/LICENSE.md