From 7fc979fec88409cb432a891eb909e36eec987550 Mon Sep 17 00:00:00 2001 From: "Artyom V. Gorchakov" Date: Tue, 27 Oct 2020 19:36:18 +0300 Subject: [PATCH] housekeeping: Add XamlNameReferenceGenerator.Tests (#7) * Add basic MiniCompiler unit tests * Add XamlX tests stub file --- .../MiniCompilerTests.cs | 51 +++++++++++++++++++ .../XamlNameReferenceGenerator.Tests.csproj | 23 +++++++++ .../XamlXNameReferenceXamlParserTests.cs | 13 +++++ src/XamlNameReferenceGenerator.sln | 6 +++ .../Infrastructure/MiniCompiler.cs | 10 ++-- .../NameReferenceGenerator.cs | 3 ++ .../Parsers/XamlXNameReferenceXamlParser.cs | 3 +- 7 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 src/XamlNameReferenceGenerator.Tests/MiniCompilerTests.cs create mode 100644 src/XamlNameReferenceGenerator.Tests/XamlNameReferenceGenerator.Tests.csproj create mode 100644 src/XamlNameReferenceGenerator.Tests/XamlXNameReferenceXamlParserTests.cs diff --git a/src/XamlNameReferenceGenerator.Tests/MiniCompilerTests.cs b/src/XamlNameReferenceGenerator.Tests/MiniCompilerTests.cs new file mode 100644 index 0000000000..5ec3ee5c46 --- /dev/null +++ b/src/XamlNameReferenceGenerator.Tests/MiniCompilerTests.cs @@ -0,0 +1,51 @@ +using System; +using System.ComponentModel; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using XamlNameReferenceGenerator.Infrastructure; +using XamlX; +using XamlX.Parsers; +using Xunit; + +namespace XamlNameReferenceGenerator.Tests +{ + public class MiniCompilerTests + { + private const string MiniClass = "namespace Example { public class Valid { public int Foo() => 21; } }"; + private const string MiniInvalidXaml = ""; + private const string MiniValidXaml = ""; + + [Fact] + public void Should_Resolve_Types_From_Valid_Xaml_Markup() + { + var xaml = XDocumentXamlParser.Parse(MiniValidXaml); + var compilation = CreateBasicCompilation(MiniClass, "Example"); + + MiniCompiler + .CreateDefault(new RoslynTypeSystem(compilation)) + .Transform(xaml); + + Assert.NotNull(xaml.Root); + } + + [Fact] + public void Should_Throw_When_Unable_To_Resolve_Types() + { + var xaml = XDocumentXamlParser.Parse(MiniInvalidXaml); + var compilation = CreateBasicCompilation(MiniClass, "Example"); + var compiler = MiniCompiler.CreateDefault(new RoslynTypeSystem(compilation)); + + Assert.Throws(() => compiler.Transform(xaml)); + } + + private static CSharpCompilation CreateBasicCompilation(string source, string name) => + CSharpCompilation + .Create(name, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)) + .AddReferences(MetadataReference.CreateFromFile(typeof(string).Assembly.Location)) + .AddReferences(MetadataReference.CreateFromFile(typeof(IServiceProvider).Assembly.Location)) + .AddReferences(MetadataReference.CreateFromFile(typeof(ITypeDescriptorContext).Assembly.Location)) + .AddReferences(MetadataReference.CreateFromFile(typeof(ISupportInitialize).Assembly.Location)) + .AddReferences(MetadataReference.CreateFromFile(typeof(TypeConverterAttribute).Assembly.Location)) + .AddSyntaxTrees(CSharpSyntaxTree.ParseText(source)); + } +} \ No newline at end of file diff --git a/src/XamlNameReferenceGenerator.Tests/XamlNameReferenceGenerator.Tests.csproj b/src/XamlNameReferenceGenerator.Tests/XamlNameReferenceGenerator.Tests.csproj new file mode 100644 index 0000000000..36f228e53d --- /dev/null +++ b/src/XamlNameReferenceGenerator.Tests/XamlNameReferenceGenerator.Tests.csproj @@ -0,0 +1,23 @@ + + + Exe + net5 + preview + + + + + + + + + + + + + + + + + + diff --git a/src/XamlNameReferenceGenerator.Tests/XamlXNameReferenceXamlParserTests.cs b/src/XamlNameReferenceGenerator.Tests/XamlXNameReferenceXamlParserTests.cs new file mode 100644 index 0000000000..51b8700825 --- /dev/null +++ b/src/XamlNameReferenceGenerator.Tests/XamlXNameReferenceXamlParserTests.cs @@ -0,0 +1,13 @@ +using Xunit; + +namespace XamlNameReferenceGenerator.Tests +{ + public class XamlXNameReferenceXamlParserTests + { + [Fact] + public void Should_Resolve_Named_Controls_From_Xaml_Markup() + { + // TODO: Fix all stuff. + } + } +} \ No newline at end of file diff --git a/src/XamlNameReferenceGenerator.sln b/src/XamlNameReferenceGenerator.sln index 5d55b96e20..4e636ae3b2 100644 --- a/src/XamlNameReferenceGenerator.sln +++ b/src/XamlNameReferenceGenerator.sln @@ -4,6 +4,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlNameReferenceGenerator" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlNameReferenceGenerator.Sandbox", "XamlNameReferenceGenerator.Sandbox\XamlNameReferenceGenerator.Sandbox.csproj", "{C90BB1C6-5C33-494A-96FA-FEE7B34CA83C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamlNameReferenceGenerator.Tests", "XamlNameReferenceGenerator.Tests\XamlNameReferenceGenerator.Tests.csproj", "{B13A0A44-85BC-49A7-970F-6C9BF8BDFD54}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -18,5 +20,9 @@ Global {C90BB1C6-5C33-494A-96FA-FEE7B34CA83C}.Debug|Any CPU.Build.0 = Debug|Any CPU {C90BB1C6-5C33-494A-96FA-FEE7B34CA83C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C90BB1C6-5C33-494A-96FA-FEE7B34CA83C}.Release|Any CPU.Build.0 = Release|Any CPU + {B13A0A44-85BC-49A7-970F-6C9BF8BDFD54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B13A0A44-85BC-49A7-970F-6C9BF8BDFD54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B13A0A44-85BC-49A7-970F-6C9BF8BDFD54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B13A0A44-85BC-49A7-970F-6C9BF8BDFD54}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/XamlNameReferenceGenerator/Infrastructure/MiniCompiler.cs b/src/XamlNameReferenceGenerator/Infrastructure/MiniCompiler.cs index f8309bc343..8eb57f5126 100644 --- a/src/XamlNameReferenceGenerator/Infrastructure/MiniCompiler.cs +++ b/src/XamlNameReferenceGenerator/Infrastructure/MiniCompiler.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using XamlX.Compiler; using XamlX.Emit; using XamlX.Transform; @@ -9,13 +10,16 @@ namespace XamlNameReferenceGenerator.Infrastructure { internal sealed class MiniCompiler : XamlCompiler { - public static MiniCompiler CreateDefault(RoslynTypeSystem typeSystem) + public static MiniCompiler CreateDefault(RoslynTypeSystem typeSystem, params string[] additionalTypes) { - var avaloniaXmlns = typeSystem.GetType("Avalonia.Metadata.XmlnsDefinitionAttribute"); + var mappings = new XamlLanguageTypeMappings(typeSystem); + foreach (var additionalType in additionalTypes) + mappings.XmlnsAttributes.Add(typeSystem.GetType(additionalType)); + var configuration = new TransformerConfiguration( typeSystem, typeSystem.Assemblies[0], - new XamlLanguageTypeMappings(typeSystem) {XmlnsAttributes = {avaloniaXmlns}}); + mappings); return new MiniCompiler(configuration); } diff --git a/src/XamlNameReferenceGenerator/NameReferenceGenerator.cs b/src/XamlNameReferenceGenerator/NameReferenceGenerator.cs index 2cfbd05979..48e0e65373 100644 --- a/src/XamlNameReferenceGenerator/NameReferenceGenerator.cs +++ b/src/XamlNameReferenceGenerator/NameReferenceGenerator.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; using System.Text; @@ -8,6 +9,8 @@ using Microsoft.CodeAnalysis.CSharp; using XamlNameReferenceGenerator.Infrastructure; using XamlNameReferenceGenerator.Parsers; +[assembly: InternalsVisibleTo("XamlNameReferenceGenerator.Tests")] + namespace XamlNameReferenceGenerator { [Generator] diff --git a/src/XamlNameReferenceGenerator/Parsers/XamlXNameReferenceXamlParser.cs b/src/XamlNameReferenceGenerator/Parsers/XamlXNameReferenceXamlParser.cs index a286027fcc..e08ddcbac5 100644 --- a/src/XamlNameReferenceGenerator/Parsers/XamlXNameReferenceXamlParser.cs +++ b/src/XamlNameReferenceGenerator/Parsers/XamlXNameReferenceXamlParser.cs @@ -8,6 +8,7 @@ namespace XamlNameReferenceGenerator.Parsers { internal class XamlXNameReferenceXamlParser : INameReferenceXamlParser { + private const string AvaloniaXmlnsAttribute = "Avalonia.Metadata.XmlnsDefinitionAttribute"; private readonly CSharpCompilation _compilation; public XamlXNameReferenceXamlParser(CSharpCompilation compilation) => _compilation = compilation; @@ -20,7 +21,7 @@ namespace XamlNameReferenceGenerator.Parsers }); MiniCompiler - .CreateDefault(new RoslynTypeSystem(_compilation)) + .CreateDefault(new RoslynTypeSystem(_compilation), AvaloniaXmlnsAttribute) .Transform(parsed); var visitor = new NamedControlCollector();