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