From 2a9f6229bc899290adcd4b15b24676273389755a Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Sun, 16 Jun 2024 19:32:26 -0700 Subject: [PATCH] Add tests for 'AllowsUnsafeBlocks' analyzer --- ...ixelShaderDescriptorGenerator_Analyzers.cs | 24 +++++++++++++++++-- ...lyzerWithLanguageVersionTest{TAnalyzer}.cs | 23 +++++++++++++++--- ...puteShaderDescriptorGenerator_Analyzers.cs | 21 ++++++++++++++++ 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/tests/ComputeSharp.D2D1.Tests.SourceGenerators/Test_D2DPixelShaderDescriptorGenerator_Analyzers.cs b/tests/ComputeSharp.D2D1.Tests.SourceGenerators/Test_D2DPixelShaderDescriptorGenerator_Analyzers.cs index 12cf8f56e..d715ee7e9 100644 --- a/tests/ComputeSharp.D2D1.Tests.SourceGenerators/Test_D2DPixelShaderDescriptorGenerator_Analyzers.cs +++ b/tests/ComputeSharp.D2D1.Tests.SourceGenerators/Test_D2DPixelShaderDescriptorGenerator_Analyzers.cs @@ -9,7 +9,27 @@ namespace ComputeSharp.D2D1.Tests.SourceGenerators; public class Test_D2DPixelShaderDescriptorGenerator_Analyzers { [TestMethod] - public async Task MissingD2DPixelShaderDescriptor_ComputeShader() + public async Task AllowsUnsafeBlocksNotEnabled_Warns() + { + const string source = """ + using ComputeSharp; + using ComputeSharp.D2D1; + + [{|CMPSD2D0064:D2DGeneratedPixelShaderDescriptor|}] + internal partial struct MyShader : ID2D1PixelShader + { + public Float4 Execute() + { + return 0; + } + } + """; + + await CSharpAnalyzerWithLanguageVersionTest.VerifyAnalyzerAsync(source, allowUnsafeBlocks: false); + } + + [TestMethod] + public async Task MissingD2DPixelShaderDescriptor_Warns() { const string source = """ using ComputeSharp; @@ -28,7 +48,7 @@ public Float4 Execute() } [TestMethod] - public async Task MissingComputeShaderDescriptor_ManuallyImplemented_DoesNotWarn() + public async Task MissingD2DPixelShaderDescriptor_ManuallyImplemented_DoesNotWarn() { const string source = """ using System; diff --git a/tests/ComputeSharp.Tests.SourceGenerators/Helpers/CSharpAnalyzerWithLanguageVersionTest{TAnalyzer}.cs b/tests/ComputeSharp.Tests.SourceGenerators/Helpers/CSharpAnalyzerWithLanguageVersionTest{TAnalyzer}.cs index 58304f3b9..82e35d1df 100644 --- a/tests/ComputeSharp.Tests.SourceGenerators/Helpers/CSharpAnalyzerWithLanguageVersionTest{TAnalyzer}.cs +++ b/tests/ComputeSharp.Tests.SourceGenerators/Helpers/CSharpAnalyzerWithLanguageVersionTest{TAnalyzer}.cs @@ -23,6 +23,11 @@ namespace ComputeSharp.Tests.SourceGenerators.Helpers; internal sealed class CSharpAnalyzerWithLanguageVersionTest : CSharpAnalyzerTest where TAnalyzer : DiagnosticAnalyzer, new() { + /// + /// Whether to enable unsafe blocks. + /// + private readonly bool allowUnsafeBlocks; + /// /// The C# language version to use to parse code. /// @@ -31,12 +36,20 @@ internal sealed class CSharpAnalyzerWithLanguageVersionTest : CSharpA /// /// Creates a new instance with the specified paramaters. /// + /// Whether to enable unsafe blocks. /// The C# language version to use to parse code. - private CSharpAnalyzerWithLanguageVersionTest(LanguageVersion languageVersion) + private CSharpAnalyzerWithLanguageVersionTest(bool allowUnsafeBlocks, LanguageVersion languageVersion) { + this.allowUnsafeBlocks = allowUnsafeBlocks; this.languageVersion = languageVersion; } + /// + protected override CompilationOptions CreateCompilationOptions() + { + return new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, allowUnsafe: this.allowUnsafeBlocks); + } + /// protected override ParseOptions CreateParseOptions() { @@ -45,10 +58,14 @@ protected override ParseOptions CreateParseOptions() /// /// The source code to analyze. + /// Whether to enable unsafe blocks. /// The language version to use to run the test. - public static Task VerifyAnalyzerAsync(string source, LanguageVersion languageVersion = LanguageVersion.CSharp12) + public static Task VerifyAnalyzerAsync( + string source, + bool allowUnsafeBlocks = true, + LanguageVersion languageVersion = LanguageVersion.CSharp12) { - CSharpAnalyzerWithLanguageVersionTest test = new(languageVersion) { TestCode = source }; + CSharpAnalyzerWithLanguageVersionTest test = new(allowUnsafeBlocks, languageVersion) { TestCode = source }; test.TestState.ReferenceAssemblies = ReferenceAssemblies.Net.Net80; test.TestState.AdditionalReferences.Add(MetadataReference.CreateFromFile(typeof(Core::ComputeSharp.Hlsl).Assembly.Location)); diff --git a/tests/ComputeSharp.Tests.SourceGenerators/Test_ComputeShaderDescriptorGenerator_Analyzers.cs b/tests/ComputeSharp.Tests.SourceGenerators/Test_ComputeShaderDescriptorGenerator_Analyzers.cs index 4ead59b9d..67f65a418 100644 --- a/tests/ComputeSharp.Tests.SourceGenerators/Test_ComputeShaderDescriptorGenerator_Analyzers.cs +++ b/tests/ComputeSharp.Tests.SourceGenerators/Test_ComputeShaderDescriptorGenerator_Analyzers.cs @@ -8,6 +8,27 @@ namespace ComputeSharp.Tests.SourceGenerators; [TestClass] public class Test_ComputeShaderDescriptorGenerator_Analyzers { + [TestMethod] + public async Task AllowsUnsafeBlocksNotEnabled_Warns() + { + const string source = """ + using ComputeSharp; + + [ThreadGroupSize(DefaultThreadGroupSizes.X)] + [{|CMPS0052:GeneratedComputeShaderDescriptor|}] + internal readonly partial struct MyShader : IComputeShader + { + private readonly ReadWriteBuffer buffer; + + public void Execute() + { + } + } + """; + + await CSharpAnalyzerWithLanguageVersionTest.VerifyAnalyzerAsync(source, allowUnsafeBlocks: false); + } + [TestMethod] public async Task MissingComputeShaderDescriptor_ComputeShader() {