From d158786a438ba7aa9b2fb77242b8473d2642e500 Mon Sep 17 00:00:00 2001 From: Guilherme Bufolo Date: Mon, 11 Mar 2019 10:37:00 +0100 Subject: [PATCH] Added test case. --- XmlSchemaClassGenerator.Tests/Compiler.cs | 67 +++++++++++++---- XmlSchemaClassGenerator.Tests/XmlTests.cs | 92 +++++++++++++++++++++++ 2 files changed, 143 insertions(+), 16 deletions(-) diff --git a/XmlSchemaClassGenerator.Tests/Compiler.cs b/XmlSchemaClassGenerator.Tests/Compiler.cs index 5f29aa42..b86dc4c6 100644 --- a/XmlSchemaClassGenerator.Tests/Compiler.cs +++ b/XmlSchemaClassGenerator.Tests/Compiler.cs @@ -37,6 +37,22 @@ public static CompilationResult GenerateAssembly(Compilation compilation) private static ConcurrentDictionary Assemblies = new ConcurrentDictionary(); + private static readonly string[] DependencyAssemblies = new[] + { + "netstandard", + "System.ComponentModel.Annotations", + "System.ComponentModel.Primitives", + "System.Diagnostics.Tools", + "System.Linq", + "System.ObjectModel", + "System.Private.CoreLib", + "System.Private.Xml", + "System.Private.Xml.Linq", + "System.Runtime", + "System.Xml.XDocument", + "System.Xml.XmlSerializer", + }; + public static Assembly GetAssembly(string name) { Assemblies.TryGetValue(name, out var assembly); @@ -93,24 +109,9 @@ public static Assembly GenerateFiles(string name, IEnumerable files, Gen public static Assembly CompileFiles(string name, IEnumerable files) { - var assemblies = new[] - { - "netstandard", - "System.ComponentModel.Annotations", - "System.ComponentModel.Primitives", - "System.Diagnostics.Tools", - "System.Linq", - "System.ObjectModel", - "System.Private.CoreLib", - "System.Private.Xml", - "System.Private.Xml.Linq", - "System.Runtime", - "System.Xml.XDocument", - "System.Xml.XmlSerializer", - }; var trustedAssembliesPaths = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator); var references = trustedAssembliesPaths - .Where(p => assemblies.Contains(Path.GetFileNameWithoutExtension(p))) + .Where(p => DependencyAssemblies.Contains(Path.GetFileNameWithoutExtension(p))) .Select(p => MetadataReference.CreateFromFile(p)) .ToList(); var syntaxTrees = files.Select(f => CSharpSyntaxTree.ParseText(File.ReadAllText(f))).ToList(); @@ -130,5 +131,39 @@ public static Assembly CompileFiles(string name, IEnumerable files) return result.Assembly; } + + private static readonly LanguageVersion MaxLanguageVersion = Enum + .GetValues(typeof(LanguageVersion)) + .Cast() + .Max(); + + public static Assembly Compile(string name, string contents, Generator generator) + { + var trustedAssembliesPaths = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator); + var references = trustedAssembliesPaths + .Where(p => DependencyAssemblies.Contains(Path.GetFileNameWithoutExtension(p))) + .Select(p => MetadataReference.CreateFromFile(p)) + .ToList(); + + var options = new CSharpParseOptions(kind: SourceCodeKind.Regular, languageVersion: MaxLanguageVersion); + + // Return a syntax tree of our source code + var syntaxTree = CSharpSyntaxTree.ParseText(contents, options); + + var compilation = CSharpCompilation.Create(name, new[] { syntaxTree }) + .AddReferences(references) + .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + var result = Compiler.GenerateAssembly(compilation); + + + Assert.True(result.Result.Success); + var errors = result.Result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error).ToList(); + Assert.False(errors.Any(), string.Join("\n", errors.Select(e => e.GetMessage()))); + var warnings = result.Result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Warning).ToList(); + Assert.False(warnings.Any(), string.Join("\n", errors.Select(w => w.GetMessage()))); + Assert.NotNull(result.Assembly); + + return result.Assembly; + } } } diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index a88926c5..b4224688 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -1,6 +1,7 @@ using System; using System.CodeDom; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; @@ -40,6 +41,7 @@ private IEnumerable ConvertXml(string name, string xsd, Generator genera IntegerDataType = generatorPrototype.IntegerDataType, DataAnnotationMode = generatorPrototype.DataAnnotationMode, GenerateDesignerCategoryAttribute = generatorPrototype.GenerateDesignerCategoryAttribute, + GenerateComplexTypesForCollections = generatorPrototype.GenerateComplexTypesForCollections, EntityFramework = generatorPrototype.EntityFramework, AssemblyVisible = generatorPrototype.AssemblyVisible, GenerateInterfaces = generatorPrototype.GenerateInterfaces, @@ -766,6 +768,96 @@ public void DecimalSeparatorTest() Assert.Contains("private decimal _someAttr = 1.5m;", content); } + [Fact] + public void DoNotGenerateIntermediaryClassForArrayElements() + { + // see https://github.com/mganss/XmlSchemaClassGenerator/issues/32 + + const string xsd = @" + + + + + + + + + + + + + + +"; + + var generator = new Generator + { + NamespaceProvider = new NamespaceProvider + { + GenerateNamespace = key => "Test", + }, + GenerateComplexTypesForCollections = false, + GenerateInterfaces = true, + AssemblyVisible = true + }; + var contents = ConvertXml(nameof(ComplexTypeWithAttributeGroupExtension), xsd, generator); + var content = Assert.Single(contents); + + var assembly = Compiler.Compile(nameof(DoNotGenerateIntermediaryClassForArrayElements), content, generator); + + var fooType = Assert.Single(assembly.DefinedTypes); + Assert.NotNull(fooType); + Assert.True(fooType.FullName == "Test.Foo"); + } + + [Fact] + public void GenerateIntermediaryClassForArrayElements() + { + // see https://github.com/mganss/XmlSchemaClassGenerator/issues/32 + + const string xsd = @" + + + + + + + + + + + + + + +"; + + var generator = new Generator + { + NamespaceProvider = new NamespaceProvider + { + GenerateNamespace = key => "Test", + }, + GenerateComplexTypesForCollections = true, + GenerateInterfaces = true, + AssemblyVisible = true + }; + var contents = ConvertXml(nameof(GenerateIntermediaryClassForArrayElements), xsd, generator); + var content = Assert.Single(contents); + + var assembly = Compiler.Compile(nameof(GenerateIntermediaryClassForArrayElements), content, generator); + + Assert.True(assembly.DefinedTypes.Count() == 2); + Assert.Single(assembly.DefinedTypes, x => x.FullName == "Test.Foo"); + Assert.Single(assembly.DefinedTypes, x => x.FullName == "Test.FooBar"); + } + [Fact] public void BoolTest() {