Skip to content

Commit c42c1fd

Browse files
committed
Cleaning up and organizing SampleGen test tooling
1 parent 9da7b05 commit c42c1fd

3 files changed

Lines changed: 137 additions & 152 deletions

File tree

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
using Microsoft.CodeAnalysis;
2+
using Microsoft.CodeAnalysis.CSharp;
3+
using Microsoft.CodeAnalysis.Text;
4+
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
6+
namespace CommunityToolkit.Tooling.SampleGen.Tests;
7+
8+
public static class TestHelpers
9+
{
10+
internal static void VerifyGeneratedDiagnostics<TGenerator>(string source, string markdown, params string[] diagnosticsIds)
11+
where TGenerator : class, IIncrementalGenerator, new()
12+
{
13+
VerifyGeneratedDiagnostics<TGenerator>(CSharpSyntaxTree.ParseText(source), markdown, diagnosticsIds);
14+
}
15+
16+
internal static void VerifyGeneratedDiagnostics<TGenerator>(SyntaxTree syntaxTree, string markdown, params string[] diagnosticsIds)
17+
where TGenerator : class, IIncrementalGenerator, new()
18+
{
19+
var references = GetAllReferencedAssemblies();
20+
var compilation = CreateCompilation("original.Samples", syntaxTree, references);
21+
var generator = new TGenerator();
22+
var driver = CreateGeneratorDriver(syntaxTree, generator);
23+
24+
if (!string.IsNullOrWhiteSpace(markdown))
25+
{
26+
var text = new InMemoryAdditionalText(@"C:\pathtorepo\components\experiment\samples\experiment.Samples\documentation.md", markdown);
27+
driver = driver.AddAdditionalTexts(ImmutableArray.Create<AdditionalText>(text));
28+
}
29+
30+
_ = driver.RunGeneratorsAndUpdateCompilation(compilation, out Compilation generatorCompilation, out ImmutableArray<Diagnostic> postGeneratorCompilationDiagnostics);
31+
32+
VerifyCompilationErrors(compilation);
33+
VerifyCompilationErrors(generatorCompilation);
34+
VerifyDiagnostics(diagnosticsIds, postGeneratorCompilationDiagnostics);
35+
}
36+
37+
internal static void VerifyGenerateSources(string assemblyName, string source, IIncrementalGenerator[] generators, bool ignoreDiagnostics = false, params (string Filename, string Text)[] results)
38+
{
39+
var references = GetAllReferencedAssemblies();
40+
var syntaxTree = CSharpSyntaxTree.ParseText(source, CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp10));
41+
var compilation = CreateCompilation(assemblyName, syntaxTree, references);
42+
var driver = CreateGeneratorDriver(syntaxTree, generators);
43+
44+
_ = driver.RunGeneratorsAndUpdateCompilation(compilation, out Compilation generatorCompilation, out ImmutableArray<Diagnostic> diagnostics);
45+
46+
if (!ignoreDiagnostics)
47+
{
48+
CollectionAssert.AreEquivalent(Array.Empty<Diagnostic>(), diagnostics);
49+
}
50+
51+
VerifyCompilationErrors(compilation);
52+
VerifyGeneratedSources(results, generatorCompilation);
53+
}
54+
55+
internal static IEnumerable<MetadataReference> GetAllReferencedAssemblies()
56+
{
57+
return from assembly in AppDomain.CurrentDomain.GetAssemblies()
58+
where !assembly.IsDynamic
59+
let reference = MetadataReference.CreateFromFile(assembly.Location)
60+
select reference;
61+
}
62+
63+
internal class InMemoryAdditionalText : AdditionalText
64+
{
65+
private readonly SourceText _content;
66+
67+
public InMemoryAdditionalText(string path, string content)
68+
{
69+
Path = path;
70+
_content = SourceText.From(content, Encoding.UTF8);
71+
}
72+
73+
public override string Path { get; }
74+
75+
public override SourceText GetText(CancellationToken cancellationToken = default) => _content;
76+
}
77+
78+
private static CSharpCompilation CreateCompilation(string assemblyName, SyntaxTree syntaxTree, IEnumerable<MetadataReference> references)
79+
{
80+
return CSharpCompilation.Create(
81+
assemblyName,
82+
new[] { syntaxTree },
83+
references,
84+
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
85+
}
86+
87+
private static GeneratorDriver CreateGeneratorDriver(SyntaxTree syntaxTree, IIncrementalGenerator generator)
88+
{
89+
return CSharpGeneratorDriver
90+
.Create(generator).WithUpdatedParseOptions((CSharpParseOptions)syntaxTree.Options);
91+
}
92+
93+
private static GeneratorDriver CreateGeneratorDriver(SyntaxTree syntaxTree, IIncrementalGenerator[] generators)
94+
{
95+
return CSharpGeneratorDriver.Create(generators).WithUpdatedParseOptions((CSharpParseOptions)syntaxTree.Options);
96+
}
97+
98+
private static void VerifyDiagnostics(string[] diagnosticsIds, ImmutableArray<Diagnostic> diagnostics)
99+
{
100+
HashSet<string> resultingIds = diagnostics.Select(diagnostic => diagnostic.Id).ToHashSet();
101+
Assert.IsTrue(resultingIds.SetEquals(diagnosticsIds), $"Expected one of [{string.Join(", ", diagnosticsIds)}] diagnostic Ids. Got [{string.Join(", ", resultingIds)}]");
102+
}
103+
104+
private static void VerifyCompilationErrors(Compilation outputCompilation)
105+
{
106+
var generatedCompilationDiaghostics = outputCompilation.GetDiagnostics();
107+
Assert.IsTrue(generatedCompilationDiaghostics.All(x => x.Severity != DiagnosticSeverity.Error), $"Expected no generated compilation errors. Got: \n{string.Join("\n", generatedCompilationDiaghostics.Where(x => x.Severity == DiagnosticSeverity.Error).Select(x => $"[{x.Id}: {x.GetMessage()}]"))}");
108+
}
109+
110+
private static void VerifyGeneratedSources((string Filename, string Text)[] results, Compilation outputCompilation)
111+
{
112+
foreach ((string filename, string text) in results)
113+
{
114+
SyntaxTree generatedTree = outputCompilation.SyntaxTrees.Single(tree => Path.GetFileName(tree.FilePath) == filename);
115+
Assert.AreEqual(text, generatedTree.ToString());
116+
}
117+
}
118+
}

CommunityToolkit.Tooling.SampleGen.Tests/ToolkitSampleGeneratedPaneTests.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace CommunityToolkit.Tooling.SampleGen.Tests;
99

10+
[TestClass]
1011
public partial class ToolkitSampleGeneratedPaneTests
1112
{
1213
[TestMethod]
@@ -38,7 +39,7 @@ namespace Windows.UI.Xaml.Controls
3839
public class UserControl {{ }}
3940
}}";
4041

41-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleOptionGenerator>(source, string.Empty);
42+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleOptionGenerator>(source, string.Empty);
4243
}
4344

4445
[TestMethod]
@@ -128,7 +129,7 @@ namespace Windows.UI.Xaml.Controls
128129
public class UserControl {{ }}
129130
}}";
130131

131-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleOptionGenerator>(source, string.Empty);
132+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleOptionGenerator>(source, string.Empty);
132133
}
133134

134135
[TestMethod]
@@ -151,7 +152,7 @@ namespace Windows.UI.Xaml.Controls
151152
public class UserControl { }
152153
}";
153154

154-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionAttributeOnNonSample.Id);
155+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionAttributeOnNonSample.Id);
155156
}
156157

157158
[DataRow("", DisplayName = "Empty string"), DataRow(" ", DisplayName = "Only whitespace"), DataRow("Test ", DisplayName = "Text with whitespace")]
@@ -179,7 +180,7 @@ namespace Windows.UI.Xaml.Controls
179180
public class UserControl {{ }}
180181
}}";
181182

182-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithBadName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
183+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithBadName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
183184
}
184185

185186

@@ -206,7 +207,7 @@ namespace Windows.UI.Xaml.Controls
206207
public class UserControl {{ }}
207208
}}";
208209

209-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithConflictingName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
210+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithConflictingName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
210211
}
211212

212213
[TestMethod]
@@ -236,7 +237,7 @@ namespace Windows.UI.Xaml.Controls
236237
public class UserControl {{ }}
237238
}}";
238239

239-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithConflictingName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
240+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithConflictingName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
240241
}
241242

242243
[TestMethod]
@@ -264,7 +265,7 @@ namespace Windows.UI.Xaml.Controls
264265
public class UserControl {{ }}
265266
}}";
266267

267-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithDuplicateName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
268+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithDuplicateName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
268269
}
269270

270271
[TestMethod]
@@ -297,7 +298,7 @@ namespace Windows.UI.Xaml.Controls
297298
public class UserControl {{ }}
298299
}}";
299300

300-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
301+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
301302
}
302303

303304
[TestMethod]
@@ -317,7 +318,7 @@ public partial class Sample
317318
}}
318319
}}";
319320

320-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleGeneratedOptionAttributeOnUnsupportedType.Id, DiagnosticDescriptors.SamplePaneOptionAttributeOnNonSample.Id);
321+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleGeneratedOptionAttributeOnUnsupportedType.Id, DiagnosticDescriptors.SamplePaneOptionAttributeOnNonSample.Id);
321322
}
322323

323324
[TestMethod]
@@ -343,7 +344,7 @@ namespace Windows.UI.Xaml.Controls
343344
public class UserControl {{ }}
344345
}}";
345346

346-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneMultiChoiceOptionWithNoChoices.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
347+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneMultiChoiceOptionWithNoChoices.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
347348
}
348349

349350
[TestMethod]
@@ -359,11 +360,10 @@ namespace MyApp
359360
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
360361
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
361362
{{
362-
}}
363-
364-
[ToolkitSampleButtonAction(label: ""Raise notification"")]
365-
private void RaiseNotification()
366-
{{
363+
[ToolkitSampleButtonAction(label: ""Raise notification"")]
364+
private void RaiseNotification()
365+
{{
366+
}}
367367
}}
368368
}}
369369
@@ -372,6 +372,6 @@ namespace Windows.UI.Xaml.Controls
372372
public class UserControl {{ }}
373373
}}";
374374

375-
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
375+
TestHelpers.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
376376
}
377377
}

0 commit comments

Comments
 (0)