diff --git a/src/Analyzers/MSTest.Analyzers/TestClassConstructorShouldBeValidAnalyzer.cs b/src/Analyzers/MSTest.Analyzers/TestClassConstructorShouldBeValidAnalyzer.cs index e2e1ba256c..70bf91d22f 100644 --- a/src/Analyzers/MSTest.Analyzers/TestClassConstructorShouldBeValidAnalyzer.cs +++ b/src/Analyzers/MSTest.Analyzers/TestClassConstructorShouldBeValidAnalyzer.cs @@ -60,7 +60,7 @@ private static void AnalyzeSymbol(SymbolAnalysisContext context, INamedTypeSymbo if (namedTypeSymbol.TypeKind != TypeKind.Class || namedTypeSymbol.IsAbstract || namedTypeSymbol.IsStatic - || !namedTypeSymbol.GetAttributes().Any(attr => SymbolEqualityComparer.Default.Equals(attr.AttributeClass, testClassAttributeSymbol))) + || !namedTypeSymbol.IsTestClass(testClassAttributeSymbol)) { return; } diff --git a/test/UnitTests/MSTest.Analyzers.UnitTests/TestClassConstructorShouldBeValidAnalyzerTests.cs b/test/UnitTests/MSTest.Analyzers.UnitTests/TestClassConstructorShouldBeValidAnalyzerTests.cs index 37af3eda2b..f3d5564915 100644 --- a/test/UnitTests/MSTest.Analyzers.UnitTests/TestClassConstructorShouldBeValidAnalyzerTests.cs +++ b/test/UnitTests/MSTest.Analyzers.UnitTests/TestClassConstructorShouldBeValidAnalyzerTests.cs @@ -343,4 +343,98 @@ public static class MyTestClass await VerifyCS.VerifyCodeFixAsync(code, code); } + + [TestMethod] + public async Task WhenDerivedTestClassAttributeHasPrivateConstructor_Diagnostic() + { + string code = """ + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [STATestClass] + public class {|#0:MyTestClass|} + { + private MyTestClass() + { + } + } + """; + + await VerifyCS.VerifyCodeFixAsync( + code, + VerifyCS.Diagnostic(TestClassConstructorShouldBeValidAnalyzer.TestClassConstructorShouldBeValidRule) + .WithLocation(0) + .WithArguments("MyTestClass"), + code); + } + + [TestMethod] + public async Task WhenDerivedTestClassAttributeHasPublicParameterlessConstructor_NoDiagnostic() + { + string code = """ + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [STATestClass] + public class MyTestClass + { + public MyTestClass() + { + } + } + """; + + await VerifyCS.VerifyCodeFixAsync(code, code); + } + + [TestMethod] + public async Task WhenCustomDerivedTestClassAttributeHasInternalConstructor_Diagnostic() + { + string code = """ + using System; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [AttributeUsage(AttributeTargets.Class)] + public class MyTestClassAttribute : TestClassAttribute + { + } + + [MyTestClass] + public class {|#0:MyTestClass|} + { + internal MyTestClass() + { + } + } + """; + + await VerifyCS.VerifyCodeFixAsync( + code, + VerifyCS.Diagnostic(TestClassConstructorShouldBeValidAnalyzer.TestClassConstructorShouldBeValidRule) + .WithLocation(0) + .WithArguments("MyTestClass"), + code); + } + + [TestMethod] + public async Task WhenCustomDerivedTestClassAttributeHasPublicConstructor_NoDiagnostic() + { + string code = """ + using System; + using Microsoft.VisualStudio.TestTools.UnitTesting; + + [AttributeUsage(AttributeTargets.Class)] + public class MyTestClassAttribute : TestClassAttribute + { + } + + [MyTestClass] + public class MyTestClass + { + public MyTestClass() + { + } + } + """; + + await VerifyCS.VerifyCodeFixAsync(code, code); + } }