Skip to content

Commit 94d8b71

Browse files
authored
feat(snapshot-tests): source generator tests (#249)
Signed-off-by: Alan Brault <alan.brault@visus.io>
1 parent e5e20a6 commit 94d8b71

11 files changed

Lines changed: 228 additions & 1 deletion

Directory.Packages.props

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@
3030
<PackageVersion Include="TUnit" Version="1.45.29" />
3131
<PackageVersion Include="Verify" Version="31.16.3" />
3232
<PackageVersion Include="Verify.DiffPlex" Version="3.1.2" />
33+
<PackageVersion Include="Verify.SourceGenerators" Version="2.5.0" />
3334
<PackageVersion Include="Verify.TUnit" Version="31.16.3" />
3435
<PackageVersion Include="WireMock.Net" Version="2.6.0" />
3536
</ItemGroup>
3637
<ItemGroup>
38+
<PackageReference Include="JetBrains.Annotations" />
3739
<PackageReference Include="Meziantou.Analyzer">
3840
<PrivateAssets>all</PrivateAssets>
3941
<IncludeAssets>analyzers</IncludeAssets>
@@ -55,4 +57,4 @@
5557
<PackageReference Include="Verify.DiffPlex" />
5658
<PackageReference Include="Verify.TUnit" />
5759
</ItemGroup>
58-
</Project>
60+
</Project>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace Visus.AddressValidation.Integration.FedEx.Tests;
2+
3+
using System.Runtime.CompilerServices;
4+
using JetBrains.Annotations;
5+
using VerifyTests.DiffPlex;
6+
7+
[UsedImplicitly]
8+
internal static class ModuleInitializer
9+
{
10+
[ModuleInitializer]
11+
public static void Initialize()
12+
{
13+
VerifyDiffPlex.Initialize(OutputType.Compact);
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace Visus.AddressValidation.Integration.Google.Tests;
2+
3+
using System.Runtime.CompilerServices;
4+
using JetBrains.Annotations;
5+
using VerifyTests.DiffPlex;
6+
7+
[UsedImplicitly]
8+
internal static class ModuleInitializer
9+
{
10+
[ModuleInitializer]
11+
public static void Initialize()
12+
{
13+
VerifyDiffPlex.Initialize(OutputType.Compact);
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace Visus.AddressValidation.Integration.PitneyBowes.Tests;
2+
3+
using System.Runtime.CompilerServices;
4+
using JetBrains.Annotations;
5+
using VerifyTests.DiffPlex;
6+
7+
[UsedImplicitly]
8+
internal static class ModuleInitializer
9+
{
10+
[ModuleInitializer]
11+
public static void Initialize()
12+
{
13+
VerifyDiffPlex.Initialize(OutputType.Compact);
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace Visus.AddressValidation.Integration.Ups.Tests;
2+
3+
using System.Runtime.CompilerServices;
4+
using JetBrains.Annotations;
5+
using VerifyTests.DiffPlex;
6+
7+
[UsedImplicitly]
8+
internal static class ModuleInitializer
9+
{
10+
[ModuleInitializer]
11+
public static void Initialize()
12+
{
13+
VerifyDiffPlex.Initialize(OutputType.Compact);
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//HintName: Visus_AddressValidation_SourceGeneration_Tests_Response_ApiData_GetCustomResponseData.g.cs
2+
// <auto-generated/>
3+
4+
#nullable enable annotations
5+
#nullable disable warnings
6+
7+
using System.Collections.Generic;
8+
9+
namespace Visus.AddressValidation.SourceGeneration.Tests
10+
{
11+
internal partial class Response
12+
{
13+
private partial class ApiData
14+
{
15+
public IReadOnlyDictionary<string, object?> GetCustomResponseData()
16+
{
17+
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
18+
{
19+
["responseId"] = ResponseId,
20+
["response"] = ResponseText
21+
};
22+
}
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//HintName: Visus_AddressValidation_SourceGeneration_Tests_ApiResponse_GetCustomResponseData.g.cs
2+
// <auto-generated/>
3+
4+
#nullable enable annotations
5+
#nullable disable warnings
6+
7+
using System.Collections.Generic;
8+
9+
namespace Visus.AddressValidation.SourceGeneration.Tests
10+
{
11+
internal partial class ApiResponse
12+
{
13+
public IReadOnlyDictionary<string, object?> GetCustomResponseData()
14+
{
15+
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
16+
{
17+
["responseId"] = ResponseId,
18+
["response"] = ResponseText
19+
};
20+
}
21+
}
22+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
extern alias sourcegen;
2+
3+
namespace Visus.AddressValidation.SourceGeneration.Tests;
4+
5+
using CustomResponseDataGenerator = sourcegen::Visus.AddressValidation.SourceGeneration.CustomResponseDataGenerator;
6+
7+
internal sealed class CustomResponseDataGeneratorTests : SourceGeneratorTestBase
8+
{
9+
protected override IEnumerable<Type> RequiredAssemblies =>
10+
[
11+
typeof(CustomResponseDataGenerator),
12+
typeof(CustomResponseDataPropertyAttribute),
13+
];
14+
15+
[Test]
16+
public Task Should_Generate_GetCustomResponseData_For_Nested_Class()
17+
{
18+
const string source = """
19+
using Visus.AddressValidation;
20+
21+
namespace Visus.AddressValidation.SourceGeneration.Tests;
22+
23+
partial class Response
24+
{
25+
public string FirstName { get; set; }
26+
27+
public string LastName { get; set; }
28+
29+
partial class ApiData
30+
{
31+
[CustomResponseDataProperty]
32+
public string ResponseId { get; set; }
33+
34+
[CustomResponseDataProperty("response")]
35+
public string ResponseText { get; set; }
36+
}
37+
}
38+
""";
39+
40+
return VerifyGenerateSourcesAsync(source, new CustomResponseDataGenerator());
41+
}
42+
43+
[Test]
44+
public Task Should_Generate_GetCustomResponseData_For_Root_Class()
45+
{
46+
const string source = """
47+
using Visus.AddressValidation;
48+
49+
namespace Visus.AddressValidation.SourceGeneration.Tests;
50+
51+
partial class ApiResponse
52+
{
53+
[CustomResponseDataProperty]
54+
public string ResponseId { get; set; }
55+
56+
[CustomResponseDataProperty("response")]
57+
public string ResponseText { get; set; }
58+
}
59+
""";
60+
61+
return VerifyGenerateSourcesAsync(source, new CustomResponseDataGenerator());
62+
}
63+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace Visus.AddressValidation.SourceGeneration.Tests;
2+
3+
using System.Runtime.CompilerServices;
4+
using JetBrains.Annotations;
5+
using VerifyTests.DiffPlex;
6+
7+
[UsedImplicitly]
8+
internal static class ModuleInitializer
9+
{
10+
[ModuleInitializer]
11+
public static void Initialize()
12+
{
13+
VerifySourceGenerators.Initialize();
14+
VerifyDiffPlex.Initialize(OutputType.Compact);
15+
}
16+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
namespace Visus.AddressValidation.SourceGeneration.Tests;
2+
3+
using System.Reflection;
4+
using Microsoft.CodeAnalysis;
5+
using Microsoft.CodeAnalysis.CSharp;
6+
7+
internal abstract class SourceGeneratorTestBase
8+
{
9+
protected abstract IEnumerable<Type> RequiredAssemblies { get; }
10+
11+
private IEnumerable<MetadataReference> AssemblyReferencesForCodeGen =>
12+
AppDomain.CurrentDomain
13+
.GetAssemblies()
14+
.Concat(new[]
15+
{
16+
typeof(Binder),
17+
}.Concat(RequiredAssemblies).Select(s => s.Assembly))
18+
.Distinct()
19+
.Where(w => !w.IsDynamic)
20+
.Select(s => MetadataReference.CreateFromFile(s.Location));
21+
22+
protected Task VerifyGenerateSourcesAsync(string source, params IIncrementalGenerator[] generators)
23+
{
24+
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(source, CSharpParseOptions.Default);
25+
26+
CSharpCompilation compilation = CSharpCompilation.Create(
27+
"compilation",
28+
[syntaxTree,],
29+
AssemblyReferencesForCodeGen,
30+
new CSharpCompilationOptions(OutputKind.ConsoleApplication));
31+
32+
CSharpGeneratorDriver driver = CSharpGeneratorDriver.Create(generators);
33+
GeneratorDriver runner = driver.RunGenerators(compilation);
34+
SettingsTask verify = Verify(runner);
35+
36+
return verify;
37+
}
38+
}

0 commit comments

Comments
 (0)