Skip to content

Commit

Permalink
Add unit tests for new analyzer diagnostics
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergio0694 committed Aug 19, 2024
1 parent 7c1224c commit 46d311b
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ public override void Initialize(AnalysisContext context)
return;
}
// Skip implementation parts to avoid duplicate errors
if (context.Symbol is IPropertySymbol { PartialDefinitionPart: not null })
{
return;
}
// If the property is using [GeneratedCanvasEffectProperty], emit the diagnostic
if (context.Symbol.TryGetAttributeWithType(generatedCanvasEffectPropertyAttributeSymbol, out AttributeData? generatedCanvasEffectPropertyAttribute))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public override void Initialize(AnalysisContext context)
context.RegisterSymbolAction(context =>
{
// Validate that we have a valid containing type
if (context.Symbol is not IPropertySymbol { ContainingType: { } containingTypeSymbol })
// Validate that we have a valid containing type (also skip implementation parts)
if (context.Symbol is not IPropertySymbol { ContainingType: { } containingTypeSymbol, PartialDefinitionPart: null })
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ public override void Initialize(AnalysisContext context)
context.RegisterSymbolAction(context =>
{
// Ensure that we have some target property to analyze
if (context.Symbol is not IPropertySymbol propertySymbol)
// Ensure that we have some target property to analyze (also skip implementation parts)
if (context.Symbol is not IPropertySymbol { PartialDefinitionPart: null } propertySymbol)
{
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,121 @@ public abstract partial class MyEffect : CanvasEffect

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyAccessorsAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_StaticProperty_Warns()
{
const string source = """
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
[{|CMPSD2DWINUI0003:GeneratedCanvasEffectProperty|}]
public static partial int {|CS9248:Number|} { get; set; }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_NotPartialProperty_Warns()
{
const string source = """
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
[{|CMPSD2DWINUI0004:GeneratedCanvasEffectProperty|}]
public int Number { get; set; }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_PartialPropertyWithImplementation_Warns()
{
const string source = """
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
[{|CMPSD2DWINUI0004:GeneratedCanvasEffectProperty|}]
public partial int Number { get; set; }

public partial int Number { get => 42; set { } }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_PartialPropertyImplementationPart_Warns()
{
const string source = """
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
public partial int Number { get; set; }

[{|CMPSD2DWINUI0004:GeneratedCanvasEffectProperty|}]
public partial int Number { get => 42; set { } }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_ReturnsByRef_Warns()
{
const string source = """
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
[{|CMPSD2DWINUI0005:GeneratedCanvasEffectProperty|}]
public partial ref int {|CS9248:Number|} { get; {|CS8147:set|}; }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_ReturnsByRefReadonly_Warns()
{
const string source = """
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
[{|CMPSD2DWINUI0005:GeneratedCanvasEffectProperty|}]
public partial ref readonly int {|CS9248:Number|} { get; {|CS8147:set|}; }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}

[TestMethod]
public async Task InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer_ReturnsRefStructType_Warns()
{
const string source = """
using System;
using ComputeSharp.D2D1.WinUI;

public abstract partial class MyEffect : CanvasEffect
{
[{|CMPSD2DWINUI0006:GeneratedCanvasEffectProperty|}]
public partial Span<int> {|CS9248:Number|} { get; set; }
}
""";

await CSharpAnalyzerWithLanguageVersionTest<InvalidGeneratedCanvasEffectPropertyDeclarationAnalyzer>.VerifyAnalyzerAsync(source, languageVersion: LanguageVersion.Preview);
}
}

0 comments on commit 46d311b

Please sign in to comment.