Skip to content

Commit bcdbc57

Browse files
committed
Fixing test perf by caching nuget ref
1 parent 47cbde0 commit bcdbc57

8 files changed

+118
-115
lines changed

src/Tests/ExampleTests.cs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1-
using System.Collections.Immutable;
2-
using AutoCtor;
1+
using AutoCtor;
32
using Microsoft.CodeAnalysis;
4-
using Microsoft.CodeAnalysis.CSharp;
53
using static ExampleTestsHelper;
64

5+
#if ROSLYN_4_4
6+
using Microsoft.CodeAnalysis.CSharp;
7+
#endif
8+
79
public class ExampleTests
810
{
911
[Test]
10-
[MethodDataSource(nameof(GetExamples))]
11-
public async Task ExamplesGeneratedCode(CodeFileTheoryData theoryData)
12+
[CombinedDataSources]
13+
public async Task ExamplesGeneratedCode(
14+
[MethodDataSource(nameof(GetExamples))] CodeFileTheoryData theoryData,
15+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)] CompilationBuilderFactory builderFactory)
1216
{
13-
var builder = CreateCompilation(theoryData);
14-
var compilation = await builder.Build(nameof(ExampleTests), TestHelper.CancellationToken)
15-
.ConfigureAwait(false);
17+
var builder = builderFactory.Create(theoryData);
18+
var compilation = builder.Build(nameof(ExampleTests));
1619
var driver = new GeneratorDriverBuilder()
1720
.AddGenerator(new AutoConstructSourceGenerator())
1821
.WithAnalyzerOptions(theoryData.Options)
@@ -27,12 +30,13 @@ await Verify(driver)
2730
}
2831

2932
[Test]
30-
[MethodDataSource(nameof(GetExamples))]
31-
public async Task CodeCompilesProperly(CodeFileTheoryData theoryData)
33+
[CombinedDataSources]
34+
public async Task CodeCompilesProperly(
35+
[MethodDataSource(nameof(GetExamples))] CodeFileTheoryData theoryData,
36+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)] CompilationBuilderFactory builderFactory)
3237
{
33-
var builder = CreateCompilation(theoryData);
34-
var compilation = await builder.Build(nameof(ExampleTests), TestHelper.CancellationToken)
35-
.ConfigureAwait(false);
38+
var builder = builderFactory.Create(theoryData);
39+
var compilation = builder.Build(nameof(ExampleTests));
3640
new GeneratorDriverBuilder()
3741
.AddGenerator(new AutoConstructSourceGenerator())
3842
.WithAnalyzerOptions(theoryData.Options)
@@ -51,12 +55,13 @@ await Assert.That(outputCompilation.GetDiagnostics(TestHelper.CancellationToken)
5155

5256
#if ROSLYN_4_4
5357
[Test]
54-
[MethodDataSource(nameof(GetExamples))]
55-
public async Task EnsureRunsAreCachedCorrectly(CodeFileTheoryData theoryData)
58+
[CombinedDataSources]
59+
public async Task EnsureRunsAreCachedCorrectly(
60+
[MethodDataSource(nameof(GetExamples))] CodeFileTheoryData theoryData,
61+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)] CompilationBuilderFactory builderFactory)
5662
{
57-
var builder = CreateCompilation(theoryData);
58-
var compilation = await builder.Build(nameof(ExampleTests), TestHelper.CancellationToken)
59-
.ConfigureAwait(false);
63+
var builder = builderFactory.Create(theoryData);
64+
var compilation = builder.Build(nameof(ExampleTests));
6065

6166
var driver = new GeneratorDriverBuilder()
6267
.AddGenerator(new AutoConstructSourceGenerator())
@@ -84,12 +89,9 @@ await AssertRunsEqual(firstResult, secondResult,
8489

8590
// ----------------------------------------------------------------------------------------
8691

87-
private static CompilationBuilder CreateCompilation(CodeFileTheoryData theoryData)
92+
public class CompilationBuilderFactory : CompilationBuilderFactoryBase<AutoConstructAttribute>
8893
{
89-
var version = TestFileHelper.GetPackageVersion("Microsoft.Extensions.DependencyInjection.Abstractions");
90-
91-
return CreateCompilation<AutoConstructAttribute>(theoryData)
92-
.AddNugetReference("Microsoft.Extensions.DependencyInjection.Abstractions", version);
94+
protected override IEnumerable<string> GetNuGetIds() => ["Microsoft.Extensions.DependencyInjection.Abstractions"];
9395
}
9496

9597
private static IEnumerable<string> GetExamplesFiles(string path)

src/Tests/GeneratedAttributeTests.AttributeGeneratedCode#AutoConstructAttribute.g.verified.cs renamed to src/Tests/GeneratedAttributeTests.AttributeGeneratedCode_builderFactory=GeneratedAttributeTests+CompilationBuilderFactory#AutoConstructAttribute.g.verified.cs

File renamed without changes.

src/Tests/GeneratedAttributeTests.cs

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
using AutoCtor;
2+
using static ExampleTestsHelper;
23

34
public class GeneratedAttributeTests
45
{
56
[Test]
6-
public async Task AttributeGeneratedCode()
7+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)]
8+
public async Task AttributeGeneratedCode(CompilationBuilderFactory builderFactory)
79
{
8-
var builder = new CompilationBuilder()
9-
.AddNetCoreReference()
10+
var builder = builderFactory.Builder
1011
.WithPreprocessorSymbols(["AUTOCTOR_EMBED_ATTRIBUTES"]);
11-
var compilation = await builder.Build(nameof(GeneratedAttributeTests), TestHelper.CancellationToken)
12-
.ConfigureAwait(false);
12+
var compilation = builder.Build(nameof(GeneratedAttributeTests));
1313
var driver = new GeneratorDriverBuilder()
1414
.AddGenerator(new AttributeSourceGenerator())
1515
.Build(builder.ParseOptions)
@@ -20,13 +20,12 @@ await Verify(driver)
2020
}
2121

2222
[Test]
23-
public async Task AttributeCompilesProperly()
23+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)]
24+
public async Task AttributeCompilesProperly(CompilationBuilderFactory builderFactory)
2425
{
25-
var builder = new CompilationBuilder()
26-
.AddNetCoreReference()
26+
var builder = builderFactory.Builder
2727
.WithPreprocessorSymbols(["AUTOCTOR_EMBED_ATTRIBUTES"]);
28-
var compilation = await builder.Build(nameof(GeneratedAttributeTests), TestHelper.CancellationToken)
29-
.ConfigureAwait(false);
28+
var compilation = builder.Build(nameof(GeneratedAttributeTests));
3029
var driver = new GeneratorDriverBuilder()
3130
.AddGenerator(new AttributeSourceGenerator())
3231
.Build(builder.ParseOptions)
@@ -46,14 +45,13 @@ await Assert.That(outputCompilationDiagnostics).IsEmpty()
4645
}
4746

4847
[Test]
49-
public async Task PreserveAttributesTest()
48+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)]
49+
public async Task PreserveAttributesTest(CompilationBuilderFactory builderFactory)
5050
{
51-
var builder = new CompilationBuilder()
52-
.AddNetCoreReference()
51+
var builder = builderFactory.Builder
5352
.AddCode("[AutoCtor.AutoConstruct] public partial class Test { }")
5453
.WithPreprocessorSymbols(["AUTOCTOR_EMBED_ATTRIBUTES", "AUTOCTOR_USAGES"]);
55-
var compilation = await builder.Build(nameof(GeneratedAttributeTests), TestHelper.CancellationToken)
56-
.ConfigureAwait(false);
54+
var compilation = builder.Build(nameof(GeneratedAttributeTests));
5755

5856
var driver = new GeneratorDriverBuilder()
5957
.AddGenerator(new AttributeSourceGenerator())
@@ -75,27 +73,24 @@ await Assert.That(outputCompilationDiagnostics).IsEmpty()
7573
}
7674

7775
[Test]
78-
public async Task EnsureGeneratedAttributesAreNotExternallyVisible()
76+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)]
77+
public async Task EnsureGeneratedAttributesAreNotExternallyVisible(CompilationBuilderFactory builderFactory)
7978
{
8079
// Issue 312
81-
var compileBuilder = new CompilationBuilder()
82-
.AddNetCoreReference()
80+
var compileBuilder = builderFactory.Builder
8381
.WithPreprocessorSymbols(["AUTOCTOR_EMBED_ATTRIBUTES"]);
8482

8583
var genDriver = new GeneratorDriverBuilder()
8684
.AddGenerator(new AttributeSourceGenerator())
8785
.Build(compileBuilder.ParseOptions);
8886

89-
var projectA = await compileBuilder
90-
.Build("ProjectA", TestHelper.CancellationToken)
91-
.ConfigureAwait(false);
87+
var projectA = compileBuilder.Build("ProjectA");
9288

9389
genDriver = genDriver.RunGeneratorsAndUpdateCompilation(projectA, out var genProjectA, out _, TestHelper.CancellationToken);
9490

95-
var projectB = await compileBuilder
91+
var projectB = compileBuilder
9692
.AddCompilationReference(genProjectA)
97-
.Build("ProjectB", TestHelper.CancellationToken)
98-
.ConfigureAwait(false);
93+
.Build("ProjectB");
9994

10095
genDriver.RunGeneratorsAndUpdateCompilation(
10196
projectB,
@@ -111,4 +106,6 @@ await Assert.That(diagnostics).IsEmpty()
111106
await Assert.That(outputCompilationDiagnostics).IsEmpty()
112107
.ConfigureAwait(false);
113108
}
109+
110+
public class CompilationBuilderFactory : CompilationBuilderFactoryBase;
114111
}

src/Tests/Issue73.VerifyGeneratedCode#B.TheClass.g.verified.cs renamed to src/Tests/Issue73.VerifyGeneratedCode_builderFactory=Issue73+CompilationBuilderFactory#B.TheClass.g.verified.cs

File renamed without changes.

src/Tests/Issue73.cs

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
using AutoCtor;
22
using Microsoft.CodeAnalysis;
33
using Microsoft.CodeAnalysis.CSharp;
4+
using static ExampleTestsHelper;
45

56
public class Issue73
67
{
78
[Test]
8-
public async Task VerifyGeneratedCode()
9+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)]
10+
public async Task VerifyGeneratedCode(CompilationBuilderFactory builderFactory)
911
{
10-
var common = Common();
11-
var compilation = await Compile(common)
12-
.ConfigureAwait(false);
12+
var builder = builderFactory.Builder;
13+
var compilation = Compile(builder);
1314
var driver = new GeneratorDriverBuilder()
1415
.AddGenerator(new AutoConstructSourceGenerator())
15-
.Build(common.ParseOptions)
16+
.Build(builder.ParseOptions)
1617
.RunGenerators(compilation, TestHelper.CancellationToken);
1718

1819
await Verify(driver)
1920
.ConfigureAwait(false);
2021
}
2122

2223
[Test]
23-
public async Task CodeCompilesWithoutErrors()
24+
[ClassDataSource<CompilationBuilderFactory>(Shared = SharedType.PerTestSession)]
25+
public async Task CodeCompilesWithoutErrors(CompilationBuilderFactory builderFactory)
2426
{
2527
string[] ignoredWarnings = ["CS0414"]; // Ignore unused fields
2628

27-
var common = Common();
28-
var compilation = await Compile(common)
29-
.ConfigureAwait(false);
29+
var builder = builderFactory.Builder;
30+
var compilation = Compile(builder);
3031
new GeneratorDriverBuilder()
3132
.AddGenerator(new AutoConstructSourceGenerator())
32-
.Build(common.ParseOptions)
33+
.Build(builder.ParseOptions)
3334
.RunGeneratorsAndUpdateCompilation(
3435
compilation,
3536
out var outputCompilation,
@@ -46,14 +47,7 @@ await Assert.That(outputCompilationDiagnostics).IsEmpty()
4647
.ConfigureAwait(false);
4748
}
4849

49-
private static CompilationBuilder Common()
50-
{
51-
return new CompilationBuilder()
52-
.AddNetCoreReference()
53-
.AddAssemblyReference<AutoConstructAttribute>();
54-
}
55-
56-
private static async Task<CSharpCompilation> Compile(CompilationBuilder common)
50+
private static CSharpCompilation Compile(CompilationBuilder common)
5751
{
5852
var projectACode = @"
5953
namespace A
@@ -75,17 +69,17 @@ public abstract class BaseClass<T, U, V>
7569
public sealed partial class TheClass : BaseClass<object, int, string>{}
7670
}
7771
";
78-
var projectA = await common
72+
var projectA = common
7973
.AddCode(projectACode)
80-
.Build("ProjectA", TestHelper.CancellationToken)
81-
.ConfigureAwait(false);
74+
.Build("ProjectA");
8275

83-
var projectB = await common
76+
var projectB = common
8477
.AddCompilationReference(projectA)
8578
.AddCode(projectBCode)
86-
.Build("ProjectB", TestHelper.CancellationToken)
87-
.ConfigureAwait(false);
79+
.Build("ProjectB");
8880

8981
return projectB;
9082
}
83+
84+
public class CompilationBuilderFactory : CompilationBuilderFactoryBase<AutoConstructAttribute>;
9185
}

src/Tests/Utilities/CompilationBuilder.cs

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
using System.Collections.Immutable;
22
using Microsoft.CodeAnalysis;
33
using Microsoft.CodeAnalysis.CSharp;
4-
using Microsoft.CodeAnalysis.Testing;
54

6-
internal class CompilationBuilder
5+
public class CompilationBuilder
76
{
8-
private const string DEFAULT_TARGET_FRAMEWORK = "net9.0";
9-
10-
private ImmutableArray<ReferenceAssemblies> _nugetReferences;
117
private ImmutableArray<MetadataReference> _references;
128
private ImmutableArray<string> _codes;
139

@@ -18,7 +14,6 @@ internal class CompilationBuilder
1814

1915
public CompilationBuilder()
2016
{
21-
_nugetReferences = [];
2217
_references = [];
2318
_codes = [];
2419

@@ -28,51 +23,29 @@ public CompilationBuilder()
2823

2924
private CompilationBuilder(CompilationBuilder other)
3025
{
31-
_nugetReferences = other._nugetReferences;
3226
_references = other._references;
3327
_codes = other._codes;
3428

3529
_parseOptions = other._parseOptions;
3630
_compilationOptions = other._compilationOptions;
3731
}
3832

39-
public async Task<CSharpCompilation> Build(string assemblyName, CancellationToken cancellationToken = default)
33+
public CSharpCompilation Build(string assemblyName)
4034
{
41-
var nugetReferences = await _nugetReferences.ToAsyncEnumerable()
42-
.SelectMany<ReferenceAssemblies, MetadataReference>(static async (r, ct) =>
43-
await r.ResolveAsync(null, ct)
44-
.ConfigureAwait(false))
45-
.ToListAsync(cancellationToken)
46-
.ConfigureAwait(false);
47-
4835
return CSharpCompilation.Create(assemblyName)
49-
.AddReferences(nugetReferences)
5036
.AddReferences(_references)
5137
.AddSyntaxTrees(_codes.Select(c => CSharpSyntaxTree.ParseText(c, _parseOptions)))
5238
.WithOptions(_compilationOptions);
5339
}
5440

55-
public CompilationBuilder AddNugetReference(string id, string version, string targetFramework = DEFAULT_TARGET_FRAMEWORK, string path = "")
41+
public CompilationBuilder AddReferences(params IEnumerable<MetadataReference> references)
5642
{
5743
return new(this)
5844
{
59-
_nugetReferences = _nugetReferences.Add(new(
60-
targetFramework,
61-
new(id, version),
62-
Path.Join(string.IsNullOrEmpty(path) ? "lib" : path, targetFramework)
63-
))
45+
_references = _references.AddRange(references)
6446
};
6547
}
6648

67-
public CompilationBuilder AddNetCoreReference(
68-
string targetFramework = DEFAULT_TARGET_FRAMEWORK,
69-
string? version = null)
70-
=> AddNugetReference(
71-
"Microsoft.NETCore.App.Ref",
72-
version ?? TestFileHelper.GetPackageVersion("Microsoft.NETCore.App.Ref"),
73-
targetFramework,
74-
"ref");
75-
7649
public CompilationBuilder AddAssemblyReference<T>()
7750
{
7851
return new(this)

0 commit comments

Comments
 (0)