From 44280f5f4e6bb6fc68309172795ba730de3cfadc Mon Sep 17 00:00:00 2001 From: Nickolay Batov Date: Sat, 28 Aug 2021 01:36:39 +0300 Subject: [PATCH 1/3] #282 fix NullReferenceException for null public arrays --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 40 +++++++++++++++++++++++ XmlSchemaClassGenerator/TypeModel.cs | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index 7c865b14..9751e25b 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -2208,6 +2208,46 @@ public void TestArrayOfMsTypeGeneration() //Assert.NotEmpty((System.Collections.IEnumerable)deserialized.D); //<== oops } + [Fact] + public void TestArrayOfStringsWhenPublicAndNull() + { + // see https://github.com/mganss/XmlSchemaClassGenerator/issues/282 + + // arrange + var xsd = + @" + + + + + + + "; + var validXml = + @" + + "; + var generator = new Generator + { + IntegerDataType = typeof(int), + NamespacePrefix = "Test_NS1", + GenerateNullables = true, + CollectionType = typeof(System.Array), + CollectionSettersMode = CollectionSettersMode.Public + }; + var contents = ConvertXml(nameof(TestArrayOfStringsWhenPublicAndNull), new[] { xsd }, generator).ToArray(); + var assembly = Compiler.Compile(nameof(TestForceIsNullableGeneration), contents); + var testType = assembly.GetType("Test_NS1.ArrayOfstring"); + Assert.NotNull(testType); + var serializer = new XmlSerializer(testType); + + // act + dynamic deserialized = serializer.Deserialize(new StringReader(validXml)); + + // assert + var xml = Serialize(serializer, deserialized); + } + [Fact, TestPriority(1)] public void AirspaceServicesTest1() { diff --git a/XmlSchemaClassGenerator/TypeModel.cs b/XmlSchemaClassGenerator/TypeModel.cs index e355decf..b4307cf1 100644 --- a/XmlSchemaClassGenerator/TypeModel.cs +++ b/XmlSchemaClassGenerator/TypeModel.cs @@ -1076,7 +1076,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi var countProperty = collectionType == typeof(System.Array) ? "Length" : "Count"; var countReference = new CodePropertyReferenceExpression(listReference, countProperty); var notZeroExpression = new CodeBinaryOperatorExpression(countReference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(0)); - if (Configuration.CollectionSettersMode == CollectionSettersMode.PublicWithoutConstructorInitialization) + if (Configuration.CollectionSettersMode is CollectionSettersMode.PublicWithoutConstructorInitialization or CollectionSettersMode.Public) { var notNullExpression = new CodeBinaryOperatorExpression(listReference, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null)); notZeroExpression = new CodeBinaryOperatorExpression(notNullExpression, CodeBinaryOperatorType.BooleanAnd, notZeroExpression); From c4f2f54efdd9d63a50e2d706972605a328d29d50 Mon Sep 17 00:00:00 2001 From: Nickolay Batov Date: Sat, 28 Aug 2021 01:42:42 +0300 Subject: [PATCH 2/3] copy generator options for correct test --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index 9751e25b..acc757cc 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -59,6 +59,9 @@ private static IEnumerable ConvertXml(string name, IEnumerable x NetCoreSpecificCode = generatorPrototype.NetCoreSpecificCode, GenerateCommandLineArgumentsComment = generatorPrototype.GenerateCommandLineArgumentsComment, CommandLineArgumentsProvider = generatorPrototype.CommandLineArgumentsProvider, + CollectionType = generatorPrototype.CollectionType, + CollectionImplementationType = generatorPrototype.CollectionImplementationType, + CollectionSettersMode = generatorPrototype.CollectionSettersMode, }; gen.CommentLanguages.Clear(); From 9f1da01d98d7b76f7413889bd4d389f24bdfa2c5 Mon Sep 17 00:00:00 2001 From: Nickolay Batov Date: Sat, 28 Aug 2021 10:17:49 +0300 Subject: [PATCH 3/3] correct act&assert --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index acc757cc..326589fd 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -2246,9 +2246,10 @@ public void TestArrayOfStringsWhenPublicAndNull() // act dynamic deserialized = serializer.Deserialize(new StringReader(validXml)); + var xml = Serialize(serializer, deserialized); // assert - var xml = Serialize(serializer, deserialized); + Assert.NotNull(xml); } [Fact, TestPriority(1)]