diff --git a/Roslyn-SDK.sln b/Roslyn-SDK.sln
index a1bc3103d..2715ebfa9 100644
--- a/Roslyn-SDK.sln
+++ b/Roslyn-SDK.sln
@@ -153,6 +153,42 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Roslyn.SDK.IntegrationTests
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Roslyn.SDK.UnitTests", "tests\VisualStudio.Roslyn.SDK\Roslyn.SDK.UnitTests\Roslyn.SDK.UnitTests.csproj", "{11B1F856-9025-4A4C-B90D-B1237743B672}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.SourceGenerators.Testing", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.SourceGenerators.Testing\Microsoft.CodeAnalysis.SourceGenerators.Testing.csproj", "{05A91267-ABC8-4249-9A04-166C08EAD849}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.csproj", "{99D7BB0C-DE8D-4952-A9BF-63A5215256C4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.csproj", "{31886751-5615-435C-A40C-EA2CC415BBDD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.csproj", "{92558FFF-0935-4B12-8ED6-E3DC4E486B7F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.csproj", "{5BC27DBC-6727-4DA1-B1AF-5EA5D3803627}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.vbproj", "{EC96BD3F-2DFE-4072-86F5-BFB349FF77D9}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.vbproj", "{74F9C0F1-2E95-4EC8-B395-EB73AC4DD42B}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.vbproj", "{A7D3307A-0A0D-4D20-887A-9C830A38B058}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit", "src\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.vbproj", "{4B158F47-4759-495B-83BB-1D87130E3DF8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests\Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests.csproj", "{68CAEBF3-D428-4B50-8305-4BE4F7753CA8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests.csproj", "{0E75580E-10E6-4CAC-87C2-D83C6C0B1D10}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests.csproj", "{4E02E29B-54C7-4576-8575-0438EABCCC88}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests.csproj", "{485C6D8A-271F-44CD-9F55-B5283A917A00}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests\Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests.csproj", "{074F9FC2-B0E0-40E4-B356-99F0E07E279B}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests.vbproj", "{ED7BCD8E-F553-48F0-962F-019BE7C2B78E}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests.vbproj", "{7D9C0EF5-7383-4E35-811B-3288B3C806F3}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests.vbproj", "{7C3FE60E-055B-4E0C-BB85-C7E94A640074}"
+EndProject
+Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests", "tests\Microsoft.CodeAnalysis.Testing\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests\Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests.vbproj", "{92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -431,6 +467,78 @@ Global
{11B1F856-9025-4A4C-B90D-B1237743B672}.Debug|Any CPU.Build.0 = Debug|Any CPU
{11B1F856-9025-4A4C-B90D-B1237743B672}.Release|Any CPU.ActiveCfg = Release|Any CPU
{11B1F856-9025-4A4C-B90D-B1237743B672}.Release|Any CPU.Build.0 = Release|Any CPU
+ {05A91267-ABC8-4249-9A04-166C08EAD849}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {05A91267-ABC8-4249-9A04-166C08EAD849}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {05A91267-ABC8-4249-9A04-166C08EAD849}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {05A91267-ABC8-4249-9A04-166C08EAD849}.Release|Any CPU.Build.0 = Release|Any CPU
+ {99D7BB0C-DE8D-4952-A9BF-63A5215256C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {99D7BB0C-DE8D-4952-A9BF-63A5215256C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {99D7BB0C-DE8D-4952-A9BF-63A5215256C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {99D7BB0C-DE8D-4952-A9BF-63A5215256C4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {31886751-5615-435C-A40C-EA2CC415BBDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {31886751-5615-435C-A40C-EA2CC415BBDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {31886751-5615-435C-A40C-EA2CC415BBDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {31886751-5615-435C-A40C-EA2CC415BBDD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {92558FFF-0935-4B12-8ED6-E3DC4E486B7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {92558FFF-0935-4B12-8ED6-E3DC4E486B7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {92558FFF-0935-4B12-8ED6-E3DC4E486B7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {92558FFF-0935-4B12-8ED6-E3DC4E486B7F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5BC27DBC-6727-4DA1-B1AF-5EA5D3803627}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5BC27DBC-6727-4DA1-B1AF-5EA5D3803627}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5BC27DBC-6727-4DA1-B1AF-5EA5D3803627}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5BC27DBC-6727-4DA1-B1AF-5EA5D3803627}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC96BD3F-2DFE-4072-86F5-BFB349FF77D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC96BD3F-2DFE-4072-86F5-BFB349FF77D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC96BD3F-2DFE-4072-86F5-BFB349FF77D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC96BD3F-2DFE-4072-86F5-BFB349FF77D9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {74F9C0F1-2E95-4EC8-B395-EB73AC4DD42B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {74F9C0F1-2E95-4EC8-B395-EB73AC4DD42B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {74F9C0F1-2E95-4EC8-B395-EB73AC4DD42B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {74F9C0F1-2E95-4EC8-B395-EB73AC4DD42B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A7D3307A-0A0D-4D20-887A-9C830A38B058}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A7D3307A-0A0D-4D20-887A-9C830A38B058}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A7D3307A-0A0D-4D20-887A-9C830A38B058}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A7D3307A-0A0D-4D20-887A-9C830A38B058}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4B158F47-4759-495B-83BB-1D87130E3DF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4B158F47-4759-495B-83BB-1D87130E3DF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4B158F47-4759-495B-83BB-1D87130E3DF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4B158F47-4759-495B-83BB-1D87130E3DF8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {68CAEBF3-D428-4B50-8305-4BE4F7753CA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {68CAEBF3-D428-4B50-8305-4BE4F7753CA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {68CAEBF3-D428-4B50-8305-4BE4F7753CA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {68CAEBF3-D428-4B50-8305-4BE4F7753CA8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0E75580E-10E6-4CAC-87C2-D83C6C0B1D10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0E75580E-10E6-4CAC-87C2-D83C6C0B1D10}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0E75580E-10E6-4CAC-87C2-D83C6C0B1D10}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0E75580E-10E6-4CAC-87C2-D83C6C0B1D10}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4E02E29B-54C7-4576-8575-0438EABCCC88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4E02E29B-54C7-4576-8575-0438EABCCC88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4E02E29B-54C7-4576-8575-0438EABCCC88}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4E02E29B-54C7-4576-8575-0438EABCCC88}.Release|Any CPU.Build.0 = Release|Any CPU
+ {485C6D8A-271F-44CD-9F55-B5283A917A00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {485C6D8A-271F-44CD-9F55-B5283A917A00}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {485C6D8A-271F-44CD-9F55-B5283A917A00}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {485C6D8A-271F-44CD-9F55-B5283A917A00}.Release|Any CPU.Build.0 = Release|Any CPU
+ {074F9FC2-B0E0-40E4-B356-99F0E07E279B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {074F9FC2-B0E0-40E4-B356-99F0E07E279B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {074F9FC2-B0E0-40E4-B356-99F0E07E279B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {074F9FC2-B0E0-40E4-B356-99F0E07E279B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ED7BCD8E-F553-48F0-962F-019BE7C2B78E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ED7BCD8E-F553-48F0-962F-019BE7C2B78E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ED7BCD8E-F553-48F0-962F-019BE7C2B78E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ED7BCD8E-F553-48F0-962F-019BE7C2B78E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7D9C0EF5-7383-4E35-811B-3288B3C806F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7D9C0EF5-7383-4E35-811B-3288B3C806F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7D9C0EF5-7383-4E35-811B-3288B3C806F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7D9C0EF5-7383-4E35-811B-3288B3C806F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7C3FE60E-055B-4E0C-BB85-C7E94A640074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7C3FE60E-055B-4E0C-BB85-C7E94A640074}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7C3FE60E-055B-4E0C-BB85-C7E94A640074}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7C3FE60E-055B-4E0C-BB85-C7E94A640074}.Release|Any CPU.Build.0 = Release|Any CPU
+ {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -509,6 +617,24 @@ Global
{A3AF556C-276C-49BA-A9ED-E7D42FECAA46} = {8C343846-5F9F-4033-9B52-B44C61962449}
{6DBBFF7B-2C28-47D7-8618-B6085044E38D} = {A3AF556C-276C-49BA-A9ED-E7D42FECAA46}
{11B1F856-9025-4A4C-B90D-B1237743B672} = {A3AF556C-276C-49BA-A9ED-E7D42FECAA46}
+ {05A91267-ABC8-4249-9A04-166C08EAD849} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {99D7BB0C-DE8D-4952-A9BF-63A5215256C4} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {31886751-5615-435C-A40C-EA2CC415BBDD} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {92558FFF-0935-4B12-8ED6-E3DC4E486B7F} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {5BC27DBC-6727-4DA1-B1AF-5EA5D3803627} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {EC96BD3F-2DFE-4072-86F5-BFB349FF77D9} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {74F9C0F1-2E95-4EC8-B395-EB73AC4DD42B} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {A7D3307A-0A0D-4D20-887A-9C830A38B058} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {4B158F47-4759-495B-83BB-1D87130E3DF8} = {A3E08CE3-2358-4D36-875B-82C99AC61CD8}
+ {68CAEBF3-D428-4B50-8305-4BE4F7753CA8} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {0E75580E-10E6-4CAC-87C2-D83C6C0B1D10} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {4E02E29B-54C7-4576-8575-0438EABCCC88} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {485C6D8A-271F-44CD-9F55-B5283A917A00} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {074F9FC2-B0E0-40E4-B356-99F0E07E279B} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {ED7BCD8E-F553-48F0-962F-019BE7C2B78E} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {7D9C0EF5-7383-4E35-811B-3288B3C806F3} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {7C3FE60E-055B-4E0C-BB85-C7E94A640074} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
+ {92BD1781-5DB4-4F72-BCCB-0D64C0790A2B} = {9905147E-CC1F-42A0-BD27-05586C583DF7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {56695AA9-EA80-47A7-8562-E51285906C54}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Directory.Build.props b/src/Microsoft.CodeAnalysis.Testing/Directory.Build.props
index 46e5087e0..8b5745550 100644
--- a/src/Microsoft.CodeAnalysis.Testing/Directory.Build.props
+++ b/src/Microsoft.CodeAnalysis.Testing/Directory.Build.props
@@ -17,6 +17,12 @@
netstandard2.0/net472: Roslyn 3.x
-->
netcoreapp3.1;netstandard1.5;netstandard2.0;net452;net46;net472
+
+
+ netcoreapp3.1;netstandard2.0;net472
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/AnalyzerTest`1.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/AnalyzerTest`1.cs
index 35819de23..fc406fbdf 100644
--- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/AnalyzerTest`1.cs
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/AnalyzerTest`1.cs
@@ -966,7 +966,13 @@ private static bool IsInSourceFile(DiagnosticResult result, (string filename, So
private async Task> GetSortedDiagnosticsAsync(EvaluatedProjectState primaryProject, ImmutableArray additionalProjects, ImmutableArray analyzers, IVerifier verifier, CancellationToken cancellationToken)
{
var solution = await GetSolutionAsync(primaryProject, additionalProjects, verifier, cancellationToken);
- return await GetSortedDiagnosticsAsync(solution, analyzers, CompilerDiagnostics, cancellationToken);
+ var additionalDiagnostics = primaryProject.AdditionalDiagnostics;
+ foreach (var project in additionalProjects)
+ {
+ additionalDiagnostics = additionalDiagnostics.AddRange(project.AdditionalDiagnostics);
+ }
+
+ return await GetSortedDiagnosticsAsync(solution, analyzers, additionalDiagnostics, CompilerDiagnostics, cancellationToken);
}
///
@@ -975,11 +981,12 @@ private async Task> GetSortedDiagnosticsAsync(Evaluat
///
/// The that the analyzer(s) will be run on.
/// The analyzer to run on the documents.
+ /// Additional diagnostics reported for the solution, which need to be verified.
/// The behavior of compiler diagnostics in validation scenarios.
/// The that the task will observe.
/// A collection of s that surfaced in the source code, sorted by
/// .
- protected async Task> GetSortedDiagnosticsAsync(Solution solution, ImmutableArray analyzers, CompilerDiagnostics compilerDiagnostics, CancellationToken cancellationToken)
+ protected async Task> GetSortedDiagnosticsAsync(Solution solution, ImmutableArray analyzers, ImmutableArray additionalDiagnostics, CompilerDiagnostics compilerDiagnostics, CancellationToken cancellationToken)
{
var diagnostics = ImmutableArray.CreateBuilder();
foreach (var project in solution.Projects)
@@ -991,6 +998,7 @@ protected async Task> GetSortedDiagnosticsAsync(Solut
diagnostics.AddRange(allDiagnostics.Where(diagnostic => !IsCompilerDiagnostic(diagnostic) || IsCompilerDiagnosticIncluded(diagnostic, compilerDiagnostics)));
}
+ diagnostics.AddRange(additionalDiagnostics);
var results = SortDistinctDiagnostics(diagnostics);
return results.ToImmutableArray();
}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/Model/EvaluatedProjectState.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/Model/EvaluatedProjectState.cs
index 138dcb23e..90c0277d7 100644
--- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/Model/EvaluatedProjectState.cs
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/Model/EvaluatedProjectState.cs
@@ -23,7 +23,8 @@ public EvaluatedProjectState(ProjectState state, ReferenceAssemblies defaultRefe
state.Sources.ToImmutableArray(),
state.AdditionalFiles.ToImmutableArray(),
state.AdditionalProjectReferences.ToImmutableArray(),
- state.AdditionalReferences.ToImmutableArray())
+ state.AdditionalReferences.ToImmutableArray(),
+ ImmutableArray.Empty)
{
}
@@ -37,7 +38,8 @@ private EvaluatedProjectState(
ImmutableArray<(string filename, SourceText content)> sources,
ImmutableArray<(string filename, SourceText content)> additionalFiles,
ImmutableArray additionalProjectReferences,
- ImmutableArray additionalReferences)
+ ImmutableArray additionalReferences,
+ ImmutableArray additionalDiagnostics)
{
Name = name;
AssemblyName = assemblyName;
@@ -49,6 +51,7 @@ private EvaluatedProjectState(
AdditionalFiles = additionalFiles;
AdditionalProjectReferences = additionalProjectReferences;
AdditionalReferences = additionalReferences;
+ AdditionalDiagnostics = additionalDiagnostics;
}
public string Name { get; }
@@ -71,6 +74,8 @@ private EvaluatedProjectState(
public ImmutableArray AdditionalReferences { get; }
+ public ImmutableArray AdditionalDiagnostics { get; }
+
public EvaluatedProjectState WithSources(ImmutableArray<(string filename, SourceText content)> sources)
{
if (sources == Sources)
@@ -81,6 +86,16 @@ public EvaluatedProjectState WithSources(ImmutableArray<(string filename, Source
return With(sources: sources);
}
+ public EvaluatedProjectState WithAdditionalDiagnostics(ImmutableArray additionalDiagnostics)
+ {
+ if (additionalDiagnostics == AdditionalDiagnostics)
+ {
+ return this;
+ }
+
+ return With(additionalDiagnostics: additionalDiagnostics);
+ }
+
private EvaluatedProjectState With(
Optional name = default,
Optional assemblyName = default,
@@ -91,7 +106,8 @@ private EvaluatedProjectState With(
Optional> sources = default,
Optional> additionalFiles = default,
Optional> additionalProjectReferences = default,
- Optional> additionalReferences = default)
+ Optional> additionalReferences = default,
+ Optional> additionalDiagnostics = default)
{
return new EvaluatedProjectState(
GetValueOrDefault(name, Name),
@@ -103,7 +119,8 @@ private EvaluatedProjectState With(
GetValueOrDefault(sources, Sources),
GetValueOrDefault(additionalFiles, AdditionalFiles),
GetValueOrDefault(additionalProjectReferences, AdditionalProjectReferences),
- GetValueOrDefault(additionalReferences, AdditionalReferences));
+ GetValueOrDefault(additionalReferences, AdditionalReferences),
+ GetValueOrDefault(additionalDiagnostics, AdditionalDiagnostics));
}
private static T GetValueOrDefault(Optional optionalValue, T defaultValue)
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt
index 842920f86..d62cd056d 100644
--- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/PublicAPI.Unshipped.txt
@@ -8,7 +8,7 @@ Microsoft.CodeAnalysis.Testing.AnalyzerTest.DiagnosticVerifier.set ->
Microsoft.CodeAnalysis.Testing.AnalyzerTest.DisabledDiagnostics.get -> System.Collections.Generic.List
Microsoft.CodeAnalysis.Testing.AnalyzerTest.ExpectedDiagnostics.get -> System.Collections.Generic.List
Microsoft.CodeAnalysis.Testing.AnalyzerTest.FormatVerifierMessage(System.Collections.Immutable.ImmutableArray analyzers, Microsoft.CodeAnalysis.Diagnostic actual, Microsoft.CodeAnalysis.Testing.DiagnosticResult expected, string message) -> string
-Microsoft.CodeAnalysis.Testing.AnalyzerTest.GetSortedDiagnosticsAsync(Microsoft.CodeAnalysis.Solution solution, System.Collections.Immutable.ImmutableArray analyzers, Microsoft.CodeAnalysis.Testing.CompilerDiagnostics compilerDiagnostics, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>
+Microsoft.CodeAnalysis.Testing.AnalyzerTest.GetSortedDiagnosticsAsync(Microsoft.CodeAnalysis.Solution solution, System.Collections.Immutable.ImmutableArray analyzers, System.Collections.Immutable.ImmutableArray additionalDiagnostics, Microsoft.CodeAnalysis.Testing.CompilerDiagnostics compilerDiagnostics, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>
Microsoft.CodeAnalysis.Testing.AnalyzerTest.MarkupOptions.get -> Microsoft.CodeAnalysis.Testing.MarkupOptions
Microsoft.CodeAnalysis.Testing.AnalyzerTest.MarkupOptions.set -> void
Microsoft.CodeAnalysis.Testing.AnalyzerTest.MatchDiagnosticsTimeout.get -> System.TimeSpan
@@ -119,6 +119,7 @@ Microsoft.CodeAnalysis.Testing.MetadataReferenceCollection.Add(string path) -> v
Microsoft.CodeAnalysis.Testing.MetadataReferenceCollection.MetadataReferenceCollection() -> void
Microsoft.CodeAnalysis.Testing.MetadataReferences
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState
+Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.AdditionalDiagnostics.get -> System.Collections.Immutable.ImmutableArray
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.AdditionalFiles.get -> System.Collections.Immutable.ImmutableArray<(string filename, Microsoft.CodeAnalysis.Text.SourceText content)>
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.AdditionalProjectReferences.get -> System.Collections.Immutable.ImmutableArray
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.AdditionalReferences.get -> System.Collections.Immutable.ImmutableArray
@@ -130,6 +131,7 @@ Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.Name.get -> string
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.OutputKind.get -> Microsoft.CodeAnalysis.OutputKind
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.ReferenceAssemblies.get -> Microsoft.CodeAnalysis.Testing.ReferenceAssemblies
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.Sources.get -> System.Collections.Immutable.ImmutableArray<(string filename, Microsoft.CodeAnalysis.Text.SourceText content)>
+Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.WithAdditionalDiagnostics(System.Collections.Immutable.ImmutableArray additionalDiagnostics) -> Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState
Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState.WithSources(System.Collections.Immutable.ImmutableArray<(string filename, Microsoft.CodeAnalysis.Text.SourceText content)> sources) -> Microsoft.CodeAnalysis.Testing.Model.EvaluatedProjectState
Microsoft.CodeAnalysis.Testing.PackageIdentity
Microsoft.CodeAnalysis.Testing.PackageIdentity.Id.get -> string
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.csproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.csproj
new file mode 100644
index 000000000..0593fa981
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.csproj
@@ -0,0 +1,27 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.CSharp.Testing.MSTest
+
+
+
+ true
+ Roslyn Source Generator MSTest Framework C# Types.
+ Roslyn Source Generator MSTest Framework C# Types.
+ Roslyn Source Generator MSTest Framework C# Types
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..6a1123a97
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/PublicAPI.Unshipped.txt
@@ -0,0 +1,4 @@
+Microsoft.CodeAnalysis.CSharp.Testing.MSTest.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.MSTest.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.MSTest.SourceGeneratorVerifier.SourceGeneratorVerifier() -> void
+static Microsoft.CodeAnalysis.CSharp.Testing.MSTest.SourceGeneratorVerifier.Create() -> Microsoft.CodeAnalysis.CSharp.Testing.MSTest.SourceGeneratorVerifier
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier.cs
new file mode 100644
index 000000000..95ab35185
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing.MSTest
+{
+ public static class SourceGeneratorVerifier
+ {
+ public static SourceGeneratorVerifier Create()
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ return new SourceGeneratorVerifier();
+ }
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier`1.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier`1.cs
new file mode 100644
index 000000000..4f852ac23
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier`1.cs
@@ -0,0 +1,13 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CodeAnalysis.Testing.Verifiers;
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing.MSTest
+{
+ public class SourceGeneratorVerifier : CSharpSourceGeneratorVerifier
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.csproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.csproj
new file mode 100644
index 000000000..3fbaf55db
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.csproj
@@ -0,0 +1,27 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.CSharp.Testing.NUnit
+
+
+
+ true
+ Roslyn Source Generator NUnit Framework C# Types.
+ Roslyn Source Generator NUnit Framework C# Types.
+ Roslyn Source Generator NUnit Framework C# Types
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..e6f762ae9
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/PublicAPI.Unshipped.txt
@@ -0,0 +1,4 @@
+Microsoft.CodeAnalysis.CSharp.Testing.NUnit.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.NUnit.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.NUnit.SourceGeneratorVerifier.SourceGeneratorVerifier() -> void
+static Microsoft.CodeAnalysis.CSharp.Testing.NUnit.SourceGeneratorVerifier.Create() -> Microsoft.CodeAnalysis.CSharp.Testing.NUnit.SourceGeneratorVerifier
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier.cs
new file mode 100644
index 000000000..078259b7b
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing.NUnit
+{
+ public static class SourceGeneratorVerifier
+ {
+ public static SourceGeneratorVerifier Create()
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ return new SourceGeneratorVerifier();
+ }
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier`1.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier`1.cs
new file mode 100644
index 000000000..e0900dcba
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier`1.cs
@@ -0,0 +1,13 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CodeAnalysis.Testing.Verifiers;
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing.NUnit
+{
+ public class SourceGeneratorVerifier : CSharpSourceGeneratorVerifier
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.csproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.csproj
new file mode 100644
index 000000000..435280807
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.csproj
@@ -0,0 +1,27 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.CSharp.Testing.XUnit
+
+
+
+ true
+ Roslyn Source Generator xUnit Framework C# Types.
+ Roslyn Source Generator xUnit Framework C# Types.
+ Roslyn Source Generator xUnit Framework C# Types
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..d625f5b80
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/PublicAPI.Unshipped.txt
@@ -0,0 +1,4 @@
+Microsoft.CodeAnalysis.CSharp.Testing.XUnit.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.XUnit.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.XUnit.SourceGeneratorVerifier.SourceGeneratorVerifier() -> void
+static Microsoft.CodeAnalysis.CSharp.Testing.XUnit.SourceGeneratorVerifier.Create() -> Microsoft.CodeAnalysis.CSharp.Testing.XUnit.SourceGeneratorVerifier
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier.cs
new file mode 100644
index 000000000..1e605119d
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing.XUnit
+{
+ public static class SourceGeneratorVerifier
+ {
+ public static SourceGeneratorVerifier Create()
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ return new SourceGeneratorVerifier();
+ }
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier`1.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier`1.cs
new file mode 100644
index 000000000..2b7511eaf
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier`1.cs
@@ -0,0 +1,13 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CodeAnalysis.Testing.Verifiers;
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing.XUnit
+{
+ public class SourceGeneratorVerifier : CSharpSourceGeneratorVerifier
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/CSharpSourceGeneratorTest`2.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/CSharpSourceGeneratorTest`2.cs
new file mode 100644
index 000000000..be038cda1
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/CSharpSourceGeneratorTest`2.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using Microsoft.CodeAnalysis.Testing;
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing
+{
+ public class CSharpSourceGeneratorTest : SourceGeneratorTest
+ where TSourceGenerator : ISourceGenerator, new()
+ where TVerifier : IVerifier, new()
+ {
+ private static readonly LanguageVersion DefaultLanguageVersion =
+ Enum.TryParse("Default", out LanguageVersion version) ? version : LanguageVersion.CSharp6;
+
+ protected override IEnumerable GetSourceGenerators()
+ => new ISourceGenerator[] { new TSourceGenerator() };
+
+ protected override string DefaultFileExt => "cs";
+
+ public override string Language => LanguageNames.CSharp;
+
+ protected override GeneratorDriver CreateGeneratorDriver(Project project, ImmutableArray sourceGenerators)
+ {
+ return CSharpGeneratorDriver.Create(
+ sourceGenerators,
+ project.AnalyzerOptions.AdditionalFiles,
+ (CSharpParseOptions)project.ParseOptions!,
+ project.AnalyzerOptions.AnalyzerConfigOptionsProvider);
+ }
+
+ protected override CompilationOptions CreateCompilationOptions()
+ => new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, allowUnsafe: true);
+
+ protected override ParseOptions CreateParseOptions()
+ => new CSharpParseOptions(DefaultLanguageVersion, DocumentationMode.Diagnose);
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/CSharpSourceGeneratorVerifier`2.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/CSharpSourceGeneratorVerifier`2.cs
new file mode 100644
index 000000000..4d5ac83ce
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/CSharpSourceGeneratorVerifier`2.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.CodeAnalysis.Testing;
+
+namespace Microsoft.CodeAnalysis.CSharp.Testing
+{
+ public class CSharpSourceGeneratorVerifier : SourceGeneratorVerifier, TVerifier>
+ where TSourceGenerator : ISourceGenerator, new()
+ where TVerifier : IVerifier, new()
+ {
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.csproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.csproj
new file mode 100644
index 000000000..a1472a2b2
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.csproj
@@ -0,0 +1,25 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing
+ Microsoft.CodeAnalysis.CSharp.Testing
+
+
+
+ true
+ Roslyn Source Generator Framework C# Types.
+ Roslyn Source Generator Framework C# Types.
+ Roslyn Source Generator Framework C# Types
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..c2fa56484
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing/PublicAPI.Unshipped.txt
@@ -0,0 +1,10 @@
+Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest
+Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.CSharpSourceGeneratorTest() -> void
+Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorVerifier
+Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorVerifier.CSharpSourceGeneratorVerifier() -> void
+override Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.CreateCompilationOptions() -> Microsoft.CodeAnalysis.CompilationOptions
+override Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.CreateGeneratorDriver(Microsoft.CodeAnalysis.Project project, System.Collections.Immutable.ImmutableArray sourceGenerators) -> Microsoft.CodeAnalysis.GeneratorDriver
+override Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.CreateParseOptions() -> Microsoft.CodeAnalysis.ParseOptions
+override Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.DefaultFileExt.get -> string
+override Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.GetSourceGenerators() -> System.Collections.Generic.IEnumerable
+override Microsoft.CodeAnalysis.CSharp.Testing.CSharpSourceGeneratorTest.Language.get -> string
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs
index adc7a363d..2fb76905c 100644
--- a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs
@@ -448,7 +448,7 @@ private async Task VerifyFixAsync(
bool done;
do
{
- var analyzerDiagnostics = await GetSortedDiagnosticsAsync(project.Solution, analyzers, CompilerDiagnostics, cancellationToken).ConfigureAwait(false);
+ var analyzerDiagnostics = await GetSortedDiagnosticsAsync(project.Solution, analyzers, additionalDiagnostics: ImmutableArray.Empty, CompilerDiagnostics, cancellationToken).ConfigureAwait(false);
if (analyzerDiagnostics.Length == 0)
{
break;
@@ -577,7 +577,7 @@ private async Task VerifyFixAsync(
bool done;
do
{
- var analyzerDiagnostics = await GetSortedDiagnosticsAsync(project.Solution, analyzers, CompilerDiagnostics, cancellationToken).ConfigureAwait(false);
+ var analyzerDiagnostics = await GetSortedDiagnosticsAsync(project.Solution, analyzers, additionalDiagnostics: ImmutableArray.Empty, CompilerDiagnostics, cancellationToken).ConfigureAwait(false);
if (analyzerDiagnostics.Length == 0)
{
break;
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/EmptySourceGeneratorProvider.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/EmptySourceGeneratorProvider.cs
new file mode 100644
index 000000000..3d34ec6a1
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/EmptySourceGeneratorProvider.cs
@@ -0,0 +1,20 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ ///
+ /// Defines a which does not add any sources.
+ ///
+ public sealed class EmptySourceGeneratorProvider : ISourceGenerator
+ {
+ public void Execute(GeneratorExecutionContext context)
+ {
+ }
+
+ public void Initialize(GeneratorInitializationContext context)
+ {
+ }
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.csproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.csproj
new file mode 100644
index 000000000..42ecea0f4
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.csproj
@@ -0,0 +1,23 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+ true
+ Roslyn Source Generator Test Framework Common Types.
+ Roslyn Source Generator Test Framework Common Types
+ Roslyn Source Generator Test Framework Common
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..acdf9847b
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/PublicAPI.Unshipped.txt
@@ -0,0 +1,15 @@
+Microsoft.CodeAnalysis.Testing.EmptySourceGeneratorProvider
+Microsoft.CodeAnalysis.Testing.EmptySourceGeneratorProvider.EmptySourceGeneratorProvider() -> void
+Microsoft.CodeAnalysis.Testing.EmptySourceGeneratorProvider.Execute(Microsoft.CodeAnalysis.GeneratorExecutionContext context) -> void
+Microsoft.CodeAnalysis.Testing.EmptySourceGeneratorProvider.Initialize(Microsoft.CodeAnalysis.GeneratorInitializationContext context) -> void
+Microsoft.CodeAnalysis.Testing.SourceGeneratorTest
+Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.FixedCode.set -> void
+Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.FixedState.get -> Microsoft.CodeAnalysis.Testing.SolutionState
+Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.SourceGeneratorTest() -> void
+Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.VerifySourceGeneratorAsync(Microsoft.CodeAnalysis.Testing.SolutionState testState, Microsoft.CodeAnalysis.Testing.SolutionState fixedState, Microsoft.CodeAnalysis.Testing.IVerifier verifier, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>
+Microsoft.CodeAnalysis.Testing.SourceGeneratorVerifier
+Microsoft.CodeAnalysis.Testing.SourceGeneratorVerifier.SourceGeneratorVerifier() -> void
+abstract Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.CreateGeneratorDriver(Microsoft.CodeAnalysis.Project project, System.Collections.Immutable.ImmutableArray sourceGenerators) -> Microsoft.CodeAnalysis.GeneratorDriver
+abstract Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.GetSourceGenerators() -> System.Collections.Generic.IEnumerable
+override Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.GetDiagnosticAnalyzers() -> System.Collections.Generic.IEnumerable
+override Microsoft.CodeAnalysis.Testing.SourceGeneratorTest.RunAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/SourceGeneratorTest`1.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/SourceGeneratorTest`1.cs
new file mode 100644
index 000000000..2fd0206cf
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/SourceGeneratorTest`1.cs
@@ -0,0 +1,191 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using System.Runtime.ExceptionServices;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis.CodeActions;
+using Microsoft.CodeAnalysis.CodeRefactorings;
+using Microsoft.CodeAnalysis.Diagnostics;
+using Microsoft.CodeAnalysis.Formatting;
+using Microsoft.CodeAnalysis.Simplification;
+using Microsoft.CodeAnalysis.Testing.Model;
+using Microsoft.CodeAnalysis.Text;
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ public abstract class SourceGeneratorTest : AnalyzerTest
+ where TVerifier : IVerifier, new()
+ {
+ ///
+ /// Sets the expected output source file for source generator testing.
+ ///
+ ///
+ public string FixedCode
+ {
+ set
+ {
+ if (value != null)
+ {
+ FixedState.Sources.Add(value);
+ }
+ }
+ }
+
+ public SolutionState FixedState { get; }
+
+ protected SourceGeneratorTest()
+ {
+ FixedState = new SolutionState(DefaultTestProjectName, Language, DefaultFilePathPrefix, DefaultFileExt);
+
+ // Disable test behaviors that don't make sense for source generator scenarios
+ TestBehaviors |= TestBehaviors.SkipSuppressionCheck | TestBehaviors.SkipGeneratedCodeCheck;
+ }
+
+ protected override IEnumerable GetDiagnosticAnalyzers()
+ => new DiagnosticAnalyzer[] { new EmptyDiagnosticAnalyzer() };
+
+ ///
+ /// Returns the source generators being tested - to be implemented in non-abstract class.
+ ///
+ /// The to be used.
+ protected abstract IEnumerable GetSourceGenerators();
+
+ protected abstract GeneratorDriver CreateGeneratorDriver(Project project, ImmutableArray sourceGenerators);
+
+ public override async Task RunAsync(CancellationToken cancellationToken = default)
+ {
+ Verify.NotEmpty($"{nameof(TestState)}.{nameof(SolutionState.Sources)}", TestState.Sources);
+
+ var analyzers = GetDiagnosticAnalyzers().ToArray();
+ var defaultDiagnostic = GetDefaultDiagnostic(analyzers);
+ var supportedDiagnostics = analyzers.SelectMany(analyzer => analyzer.SupportedDiagnostics).ToImmutableArray();
+ var fixableDiagnostics = ImmutableArray.Empty;
+
+ var rawTestState = TestState.WithInheritedValuesApplied(null, fixableDiagnostics);
+ var rawFixedState = FixedState.WithInheritedValuesApplied(rawTestState, fixableDiagnostics);
+
+ var testState = rawTestState.WithProcessedMarkup(MarkupOptions, defaultDiagnostic, supportedDiagnostics, fixableDiagnostics, DefaultFilePath);
+ var fixedState = rawFixedState.WithProcessedMarkup(MarkupOptions, defaultDiagnostic, supportedDiagnostics, fixableDiagnostics, DefaultFilePath);
+
+ await VerifyDiagnosticsAsync(new EvaluatedProjectState(testState, ReferenceAssemblies), testState.AdditionalProjects.Values.Select(additionalProject => new EvaluatedProjectState(additionalProject, ReferenceAssemblies)).ToImmutableArray(), testState.ExpectedDiagnostics.ToArray(), Verify.PushContext("Diagnostics of test state"), cancellationToken).ConfigureAwait(false);
+ var diagnostics = await VerifySourceGeneratorAsync(testState, fixedState, Verify, cancellationToken).ConfigureAwait(false);
+ await VerifyDiagnosticsAsync(new EvaluatedProjectState(fixedState, ReferenceAssemblies).WithAdditionalDiagnostics(diagnostics), fixedState.AdditionalProjects.Values.Select(additionalProject => new EvaluatedProjectState(additionalProject, ReferenceAssemblies)).ToImmutableArray(), fixedState.ExpectedDiagnostics.ToArray(), Verify.PushContext("Diagnostics of test state with generated sources"), cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Called to test a C# source generator when applied on the input source as a string.
+ ///
+ /// The effective input test state.
+ /// The effective test state after the source generators are applied.
+ /// The verifier to use for test assertions.
+ /// The that the task will observe.
+ /// A representing the asynchronous operation.
+ protected async Task> VerifySourceGeneratorAsync(SolutionState testState, SolutionState fixedState, IVerifier verifier, CancellationToken cancellationToken)
+ {
+ return await VerifySourceGeneratorAsync(Language, GetSourceGenerators().ToImmutableArray(), testState, fixedState, ApplySourceGeneratorAsync, verifier.PushContext("Source generator application"), cancellationToken);
+ }
+
+ private async Task> VerifySourceGeneratorAsync(
+ string language,
+ ImmutableArray sourceGenerators,
+ SolutionState oldState,
+ SolutionState newState,
+ Func, Project, IVerifier, CancellationToken, Task<(Project project, ImmutableArray diagnostics)>> getFixedProject,
+ IVerifier verifier,
+ CancellationToken cancellationToken)
+ {
+ var project = await CreateProjectAsync(new EvaluatedProjectState(oldState, ReferenceAssemblies), oldState.AdditionalProjects.Values.Select(additionalProject => new EvaluatedProjectState(additionalProject, ReferenceAssemblies)).ToImmutableArray(), cancellationToken);
+ _ = await GetCompilerDiagnosticsAsync(project, verifier, cancellationToken).ConfigureAwait(false);
+
+ ImmutableArray diagnostics;
+ (project, diagnostics) = await getFixedProject(sourceGenerators, project, verifier, cancellationToken).ConfigureAwait(false);
+
+ // After applying the source generator, compare the resulting string to the inputted one
+ var updatedDocuments = project.Documents.ToArray();
+
+ verifier.Equal(newState.Sources.Count, updatedDocuments.Length, $"expected '{nameof(newState)}.{nameof(SolutionState.Sources)}' and '{nameof(updatedDocuments)}' to be equal but '{nameof(newState)}.{nameof(SolutionState.Sources)}' contains '{newState.Sources.Count}' documents and '{nameof(updatedDocuments)}' contains '{updatedDocuments.Length}' documents");
+
+ for (var i = 0; i < updatedDocuments.Length; i++)
+ {
+ var actual = await GetSourceTextFromDocumentAsync(updatedDocuments[i], cancellationToken).ConfigureAwait(false);
+ verifier.EqualOrDiff(newState.Sources[i].content.ToString(), actual.ToString(), $"content of '{newState.Sources[i].filename}' did not match. Diff shown with expected as baseline:");
+ verifier.Equal(newState.Sources[i].content.Encoding, actual.Encoding, $"encoding of '{newState.Sources[i].filename}' was expected to be '{newState.Sources[i].content.Encoding}' but was '{actual.Encoding}'");
+ verifier.Equal(newState.Sources[i].content.ChecksumAlgorithm, actual.ChecksumAlgorithm, $"checksum algorithm of '{newState.Sources[i].filename}' was expected to be '{newState.Sources[i].content.ChecksumAlgorithm}' but was '{actual.ChecksumAlgorithm}'");
+ verifier.Equal(newState.Sources[i].filename, updatedDocuments[i].Name, $"file name was expected to be '{newState.Sources[i].filename}' but was '{updatedDocuments[i].Name}'");
+ }
+
+ var updatedAdditionalDocuments = project.AdditionalDocuments.ToArray();
+
+ verifier.Equal(newState.AdditionalFiles.Count, updatedAdditionalDocuments.Length, $"expected '{nameof(newState)}.{nameof(SolutionState.AdditionalFiles)}' and '{nameof(updatedAdditionalDocuments)}' to be equal but '{nameof(newState)}.{nameof(SolutionState.AdditionalFiles)}' contains '{newState.AdditionalFiles.Count}' documents and '{nameof(updatedAdditionalDocuments)}' contains '{updatedAdditionalDocuments.Length}' documents");
+
+ for (var i = 0; i < updatedAdditionalDocuments.Length; i++)
+ {
+ var actual = await updatedAdditionalDocuments[i].GetTextAsync(cancellationToken).ConfigureAwait(false);
+ verifier.EqualOrDiff(newState.AdditionalFiles[i].content.ToString(), actual.ToString(), $"content of '{newState.AdditionalFiles[i].filename}' did not match. Diff shown with expected as baseline:");
+ verifier.Equal(newState.AdditionalFiles[i].content.Encoding, actual.Encoding, $"encoding of '{newState.AdditionalFiles[i].filename}' was expected to be '{newState.AdditionalFiles[i].content.Encoding}' but was '{actual.Encoding}'");
+ verifier.Equal(newState.AdditionalFiles[i].content.ChecksumAlgorithm, actual.ChecksumAlgorithm, $"checksum algorithm of '{newState.AdditionalFiles[i].filename}' was expected to be '{newState.AdditionalFiles[i].content.ChecksumAlgorithm}' but was '{actual.ChecksumAlgorithm}'");
+ verifier.Equal(newState.AdditionalFiles[i].filename, updatedAdditionalDocuments[i].Name, $"file name was expected to be '{newState.AdditionalFiles[i].filename}' but was '{updatedAdditionalDocuments[i].Name}'");
+ }
+
+ return diagnostics;
+ }
+
+ private async Task<(Project project, ImmutableArray diagnostics)> ApplySourceGeneratorAsync(ImmutableArray sourceGenerators, Project project, IVerifier verifier, CancellationToken cancellationToken)
+ {
+ var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);
+ verifier.True(compilation is { });
+
+ var driver = CreateGeneratorDriver(project, sourceGenerators).RunGenerators(compilation, cancellationToken);
+ var result = driver.GetRunResult();
+
+ var updatedProject = project;
+ foreach (var tree in result.GeneratedTrees)
+ {
+ updatedProject = updatedProject.AddDocument(tree.FilePath, await tree.GetTextAsync(cancellationToken).ConfigureAwait(false), filePath: tree.FilePath).Project;
+ }
+
+ return (updatedProject, result.Diagnostics);
+ }
+
+ ///
+ /// Get the existing compiler diagnostics on the input document.
+ ///
+ /// The to run the compiler diagnostic analyzers on.
+ /// The verifier to use for test assertions.
+ /// The that the task will observe.
+ /// The compiler diagnostics that were found in the code.
+ private static async Task> GetCompilerDiagnosticsAsync(Project project, IVerifier verifier, CancellationToken cancellationToken)
+ {
+ var allDiagnostics = ImmutableArray.Create();
+
+ foreach (var document in project.Documents)
+ {
+ var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
+ verifier.True(semanticModel is { });
+
+ allDiagnostics = allDiagnostics.AddRange(semanticModel.GetDiagnostics(cancellationToken: cancellationToken));
+ }
+
+ return allDiagnostics;
+ }
+
+ ///
+ /// Given a document, turn it into a string based on the syntax root.
+ ///
+ /// The to be converted to a string.
+ /// The that the task will observe.
+ /// A containing the syntax of the after formatting.
+ private static async Task GetSourceTextFromDocumentAsync(Document document, CancellationToken cancellationToken)
+ {
+ var simplifiedDoc = await Simplifier.ReduceAsync(document, Simplifier.Annotation, cancellationToken: cancellationToken).ConfigureAwait(false);
+ var formatted = await Formatter.FormatAsync(simplifiedDoc, Formatter.Annotation, cancellationToken: cancellationToken).ConfigureAwait(false);
+ return await formatted.GetTextAsync(cancellationToken).ConfigureAwait(false);
+ }
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/SourceGeneratorVerifier`3.cs b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/SourceGeneratorVerifier`3.cs
new file mode 100644
index 000000000..740172ccd
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing/SourceGeneratorVerifier`3.cs
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ ///
+ /// A default verifier for source generators.
+ ///
+ /// The to test.
+ /// The test implementation to use.
+ /// The type of verifier to use.
+ public class SourceGeneratorVerifier
+ where TSourceGenerator : ISourceGenerator, new()
+ where TTest : SourceGeneratorTest, new()
+ where TVerifier : IVerifier, new()
+ {
+ }
+}
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.vbproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.vbproj
new file mode 100644
index 000000000..0d8a3e811
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.vbproj
@@ -0,0 +1,27 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.VisualBasic.Testing.MSTest
+
+
+
+ true
+ Roslyn Source Generator Test Framwork For MSTest.
+ Roslyn Source Generator Test Framwork For MSTest.
+ Roslyn Source Generator Test Framwork MSTest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..1ea2dbf9d
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/PublicAPI.Unshipped.txt
@@ -0,0 +1,2 @@
+Microsoft.CodeAnalysis.VisualBasic.Testing.MSTest.SourceGeneratorVerifier(Of TSourceGenerator)
+Microsoft.CodeAnalysis.VisualBasic.Testing.MSTest.SourceGeneratorVerifier(Of TSourceGenerator).New() -> Void
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier.vb
new file mode 100644
index 000000000..59f66182c
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Module SourceGeneratorVerifier
+ Public Function Create(Of TSourceGenerator As {ISourceGenerator, New})() As SourceGeneratorVerifier(Of TSourceGenerator)
+ Return New SourceGeneratorVerifier(Of TSourceGenerator)
+ End Function
+End Module
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier`1.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier`1.vb
new file mode 100644
index 000000000..200590a2d
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest/SourceGeneratorVerifier`1.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Microsoft.CodeAnalysis.Testing.Verifiers
+
+Public Class SourceGeneratorVerifier(Of TSourceGenerator As {ISourceGenerator, New})
+ Inherits VisualBasicSourceGeneratorVerifier(Of TSourceGenerator, MSTestVerifier)
+End Class
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.vbproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.vbproj
new file mode 100644
index 000000000..e0ca8ae2c
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.vbproj
@@ -0,0 +1,27 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.VisualBasic.Testing.NUnit
+
+
+
+ true
+ Roslyn Source Generator Test Framwork For NUnit.
+ Roslyn Source Generator Test Framwork For NUnit.
+ Roslyn Source Generator Test Framwork NUnit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..717d0317c
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/PublicAPI.Unshipped.txt
@@ -0,0 +1,2 @@
+Microsoft.CodeAnalysis.VisualBasic.Testing.NUnit.SourceGeneratorVerifier(Of TSourceGenerator)
+Microsoft.CodeAnalysis.VisualBasic.Testing.NUnit.SourceGeneratorVerifier(Of TSourceGenerator).New() -> Void
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier.vb
new file mode 100644
index 000000000..59f66182c
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Module SourceGeneratorVerifier
+ Public Function Create(Of TSourceGenerator As {ISourceGenerator, New})() As SourceGeneratorVerifier(Of TSourceGenerator)
+ Return New SourceGeneratorVerifier(Of TSourceGenerator)
+ End Function
+End Module
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier`1.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier`1.vb
new file mode 100644
index 000000000..203195842
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit/SourceGeneratorVerifier`1.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Microsoft.CodeAnalysis.Testing.Verifiers
+
+Public Class SourceGeneratorVerifier(Of TSourceGenerator As {ISourceGenerator, New})
+ Inherits VisualBasicSourceGeneratorVerifier(Of TSourceGenerator, NUnitVerifier)
+End Class
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.vbproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.vbproj
new file mode 100644
index 000000000..c64d49b06
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.vbproj
@@ -0,0 +1,27 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.VisualBasic.Testing.XUnit
+
+
+
+ true
+ Roslyn Source Generator Test Framwork For xUnit.
+ Roslyn Source Generator Test Framwork For xUnit.
+ Roslyn Source Generator Test Framwork xUnit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..7876d2d30
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/PublicAPI.Unshipped.txt
@@ -0,0 +1,2 @@
+Microsoft.CodeAnalysis.VisualBasic.Testing.XUnit.SourceGeneratorVerifier(Of TSourceGenerator)
+Microsoft.CodeAnalysis.VisualBasic.Testing.XUnit.SourceGeneratorVerifier(Of TSourceGenerator).New() -> Void
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier.vb
new file mode 100644
index 000000000..59f66182c
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Module SourceGeneratorVerifier
+ Public Function Create(Of TSourceGenerator As {ISourceGenerator, New})() As SourceGeneratorVerifier(Of TSourceGenerator)
+ Return New SourceGeneratorVerifier(Of TSourceGenerator)
+ End Function
+End Module
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier`1.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier`1.vb
new file mode 100644
index 000000000..4e408d71f
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit/SourceGeneratorVerifier`1.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Microsoft.CodeAnalysis.Testing.Verifiers
+
+Public Class SourceGeneratorVerifier(Of TSourceGenerator As {ISourceGenerator, New})
+ Inherits VisualBasicSourceGeneratorVerifier(Of TSourceGenerator, XUnitVerifier)
+End Class
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.vbproj b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.vbproj
new file mode 100644
index 000000000..abe2e3eaf
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.vbproj
@@ -0,0 +1,24 @@
+
+
+
+ $(TestingLibrarySourceGeneratorTargetFrameworks)
+ Microsoft.CodeAnalysis.VisualBasic.Testing
+
+
+
+ true
+ Roslyn Source Generator Test Framwork For Visual Basic.
+ Roslyn Source Generator Test Framwork For Visual Basic.
+ Roslyn Source Generator Test Framwork Visual Basic
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/PublicAPI.Shipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/PublicAPI.Shipped.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/PublicAPI.Unshipped.txt b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/PublicAPI.Unshipped.txt
new file mode 100644
index 000000000..1a76b560e
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/PublicAPI.Unshipped.txt
@@ -0,0 +1,10 @@
+Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier)
+Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).New() -> Void
+Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorVerifier(Of TSourceGenerator, TVerifier)
+Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorVerifier(Of TSourceGenerator, TVerifier).New() -> Void
+Overrides Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).CreateCompilationOptions() -> Microsoft.CodeAnalysis.CompilationOptions
+Overrides Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).CreateGeneratorDriver(project As Microsoft.CodeAnalysis.Project, sourceGenerators As System.Collections.Immutable.ImmutableArray(Of Microsoft.CodeAnalysis.ISourceGenerator)) -> Microsoft.CodeAnalysis.GeneratorDriver
+Overrides Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).CreateParseOptions() -> Microsoft.CodeAnalysis.ParseOptions
+Overrides Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).DefaultFileExt() -> String
+Overrides Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).GetSourceGenerators() -> System.Collections.Generic.IEnumerable(Of Microsoft.CodeAnalysis.ISourceGenerator)
+Overrides Microsoft.CodeAnalysis.VisualBasic.Testing.VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier).Language() -> String
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/VisualBasicSourceGeneratorTest`2.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/VisualBasicSourceGeneratorTest`2.vb
new file mode 100644
index 000000000..79aa11529
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/VisualBasicSourceGeneratorTest`2.vb
@@ -0,0 +1,43 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports System.Collections.Immutable
+Imports Microsoft.CodeAnalysis.Testing
+
+Public Class VisualBasicSourceGeneratorTest(Of TSourceGenerator As {ISourceGenerator, New}, TVerifier As {IVerifier, New})
+ Inherits SourceGeneratorTest(Of TVerifier)
+
+ Private Shared ReadOnly DefaultLanguageVersion As LanguageVersion =
+ If([Enum].TryParse("Default", DefaultLanguageVersion), DefaultLanguageVersion, LanguageVersion.VisualBasic14)
+
+ Public Overrides ReadOnly Property Language As String
+ Get
+ Return LanguageNames.VisualBasic
+ End Get
+ End Property
+
+ Protected Overrides ReadOnly Property DefaultFileExt As String
+ Get
+ Return "vb"
+ End Get
+ End Property
+
+ Protected Overrides Function CreateGeneratorDriver(project As Project, sourceGenerators As ImmutableArray(Of ISourceGenerator)) As GeneratorDriver
+ Return VisualBasicGeneratorDriver.Create(
+ sourceGenerators,
+ project.AnalyzerOptions.AdditionalFiles,
+ CType(project.ParseOptions, VisualBasicParseOptions),
+ project.AnalyzerOptions.AnalyzerConfigOptionsProvider)
+ End Function
+
+ Protected Overrides Function CreateCompilationOptions() As CompilationOptions
+ Return New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
+ End Function
+
+ Protected Overrides Function CreateParseOptions() As ParseOptions
+ Return New VisualBasicParseOptions(DefaultLanguageVersion, DocumentationMode.Diagnose)
+ End Function
+
+ Protected Overrides Function GetSourceGenerators() As IEnumerable(Of ISourceGenerator)
+ Return New ISourceGenerator() {New TSourceGenerator()}
+ End Function
+End Class
diff --git a/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/VisualBasicSourceGeneratorVerifier`2.vb b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/VisualBasicSourceGeneratorVerifier`2.vb
new file mode 100644
index 000000000..70dd9345f
--- /dev/null
+++ b/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing/VisualBasicSourceGeneratorVerifier`2.vb
@@ -0,0 +1,7 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Microsoft.CodeAnalysis.Testing
+
+Public Class VisualBasicSourceGeneratorVerifier(Of TSourceGenerator As {ISourceGenerator, New}, TVerifier As {IVerifier, New})
+ Inherits SourceGeneratorVerifier(Of TSourceGenerator, VisualBasicSourceGeneratorTest(Of TSourceGenerator, TVerifier), TVerifier)
+End Class
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Directory.Build.props b/tests/Microsoft.CodeAnalysis.Testing/Directory.Build.props
index 3212f667a..eb211b210 100644
--- a/tests/Microsoft.CodeAnalysis.Testing/Directory.Build.props
+++ b/tests/Microsoft.CodeAnalysis.Testing/Directory.Build.props
@@ -22,6 +22,7 @@
netcoreapp3.1;net472;net46;netcoreapp1.1;netcoreapp2.0
+ netcoreapp3.1;net472
NU1701;$(NoWarn)
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests.csproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests.csproj
new file mode 100644
index 000000000..55b30b99b
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests/PlaceholderTest.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests/PlaceholderTest.cs
new file mode 100644
index 000000000..6b638ee6c
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.MSTest.UnitTests/PlaceholderTest.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ [TestClass]
+ public class PlaceholderTest
+ {
+ [TestMethod]
+ [WorkItem(223, "https://github.com/dotnet/roslyn-sdk/issues/223")]
+ public void ThisTestExists()
+ {
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests.csproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests.csproj
new file mode 100644
index 000000000..48efaf7f1
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests.csproj
@@ -0,0 +1,13 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests/PlaceholderTest.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests/PlaceholderTest.cs
new file mode 100644
index 000000000..b56a4d22d
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.NUnit.UnitTests/PlaceholderTest.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using NUnit.Framework;
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ [TestFixture]
+ public class PlaceholderTest
+ {
+ [Test]
+ [WorkItem(223, "https://github.com/dotnet/roslyn-sdk/issues/223")]
+ public void ThisTestExists()
+ {
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests.csproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests.csproj
new file mode 100644
index 000000000..77bd19d0e
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests.csproj
@@ -0,0 +1,11 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests/PlaceholderTest.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests/PlaceholderTest.cs
new file mode 100644
index 000000000..aee5e0aa2
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.UnitTests/PlaceholderTest.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ public class PlaceholderTest
+ {
+ [Fact]
+ [WorkItem(223, "https://github.com/dotnet/roslyn-sdk/issues/223")]
+ public void ThisTestExists()
+ {
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests.csproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests.csproj
new file mode 100644
index 000000000..1eed9eea7
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests.csproj
@@ -0,0 +1,11 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests/PlaceholderTest.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests/PlaceholderTest.cs
new file mode 100644
index 000000000..aee5e0aa2
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit.UnitTests/PlaceholderTest.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Xunit;
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ public class PlaceholderTest
+ {
+ [Fact]
+ [WorkItem(223, "https://github.com/dotnet/roslyn-sdk/issues/223")]
+ public void ThisTestExists()
+ {
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests.csproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests.csproj
new file mode 100644
index 000000000..964b50f68
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests.csproj
@@ -0,0 +1,11 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/SourceGeneratorValidationTests.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/SourceGeneratorValidationTests.cs
new file mode 100644
index 000000000..34bd58c72
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/SourceGeneratorValidationTests.cs
@@ -0,0 +1,101 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.Testing.TestGenerators;
+using Microsoft.CodeAnalysis.Text;
+using Xunit;
+
+namespace Microsoft.CodeAnalysis.Testing
+{
+ public class SourceGeneratorValidationTests
+ {
+ [Fact]
+ public async Task AddSimpleFile()
+ {
+ await new CSharpSourceGeneratorTest
+ {
+ TestState =
+ {
+ Sources =
+ {
+ @"// Comment",
+ },
+ },
+ FixedState =
+ {
+ Sources =
+ {
+ @"// Comment",
+ ("Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests\\Microsoft.CodeAnalysis.Testing.TestGenerators.AddEmptyFile\\EmptyGeneratedFile.cs", SourceText.From(string.Empty, Encoding.UTF8)),
+ },
+ },
+ }.RunAsync();
+ }
+
+ [Fact]
+ public async Task AddSimpleFileWithDiagnostic()
+ {
+ await new CSharpSourceGeneratorTest
+ {
+ TestState =
+ {
+ Sources =
+ {
+ @"// Comment",
+ },
+ },
+ FixedState =
+ {
+ Sources =
+ {
+ @"{|#0:|}// Comment",
+ ("Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests\\Microsoft.CodeAnalysis.Testing.TestGenerators.AddEmptyFileWithDiagnostic\\EmptyGeneratedFile.cs", SourceText.From(string.Empty, Encoding.UTF8)),
+ },
+ ExpectedDiagnostics =
+ {
+ // /0/Test0.cs(1,1): warning SG0001: Message
+ new DiagnosticResult(AddEmptyFileWithDiagnostic.Descriptor).WithLocation(0),
+ },
+ },
+ }.RunAsync();
+ }
+
+ private class CSharpSourceGeneratorTest : SourceGeneratorTest
+ where TSourceGenerator : ISourceGenerator, new()
+ {
+ public override string Language => LanguageNames.CSharp;
+
+ protected override string DefaultFileExt => "cs";
+
+ protected override GeneratorDriver CreateGeneratorDriver(Project project, ImmutableArray sourceGenerators)
+ {
+ return CSharpGeneratorDriver.Create(
+ sourceGenerators,
+ project.AnalyzerOptions.AdditionalFiles,
+ (CSharpParseOptions)project.ParseOptions!,
+ project.AnalyzerOptions.AnalyzerConfigOptionsProvider);
+ }
+
+ protected override CompilationOptions CreateCompilationOptions()
+ {
+ return new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
+ }
+
+ protected override ParseOptions CreateParseOptions()
+ {
+ return new CSharpParseOptions(LanguageVersion.Default, DocumentationMode.Diagnose);
+ }
+
+ protected override IEnumerable GetSourceGenerators()
+ {
+ yield return new TSourceGenerator();
+ }
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/TestGenerators/AddEmptyFile.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/TestGenerators/AddEmptyFile.cs
new file mode 100644
index 000000000..815aefec3
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/TestGenerators/AddEmptyFile.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace Microsoft.CodeAnalysis.Testing.TestGenerators
+{
+ public class AddEmptyFile : ISourceGenerator
+ {
+ public void Initialize(GeneratorInitializationContext context)
+ {
+ }
+
+ public virtual void Execute(GeneratorExecutionContext context)
+ {
+ context.AddSource("EmptyGeneratedFile", string.Empty);
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/TestGenerators/AddEmptyFileWithDiagnostic.cs b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/TestGenerators/AddEmptyFileWithDiagnostic.cs
new file mode 100644
index 000000000..7af6ff507
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.SourceGenerators.Testing.UnitTests/TestGenerators/AddEmptyFileWithDiagnostic.cs
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Linq;
+using Microsoft.CodeAnalysis.Text;
+
+namespace Microsoft.CodeAnalysis.Testing.TestGenerators
+{
+ public class AddEmptyFileWithDiagnostic : AddEmptyFile
+ {
+ public static readonly DiagnosticDescriptor Descriptor = new DiagnosticDescriptor(
+ "SG0001",
+ "Title",
+ "Message",
+ "Category",
+ DiagnosticSeverity.Warning,
+ isEnabledByDefault: true);
+
+ public override void Execute(GeneratorExecutionContext context)
+ {
+ base.Execute(context);
+
+ context.ReportDiagnostic(Diagnostic.Create(
+ Descriptor,
+ context.Compilation.SyntaxTrees.First().GetLocation(new TextSpan(0, 0))));
+ }
+ }
+}
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests.vbproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests.vbproj
new file mode 100644
index 000000000..eb722fcc5
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests.vbproj
@@ -0,0 +1,16 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests/PlaceholderTest.vb b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests/PlaceholderTest.vb
new file mode 100644
index 000000000..d6ba819c8
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.MSTest.UnitTests/PlaceholderTest.vb
@@ -0,0 +1,13 @@
+' Licensed to the .NET Foundation under one or more agreements.
+' The .NET Foundation licenses this file to you under the MIT license.
+' See the LICENSE file in the project root for more information.
+
+Imports Microsoft.VisualStudio.TestTools.UnitTesting
+
+
+Public Class PlaceholderTest
+
+
+ Public Sub ThisTestExists()
+ End Sub
+End Class
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests.vbproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests.vbproj
new file mode 100644
index 000000000..de29452ac
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests.vbproj
@@ -0,0 +1,16 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests/PlaceholderTest.vb b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests/PlaceholderTest.vb
new file mode 100644
index 000000000..b21426c45
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.NUnit.UnitTests/PlaceholderTest.vb
@@ -0,0 +1,13 @@
+' Licensed to the .NET Foundation under one or more agreements.
+' The .NET Foundation licenses this file to you under the MIT license.
+' See the LICENSE file in the project root for more information.
+
+Imports NUnit.Framework
+
+
+Public Class PlaceholderTest
+
+
+ Public Sub ThisTestExists()
+ End Sub
+End Class
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests.vbproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests.vbproj
new file mode 100644
index 000000000..c122f5659
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests.vbproj
@@ -0,0 +1,14 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests/PlaceholderTest.vb b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests/PlaceholderTest.vb
new file mode 100644
index 000000000..8b72a2211
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.UnitTests/PlaceholderTest.vb
@@ -0,0 +1,10 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Xunit
+
+Public Class PlaceholderTest
+
+
+ Public Sub ThisTestExists()
+ End Sub
+End Class
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests.vbproj b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests.vbproj
new file mode 100644
index 000000000..bad6cd626
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests.vbproj
@@ -0,0 +1,14 @@
+
+
+
+ $(SourceGeneratorTestTargetFrameworks)
+ Microsoft.CodeAnalysis.Testing
+
+
+
+
+
+
+
+
+
diff --git a/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests/PlaceholderTest.vb b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests/PlaceholderTest.vb
new file mode 100644
index 000000000..8b72a2211
--- /dev/null
+++ b/tests/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.VisualBasic.SourceGenerators.Testing.XUnit.UnitTests/PlaceholderTest.vb
@@ -0,0 +1,10 @@
+' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+Imports Xunit
+
+Public Class PlaceholderTest
+
+
+ Public Sub ThisTestExists()
+ End Sub
+End Class