Browse Source

housekeeping: Add XamlNameReferenceGenerator.Tests (#7)

* Add basic MiniCompiler unit tests
* Add XamlX tests stub file
pull/10407/head
Artyom V. Gorchakov 6 years ago
committed by GitHub
parent
commit
7fc979fec8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 51
      src/XamlNameReferenceGenerator.Tests/MiniCompilerTests.cs
  2. 23
      src/XamlNameReferenceGenerator.Tests/XamlNameReferenceGenerator.Tests.csproj
  3. 13
      src/XamlNameReferenceGenerator.Tests/XamlXNameReferenceXamlParserTests.cs
  4. 6
      src/XamlNameReferenceGenerator.sln
  5. 10
      src/XamlNameReferenceGenerator/Infrastructure/MiniCompiler.cs
  6. 3
      src/XamlNameReferenceGenerator/NameReferenceGenerator.cs
  7. 3
      src/XamlNameReferenceGenerator/Parsers/XamlXNameReferenceXamlParser.cs

51
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 = "<Invalid xmlns='clr-namespace:Example;assembly=Example' />";
private const string MiniValidXaml = "<Valid xmlns='clr-namespace:Example;assembly=Example' />";
[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<XamlParseException>(() => 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));
}
}

23
src/XamlNameReferenceGenerator.Tests/XamlNameReferenceGenerator.Tests.csproj

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5</TargetFramework>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.8.0-3.final" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.console" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="0.10.0-preview5" />
<PackageReference Include="Avalonia.Desktop" Version="0.10.0-preview5" />
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.0-preview5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../XamlNameReferenceGenerator/XamlNameReferenceGenerator.csproj" />
</ItemGroup>
</Project>

13
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.
}
}
}

6
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

10
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<object, IXamlEmitResult>
{
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);
}

3
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]

3
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();

Loading…
Cancel
Save