From 244bd36293ca21c50de853d54107fc3ecfef503a Mon Sep 17 00:00:00 2001 From: Niko Schuessler <54370830+nschuessler@users.noreply.github.com> Date: Mon, 10 Aug 2020 12:50:08 -0700 Subject: [PATCH 1/4] Add diagnostic verification extensibility. --- .../AnalyzerTest`1.cs | 16 ++++++++++++++++ .../PublicAPI.Unshipped.txt | 1 + 2 files changed, 17 insertions(+) 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 90c321006..ab68c1763 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 @@ -239,6 +239,20 @@ protected async Task VerifyDiagnosticsAsync((string filename, SourceText content await VerifySuppressionDiagnosticsAsync(analyzers, sources, additionalFiles, additionalProjects, additionalMetadataReferences, expected, verifier, cancellationToken).ConfigureAwait(false); } + /// + /// Checks each of the actual s found and compares them with the corresponding + /// based on custom test requirements not yet supported by the test framework. + /// + /// The analyzers that have been run on the sources. + /// The s found by the compiler after running the analyzer + /// on the source code. + /// The s describing the expected + /// diagnostics for the sources. + /// The verifier to use for test assertions. + protected virtual void VerifyDiagnosticCustom(ImmutableArray analyzers, Diagnostic actual, DiagnosticResult expected, IVerifier verifier) + { + } + private async Task VerifyGeneratedCodeDiagnosticsAsync(ImmutableArray analyzers, (string filename, SourceText content)[] sources, (string filename, SourceText content)[] additionalFiles, ProjectState[] additionalProjects, MetadataReference[] additionalMetadataReferences, DiagnosticResult[] expected, IVerifier verifier, CancellationToken cancellationToken) { if (TestBehaviors.HasFlag(TestBehaviors.SkipGeneratedCodeCheck) @@ -371,6 +385,8 @@ private void VerifyDiagnosticResults(IEnumerable actualResults, Immu StringComparer.Ordinal, message); } + + VerifyDiagnosticCustom(analyzers, actual, expected, verifier); } } 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 a02895c9a..ebc621a47 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 @@ -294,6 +294,7 @@ virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.IsCompilerDiagnos virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.GetAnalyzerOptions(Microsoft.CodeAnalysis.Project project) -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.GetDefaultDiagnostic(Microsoft.CodeAnalysis.Diagnostics.DiagnosticAnalyzer[] analyzers) -> Microsoft.CodeAnalysis.DiagnosticDescriptor virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.RunAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task +virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.VerifyDiagnosticCustom(System.Collections.Immutable.ImmutableArray analyzers, Microsoft.CodeAnalysis.Diagnostic actual, Microsoft.CodeAnalysis.Testing.DiagnosticResult expected, Microsoft.CodeAnalysis.Testing.IVerifier verifier) -> void virtual Microsoft.CodeAnalysis.Testing.CodeActionTest.FilterCodeActions(System.Collections.Immutable.ImmutableArray actions) -> System.Collections.Immutable.ImmutableArray virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.CreateMessage(string message) -> string virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.Empty(string collectionName, System.Collections.Generic.IEnumerable collection) -> void From 67f31e031378be09d778c802cd6d73f322540ad9 Mon Sep 17 00:00:00 2001 From: Niko Schuessler <54370830+nschuessler@users.noreply.github.com> Date: Mon, 10 Aug 2020 15:09:24 -0700 Subject: [PATCH 2/4] Update API based on review feedback. --- .../AnalyzerTest`1.cs | 26 ++++++++----------- .../PublicAPI.Unshipped.txt | 3 ++- 2 files changed, 13 insertions(+), 16 deletions(-) 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 ab68c1763..b0ad1d8de 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 @@ -133,8 +133,18 @@ public string TestCode /// public List DisabledDiagnostics { get; } = new List(); + /// + /// Gets or sets the reference assemblies to use. + /// public ReferenceAssemblies ReferenceAssemblies { get; set; } = ReferenceAssemblies.Default; + /// + /// Gets or sets an additional verifier for a diagnostic. + /// The action compares actual and the expected + /// based on custom test requirements not yet supported by the test framework. + /// + public Action, Diagnostic, DiagnosticResult, IVerifier>? DiagnosticVerifier { get; set; } + /// /// Gets a collection of transformation functions to apply to during diagnostic /// or code fix test setup. @@ -239,20 +249,6 @@ protected async Task VerifyDiagnosticsAsync((string filename, SourceText content await VerifySuppressionDiagnosticsAsync(analyzers, sources, additionalFiles, additionalProjects, additionalMetadataReferences, expected, verifier, cancellationToken).ConfigureAwait(false); } - /// - /// Checks each of the actual s found and compares them with the corresponding - /// based on custom test requirements not yet supported by the test framework. - /// - /// The analyzers that have been run on the sources. - /// The s found by the compiler after running the analyzer - /// on the source code. - /// The s describing the expected - /// diagnostics for the sources. - /// The verifier to use for test assertions. - protected virtual void VerifyDiagnosticCustom(ImmutableArray analyzers, Diagnostic actual, DiagnosticResult expected, IVerifier verifier) - { - } - private async Task VerifyGeneratedCodeDiagnosticsAsync(ImmutableArray analyzers, (string filename, SourceText content)[] sources, (string filename, SourceText content)[] additionalFiles, ProjectState[] additionalProjects, MetadataReference[] additionalMetadataReferences, DiagnosticResult[] expected, IVerifier verifier, CancellationToken cancellationToken) { if (TestBehaviors.HasFlag(TestBehaviors.SkipGeneratedCodeCheck) @@ -386,7 +382,7 @@ private void VerifyDiagnosticResults(IEnumerable actualResults, Immu message); } - VerifyDiagnosticCustom(analyzers, actual, expected, verifier); + DiagnosticVerifier?.Invoke(analyzers, actual, expected, verifier); } } 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 ebc621a47..adb1b4822 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 @@ -3,6 +3,8 @@ Microsoft.CodeAnalysis.Testing.AnalyzerTest.AnalyzerTest() -> void Microsoft.CodeAnalysis.Testing.AnalyzerTest.CompilerDiagnostics.get -> Microsoft.CodeAnalysis.Testing.CompilerDiagnostics Microsoft.CodeAnalysis.Testing.AnalyzerTest.CompilerDiagnostics.set -> void Microsoft.CodeAnalysis.Testing.AnalyzerTest.CreateProjectAsync((string filename, Microsoft.CodeAnalysis.Text.SourceText content)[] sources, (string filename, Microsoft.CodeAnalysis.Text.SourceText content)[] additionalFiles, Microsoft.CodeAnalysis.Testing.ProjectState[] additionalProjects, Microsoft.CodeAnalysis.MetadataReference[] additionalMetadataReferences, string language, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task +Microsoft.CodeAnalysis.Testing.AnalyzerTest.DiagnosticVerifier.get -> System.Action, Microsoft.CodeAnalysis.Diagnostic, Microsoft.CodeAnalysis.Testing.DiagnosticResult, Microsoft.CodeAnalysis.Testing.IVerifier> +Microsoft.CodeAnalysis.Testing.AnalyzerTest.DiagnosticVerifier.set -> void 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 @@ -294,7 +296,6 @@ virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.IsCompilerDiagnos virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.GetAnalyzerOptions(Microsoft.CodeAnalysis.Project project) -> Microsoft.CodeAnalysis.Diagnostics.AnalyzerOptions virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.GetDefaultDiagnostic(Microsoft.CodeAnalysis.Diagnostics.DiagnosticAnalyzer[] analyzers) -> Microsoft.CodeAnalysis.DiagnosticDescriptor virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.RunAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task -virtual Microsoft.CodeAnalysis.Testing.AnalyzerTest.VerifyDiagnosticCustom(System.Collections.Immutable.ImmutableArray analyzers, Microsoft.CodeAnalysis.Diagnostic actual, Microsoft.CodeAnalysis.Testing.DiagnosticResult expected, Microsoft.CodeAnalysis.Testing.IVerifier verifier) -> void virtual Microsoft.CodeAnalysis.Testing.CodeActionTest.FilterCodeActions(System.Collections.Immutable.ImmutableArray actions) -> System.Collections.Immutable.ImmutableArray virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.CreateMessage(string message) -> string virtual Microsoft.CodeAnalysis.Testing.DefaultVerifier.Empty(string collectionName, System.Collections.Generic.IEnumerable collection) -> void From 0a98b506c2237e8d6ce4045a554cd57992f12915 Mon Sep 17 00:00:00 2001 From: Niko Schuessler <54370830+nschuessler@users.noreply.github.com> Date: Mon, 10 Aug 2020 18:07:45 -0700 Subject: [PATCH 3/4] Remove analyzers argument. --- .../Microsoft.CodeAnalysis.Analyzer.Testing/AnalyzerTest`1.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b0ad1d8de..d1eac023a 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 @@ -143,7 +143,7 @@ public string TestCode /// The action compares actual and the expected /// based on custom test requirements not yet supported by the test framework. /// - public Action, Diagnostic, DiagnosticResult, IVerifier>? DiagnosticVerifier { get; set; } + public Action? DiagnosticVerifier { get; set; } /// /// Gets a collection of transformation functions to apply to during diagnostic @@ -382,7 +382,7 @@ private void VerifyDiagnosticResults(IEnumerable actualResults, Immu message); } - DiagnosticVerifier?.Invoke(analyzers, actual, expected, verifier); + DiagnosticVerifier?.Invoke(actual, expected, verifier); } } From 1fe7f624441e91bae6f133795cef6cca93123af1 Mon Sep 17 00:00:00 2001 From: Niko Schuessler <54370830+nschuessler@users.noreply.github.com> Date: Mon, 10 Aug 2020 18:29:09 -0700 Subject: [PATCH 4/4] Update public api signatures. --- .../PublicAPI.Unshipped.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 adb1b4822..38d425db6 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 @@ -3,7 +3,7 @@ Microsoft.CodeAnalysis.Testing.AnalyzerTest.AnalyzerTest() -> void Microsoft.CodeAnalysis.Testing.AnalyzerTest.CompilerDiagnostics.get -> Microsoft.CodeAnalysis.Testing.CompilerDiagnostics Microsoft.CodeAnalysis.Testing.AnalyzerTest.CompilerDiagnostics.set -> void Microsoft.CodeAnalysis.Testing.AnalyzerTest.CreateProjectAsync((string filename, Microsoft.CodeAnalysis.Text.SourceText content)[] sources, (string filename, Microsoft.CodeAnalysis.Text.SourceText content)[] additionalFiles, Microsoft.CodeAnalysis.Testing.ProjectState[] additionalProjects, Microsoft.CodeAnalysis.MetadataReference[] additionalMetadataReferences, string language, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task -Microsoft.CodeAnalysis.Testing.AnalyzerTest.DiagnosticVerifier.get -> System.Action, Microsoft.CodeAnalysis.Diagnostic, Microsoft.CodeAnalysis.Testing.DiagnosticResult, Microsoft.CodeAnalysis.Testing.IVerifier> +Microsoft.CodeAnalysis.Testing.AnalyzerTest.DiagnosticVerifier.get -> System.Action Microsoft.CodeAnalysis.Testing.AnalyzerTest.DiagnosticVerifier.set -> void Microsoft.CodeAnalysis.Testing.AnalyzerTest.DisabledDiagnostics.get -> System.Collections.Generic.List Microsoft.CodeAnalysis.Testing.AnalyzerTest.ExpectedDiagnostics.get -> System.Collections.Generic.List