diff --git a/Dango.sln b/Dango.sln index 83cb503..cb6a19a 100644 --- a/Dango.sln +++ b/Dango.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dango", "src\Dango\Dango.csproj", "{0C1C7D4D-55C2-4083-BB84-8FA2DC171B0E}" EndProject @@ -6,7 +6,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dango.Abstractions", "src\D EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{1802D0C6-8F63-40F7-A865-03FC7526E6BE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dango.Tests", "test\Dango.Tests\Dango.Tests.csproj", "{436B51E5-ACF9-4F52-866B-A4C99F5C01E4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dango.Tests.Utils", "test\Dango.Tests.Utils\Dango.Tests.Utils.csproj", "{A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dango.Unit.Tests", "test\Dango.Unit.Tests\Dango.Unit.Tests.csproj", "{436B51E5-ACF9-4F52-866B-A4C99F5C01E4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -22,12 +24,17 @@ Global {91D3200F-AAF2-4C9C-9EF1-5549799FAF68}.Debug|Any CPU.Build.0 = Debug|Any CPU {91D3200F-AAF2-4C9C-9EF1-5549799FAF68}.Release|Any CPU.ActiveCfg = Release|Any CPU {91D3200F-AAF2-4C9C-9EF1-5549799FAF68}.Release|Any CPU.Build.0 = Release|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D}.Release|Any CPU.Build.0 = Release|Any CPU {436B51E5-ACF9-4F52-866B-A4C99F5C01E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {436B51E5-ACF9-4F52-866B-A4C99F5C01E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {436B51E5-ACF9-4F52-866B-A4C99F5C01E4}.Release|Any CPU.ActiveCfg = Release|Any CPU {436B51E5-ACF9-4F52-866B-A4C99F5C01E4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution + {A1B2C3D4-E5F6-4A5B-8C9D-0E1F2A3B4C5D} = {1802D0C6-8F63-40F7-A865-03FC7526E6BE} {436B51E5-ACF9-4F52-866B-A4C99F5C01E4} = {1802D0C6-8F63-40F7-A865-03FC7526E6BE} EndGlobalSection EndGlobal diff --git a/test/Dango.Tests.Utils/Dango.Tests.Utils.csproj b/test/Dango.Tests.Utils/Dango.Tests.Utils.csproj new file mode 100644 index 0000000..7123146 --- /dev/null +++ b/test/Dango.Tests.Utils/Dango.Tests.Utils.csproj @@ -0,0 +1,21 @@ + + + + net10.0 + latest + enable + enable + false + true + + + + + + + + + + + + diff --git a/test/Dango.Tests.Utils/EnumDefinitionBuilder.cs b/test/Dango.Tests.Utils/EnumDefinitionBuilder.cs new file mode 100644 index 0000000..f11fdb1 --- /dev/null +++ b/test/Dango.Tests.Utils/EnumDefinitionBuilder.cs @@ -0,0 +1,36 @@ +using System.Text; + +namespace Dango.Tests.Utils; + +public static class EnumDefinitionBuilder +{ + public static string BuildEnumDefinition(string enumName, int valueCount, string? namespaceName = null) + { + var values = Enumerable.Range(0, valueCount) + .Select(i => $"Value{i}") + .ToList(); + + return BuildEnumDefinitionWithValues(enumName, values, namespaceName); + } + + public static string BuildEnumDefinitionWithValues(string enumName, IEnumerable values, string? namespaceName = null) + { + var sb = new StringBuilder(); + + if (!string.IsNullOrEmpty(namespaceName)) + { + sb.AppendLine($"namespace {namespaceName};"); + sb.AppendLine(); + } + + sb.AppendLine($"public enum {enumName}"); + sb.AppendLine("{"); + foreach (var value in values) + { + sb.AppendLine($" {value},"); + } + sb.AppendLine("}"); + + return sb.ToString(); + } +} diff --git a/test/Dango.Tests.Utils/GeneratorTestHelper.cs b/test/Dango.Tests.Utils/GeneratorTestHelper.cs new file mode 100644 index 0000000..f2fddad --- /dev/null +++ b/test/Dango.Tests.Utils/GeneratorTestHelper.cs @@ -0,0 +1,47 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; + +namespace Dango.Tests.Utils; + +public static class GeneratorTestHelper +{ + public static Compilation CreateCompilation(string source, params string[] additionalSources) + { + var syntaxTrees = new[] { source } + .Concat(additionalSources) + .Select(s => CSharpSyntaxTree.ParseText(s)) + .ToArray(); + + var references = AppDomain + .CurrentDomain.GetAssemblies() + .Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location)) + .Select(a => MetadataReference.CreateFromFile(a.Location)) + .Cast() + .ToList(); + + references.Add( + MetadataReference.CreateFromFile( + typeof(Abstractions.IDangoMapperRegistrar).Assembly.Location + ) + ); + + return CSharpCompilation.Create( + "Test.Assembly", + syntaxTrees, + references, + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) + ); + } + + public static GeneratorDriverRunResult RunGenerator(string source, params string[] additionalSources) + { + var compilation = CreateCompilation(source, additionalSources); + var generator = new DangoGenerator(); + var driver = CSharpGeneratorDriver.Create(generator); + + driver = (CSharpGeneratorDriver) + driver.RunGeneratorsAndUpdateCompilation(compilation, out _, out _); + + return driver.GetRunResult(); + } +} diff --git a/test/Dango.Tests.Utils/MappingRegistrarBuilder.cs b/test/Dango.Tests.Utils/MappingRegistrarBuilder.cs new file mode 100644 index 0000000..b4a83d3 --- /dev/null +++ b/test/Dango.Tests.Utils/MappingRegistrarBuilder.cs @@ -0,0 +1,88 @@ +using System.Text; + +namespace Dango.Tests.Utils; + +public static class MappingRegistrarBuilder +{ + public static string BuildRegistrar( + IEnumerable<(string SourceEnum, string DestinationEnum, MappingConfig Config)> mappings, + string? namespaceName = null, + string registrarClassName = "MyRegistrar") + { + var namespaceDeclaration = string.IsNullOrEmpty(namespaceName) + ? "" + : $"namespace {namespaceName};\n\n"; + + var sb = new StringBuilder(); + + sb.AppendLine("using Dango.Abstractions;"); + sb.AppendLine("using System.Collections.Generic;"); + + if (!string.IsNullOrEmpty(namespaceName)) + { + sb.AppendLine(); + sb.AppendLine($"namespace {namespaceName};"); + sb.AppendLine(); + } + + sb.AppendLine($"public class {registrarClassName} : IDangoMapperRegistrar"); + sb.AppendLine("{"); + sb.AppendLine(" public void Register(IDangoMapperRegistry registry)"); + sb.AppendLine(" {"); + + foreach (var (sourceEnum, destinationEnum, config) in mappings) + { + sb.Append($" registry.Enum<{sourceEnum}, {destinationEnum}>()"); + + if (config.Strategy == MappingStrategy.ByValue) + { + sb.Append(".MapByValue()"); + } + else if (config.Strategy == MappingStrategy.ByName) + { + sb.Append(".MapByName()"); + } + + if (config.DefaultValue != null) + { + sb.Append($".WithDefault({destinationEnum}.{config.DefaultValue})"); + } + + if (config.Overrides != null && config.Overrides.Count > 0) + { + sb.AppendLine(" .WithOverrides(new Dictionary<"); + sb.Append($"{sourceEnum}, {destinationEnum}>"); + sb.AppendLine(" {"); + + foreach (var (source, dest) in config.Overrides) + { + sb.AppendLine($" {{ {sourceEnum}.{source}, {destinationEnum}.{dest} }},"); + } + + sb.Append(" })"); + } + + sb.AppendLine(";"); + } + + sb.AppendLine(" }"); + sb.AppendLine("}"); + + return sb.ToString(); + } +} + +public class MappingConfig +{ + public MappingStrategy Strategy { get; set; } = MappingStrategy.ByName; + + public string? DefaultValue { get; set; } + + public Dictionary? Overrides { get; set; } +} + +public enum MappingStrategy +{ + ByName, + ByValue +} diff --git a/test/Dango.Tests/Dango.Tests.csproj b/test/Dango.Unit.Tests/Dango.Unit.Tests.csproj similarity index 88% rename from test/Dango.Tests/Dango.Tests.csproj rename to test/Dango.Unit.Tests/Dango.Unit.Tests.csproj index 80ef6b3..8be3eba 100644 --- a/test/Dango.Tests/Dango.Tests.csproj +++ b/test/Dango.Unit.Tests/Dango.Unit.Tests.csproj @@ -1,4 +1,4 @@ - + net10.0 @@ -23,6 +23,7 @@ + diff --git a/test/Dango.Tests/DangoGenerator.Basic.cs b/test/Dango.Unit.Tests/DangoGenerator.Basic.cs similarity index 50% rename from test/Dango.Tests/DangoGenerator.Basic.cs rename to test/Dango.Unit.Tests/DangoGenerator.Basic.cs index 801ed21..d6eae1e 100644 --- a/test/Dango.Tests/DangoGenerator.Basic.cs +++ b/test/Dango.Unit.Tests/DangoGenerator.Basic.cs @@ -1,51 +1,11 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; using Dango.ErrorHandling; +using Dango.Tests.Utils; -namespace Dango.Tests; +namespace Dango.Unit.Tests; [TestFixture] public partial class DangoGeneratorTests { - private static GeneratorDriverRunResult RunGenerator( - string source, - params string[] additionalSources - ) - { - var syntaxTrees = new[] { source } - .Concat(additionalSources) - .Select(s => CSharpSyntaxTree.ParseText(s)) - .ToArray(); - - var references = AppDomain - .CurrentDomain.GetAssemblies() - .Where(a => !a.IsDynamic && !string.IsNullOrWhiteSpace(a.Location)) - .Select(a => MetadataReference.CreateFromFile(a.Location)) - .Cast() - .ToList(); - - references.Add( - MetadataReference.CreateFromFile( - typeof(Abstractions.IDangoMapperRegistrar).Assembly.Location - ) - ); - - var compilation = CSharpCompilation.Create( - "Test.Assembly", - syntaxTrees, - references, - new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) - ); - - var generator = new DangoGenerator(); - var driver = CSharpGeneratorDriver.Create(generator); - - driver = (CSharpGeneratorDriver) - driver.RunGeneratorsAndUpdateCompilation(compilation, out _, out _); - - return driver.GetRunResult(); - } - [Test] public void Generator_WithNoRegistrars_GeneratesNoOutputWithWarning() { @@ -57,7 +17,7 @@ public class MyClass } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That( result.Diagnostics.Single().Id, @@ -83,7 +43,7 @@ public class MyRegistrar : IDangoMapperRegistrar } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That( result.Diagnostics.Single().Id, @@ -109,7 +69,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That(result.GeneratedTrees, Is.Empty); diff --git a/test/Dango.Tests/DangoGeneratorTests.Configuration.cs b/test/Dango.Unit.Tests/DangoGeneratorTests.Configuration.cs similarity index 95% rename from test/Dango.Tests/DangoGeneratorTests.Configuration.cs rename to test/Dango.Unit.Tests/DangoGeneratorTests.Configuration.cs index 0124941..d72c730 100644 --- a/test/Dango.Tests/DangoGeneratorTests.Configuration.cs +++ b/test/Dango.Unit.Tests/DangoGeneratorTests.Configuration.cs @@ -1,4 +1,6 @@ -namespace Dango.Tests; +using Dango.Tests.Utils; + +namespace Dango.Unit.Tests; public partial class DangoGeneratorTests { @@ -23,7 +25,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -86,7 +88,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -150,7 +152,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -222,7 +224,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -261,7 +263,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -304,7 +306,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -380,7 +382,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -457,7 +459,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -534,7 +536,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( diff --git a/test/Dango.Tests/DangoGeneratorTests.Mappings.cs b/test/Dango.Unit.Tests/DangoGeneratorTests.Mappings.cs similarity index 96% rename from test/Dango.Tests/DangoGeneratorTests.Mappings.cs rename to test/Dango.Unit.Tests/DangoGeneratorTests.Mappings.cs index af9f311..bab3848 100644 --- a/test/Dango.Tests/DangoGeneratorTests.Mappings.cs +++ b/test/Dango.Unit.Tests/DangoGeneratorTests.Mappings.cs @@ -1,4 +1,6 @@ -namespace Dango.Tests; +using Dango.Tests.Utils; + +namespace Dango.Unit.Tests; public partial class DangoGeneratorTests { @@ -31,7 +33,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -98,7 +100,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -182,7 +184,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( diff --git a/test/Dango.Tests/DangoGeneratorTests.Naming.cs b/test/Dango.Unit.Tests/DangoGeneratorTests.Naming.cs similarity index 94% rename from test/Dango.Tests/DangoGeneratorTests.Naming.cs rename to test/Dango.Unit.Tests/DangoGeneratorTests.Naming.cs index afbe15d..3152e86 100644 --- a/test/Dango.Tests/DangoGeneratorTests.Naming.cs +++ b/test/Dango.Unit.Tests/DangoGeneratorTests.Naming.cs @@ -1,4 +1,6 @@ -namespace Dango.Tests; +using Dango.Tests.Utils; + +namespace Dango.Unit.Tests; public partial class DangoGeneratorTests { @@ -37,7 +39,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -104,7 +106,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That( @@ -171,7 +173,7 @@ public void Register(IDangoMapperRegistry registry) } }"; - var result = RunGenerator(source); + var result = GeneratorTestHelper.RunGenerator(source); Assert.That(result.Diagnostics, Is.Empty); Assert.That(