Skip to content

Commit

Permalink
Added test case.
Browse files Browse the repository at this point in the history
  • Loading branch information
RedX2501 committed Mar 11, 2019
1 parent 49e35d9 commit d158786
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 16 deletions.
67 changes: 51 additions & 16 deletions XmlSchemaClassGenerator.Tests/Compiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,22 @@ public static CompilationResult GenerateAssembly(Compilation compilation)

private static ConcurrentDictionary<string, Assembly> Assemblies = new ConcurrentDictionary<string, Assembly>();

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);
Expand Down Expand Up @@ -93,24 +109,9 @@ public static Assembly GenerateFiles(string name, IEnumerable<string> files, Gen

public static Assembly CompileFiles(string name, IEnumerable<string> 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();
Expand All @@ -130,5 +131,39 @@ public static Assembly CompileFiles(string name, IEnumerable<string> files)

return result.Assembly;
}

private static readonly LanguageVersion MaxLanguageVersion = Enum
.GetValues(typeof(LanguageVersion))
.Cast<LanguageVersion>()
.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;
}
}
}
92 changes: 92 additions & 0 deletions XmlSchemaClassGenerator.Tests/XmlTests.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -40,6 +41,7 @@ private IEnumerable<string> 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,
Expand Down Expand Up @@ -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 = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<xs:schema version=""1.0"" targetNamespace=""test""
elementFormDefault=""qualified""
xmlns:test=""test""
xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:element name=""foo"" type=""test:foo""/>
<xs:complexType name=""foo"">
<xs:sequence>
<xs:element name=""bar"" minOccurs=""0"">
<xs:complexType>
<xs:sequence>
<xs:element name=""baz"" type=""xs:string"" minOccurs=""0"" maxOccurs=""unbounded"">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>";

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 = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<xs:schema version=""1.0"" targetNamespace=""test""
elementFormDefault=""qualified""
xmlns:test=""test""
xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:element name=""foo"" type=""test:foo""/>
<xs:complexType name=""foo"">
<xs:sequence>
<xs:element name=""bar"" minOccurs=""0"">
<xs:complexType>
<xs:sequence>
<xs:element name=""baz"" type=""xs:string"" minOccurs=""0"" maxOccurs=""unbounded"">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>";

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()
{
Expand Down

0 comments on commit d158786

Please sign in to comment.