From f2a7e4b708e4d931d4df8254682daea67287a120 Mon Sep 17 00:00:00 2001 From: Oleksandr Liakhevych Date: Tue, 4 Jun 2024 15:14:52 +0300 Subject: [PATCH] Add tests for different methods --- .../{Tests.cs => AddServicesTests.cs} | 2 +- .../GeneratedMethodTests.cs | 200 ++++++++++++++++++ 2 files changed, 201 insertions(+), 1 deletion(-) rename DependencyInjection.SourceGenerator.Tests/{Tests.cs => AddServicesTests.cs} (99%) create mode 100644 DependencyInjection.SourceGenerator.Tests/GeneratedMethodTests.cs diff --git a/DependencyInjection.SourceGenerator.Tests/Tests.cs b/DependencyInjection.SourceGenerator.Tests/AddServicesTests.cs similarity index 99% rename from DependencyInjection.SourceGenerator.Tests/Tests.cs rename to DependencyInjection.SourceGenerator.Tests/AddServicesTests.cs index c61cf45..c3b0d6a 100644 --- a/DependencyInjection.SourceGenerator.Tests/Tests.cs +++ b/DependencyInjection.SourceGenerator.Tests/AddServicesTests.cs @@ -5,7 +5,7 @@ namespace DependencyInjection.SourceGenerator.Tests; -public class Tests +public class AddServicesTests { private readonly DependencyInjectionGenerator _generator = new(); diff --git a/DependencyInjection.SourceGenerator.Tests/GeneratedMethodTests.cs b/DependencyInjection.SourceGenerator.Tests/GeneratedMethodTests.cs new file mode 100644 index 0000000..c85ff76 --- /dev/null +++ b/DependencyInjection.SourceGenerator.Tests/GeneratedMethodTests.cs @@ -0,0 +1,200 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace DependencyInjection.SourceGenerator.Tests; + +public class GeneratedMethodTests +{ + private readonly DependencyInjectionGenerator _generator = new(); + + private const string Services = """ + namespace GeneratorTests; + + public interface IService { } + public class MyService : IService { } + """; + + [Theory] + [InlineData("public", "public")] + [InlineData("public", "private")] + [InlineData("internal", "private")] + [InlineData("internal", "public")] + public void StaticExtensionMethodReturningServices(string classAccessModifier, string methodAccessModifier) + { + var compilation = CreateCompilation(Services, + $$""" + using DependencyInjection.SourceGenerator; + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + {{classAccessModifier}} static partial class ServicesExtensions + { + [GenerateServiceRegistrations(AssignableTo = typeof(IService))] + {{methodAccessModifier}} static partial IServiceCollection AddServices(this IServiceCollection services); + } + """); + + var results = CSharpGeneratorDriver + .Create(_generator) + .RunGenerators(compilation) + .GetRunResult(); + + var expected = $$""" + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + {{classAccessModifier}} static partial class ServicesExtensions + { + {{methodAccessModifier}} static partial IServiceCollection AddServices(this IServiceCollection services) + { + return services + .AddTransient(); + } + } + """; + + Assert.Equal(expected, results.GeneratedTrees[1].ToString()); + } + + [Fact] + public void StaticExtensionVoidMethod() + { + var compilation = CreateCompilation(Services, + """ + using DependencyInjection.SourceGenerator; + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + public static partial class ServicesExtensions + { + [GenerateServiceRegistrations(AssignableTo = typeof(IService))] + public static partial void AddServices(this IServiceCollection services); + } + """); + + var results = CSharpGeneratorDriver + .Create(_generator) + .RunGenerators(compilation) + .GetRunResult(); + + var expected = """ + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + public static partial class ServicesExtensions + { + public static partial void AddServices(this IServiceCollection services) + { + services + .AddTransient(); + } + } + """; + + Assert.Equal(expected, results.GeneratedTrees[1].ToString()); + } + + [Fact] + public void StaticMethodReturningServices() + { + var compilation = CreateCompilation(Services, + """ + using DependencyInjection.SourceGenerator; + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + public static partial class ServicesExtensions + { + [GenerateServiceRegistrations(AssignableTo = typeof(IService))] + public static partial IServiceCollection AddServices(IServiceCollection services); + } + """); + + var results = CSharpGeneratorDriver + .Create(_generator) + .RunGenerators(compilation) + .GetRunResult(); + + var expected = """ + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + public static partial class ServicesExtensions + { + public static partial IServiceCollection AddServices( IServiceCollection services) + { + return services + .AddTransient(); + } + } + """; + + Assert.Equal(expected, results.GeneratedTrees[1].ToString()); + } + + [Fact] + public void InstanceVoidMethod() + { + var compilation = CreateCompilation(Services, + """ + using DependencyInjection.SourceGenerator; + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + public partial class ServiceType + { + [GenerateServiceRegistrations(AssignableTo = typeof(IService))] + private partial void AddServices(IServiceCollection services); + } + """); + + var results = CSharpGeneratorDriver + .Create(_generator) + .RunGenerators(compilation) + .GetRunResult(); + + var expected = """ + using Microsoft.Extensions.DependencyInjection; + + namespace GeneratorTests; + + public partial class ServiceType + { + private partial void AddServices( IServiceCollection services) + { + services + .AddTransient(); + } + } + """; + + Assert.Equal(expected, results.GeneratedTrees[1].ToString()); + } + + private static Compilation CreateCompilation(params string[] source) + { + var path = Path.GetDirectoryName(typeof(object).Assembly.Location)!; + var runtimeAssemblyPath = Path.Combine(path, "System.Runtime.dll"); + + var runtimeReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); + + return CSharpCompilation.Create("compilation", + source.Select(s => CSharpSyntaxTree.ParseText(s)), + [ + MetadataReference.CreateFromFile(typeof(object).Assembly.Location), + MetadataReference.CreateFromFile(runtimeAssemblyPath), + MetadataReference.CreateFromFile(typeof(IServiceCollection).Assembly.Location), + MetadataReference.CreateFromFile(typeof(External.IExternalService).Assembly.Location), + ], + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + } +}