diff --git a/src/EditorFeatures/CSharpTest/InlineDiagnostics/InlineDiagnosticsTaggerProviderTests.cs b/src/EditorFeatures/CSharpTest/InlineDiagnostics/InlineDiagnosticsTaggerProviderTests.cs new file mode 100644 index 0000000000000..fcbb5b673911a --- /dev/null +++ b/src/EditorFeatures/CSharpTest/InlineDiagnostics/InlineDiagnosticsTaggerProviderTests.cs @@ -0,0 +1,47 @@ +// 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.Immutable; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.Editor.InlineDiagnostics; +using Microsoft.CodeAnalysis.Editor.UnitTests.Extensions; +using Microsoft.CodeAnalysis.Editor.UnitTests.Squiggles; +using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; +using Microsoft.CodeAnalysis.Options; +using Microsoft.CodeAnalysis.Test.Utilities; +using Microsoft.VisualStudio.Text.Adornments; +using Microsoft.VisualStudio.Text.Tagging; +using Roslyn.Test.Utilities; +using Roslyn.Utilities; +using Xunit; + +namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.InlineDiagnostics +{ + [UseExportProvider] + public class InlineDiagnosticsTaggerProviderTests + { + [WpfFact, Trait(Traits.Feature, Traits.Features.ErrorSquiggles)] + public async Task ErrorTagGeneratedForError() + { + var spans = await GetTagSpansAsync("class C {"); + Assert.Equal(1, spans.Count()); + + var firstSpan = spans.First(); + Assert.Equal(PredefinedErrorTypeNames.SyntaxError, firstSpan.Tag.ErrorType); + } + + private static async Task>> GetTagSpansAsync(string content) + { + using var workspace = TestWorkspace.CreateCSharp(content, composition: SquiggleUtilities.WpfCompositionWithSolutionCrawler); + return await GetTagSpansAsync(workspace); + } + + private static async Task>> GetTagSpansAsync(TestWorkspace workspace) + { + workspace.ApplyOptions(new[] { KeyValuePairUtil.Create(new OptionKey2(InlineDiagnosticsOptions.EnableInlineDiagnostics, LanguageNames.CSharp), (object)true) }); + return (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace)).Item2; + } + } +} diff --git a/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs b/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs index cbdbef1636087..599213a3cc41b 100644 --- a/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs +++ b/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs @@ -75,7 +75,7 @@ void Test() "; using var workspace = TestWorkspace.Create(workspaceXml); - var spans = (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace)).Item2; + var spans = (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace)).Item2; Assert.Equal(1, spans.Count()); Assert.Equal(PredefinedErrorTypeNames.SyntaxError, spans.First().Tag.ErrorType); @@ -126,7 +126,7 @@ void Test() } }; - var diagnosticsAndSpans = await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace, analyzerMap); + var diagnosticsAndSpans = await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace, analyzerMap); var spans = diagnosticsAndSpans.Item1 @@ -204,7 +204,7 @@ public async Task SemanticErrorReported() { using var workspace = TestWorkspace.CreateCSharp("class C : Bar { }", composition: SquiggleUtilities.CompositionWithSolutionCrawler); - var spans = await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace); + var spans = await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace); Assert.Equal(1, spans.Item2.Count()); @@ -296,10 +296,10 @@ class Test var updateArgs = DiagnosticsUpdatedArgs.DiagnosticsCreated( new object(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id, ImmutableArray.Create( - TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 0)), - TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 1)))); + TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 0)), + TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 1)))); - var spans = await TestDiagnosticTagProducer.GetErrorsFromUpdateSource(workspace, updateArgs); + var spans = await TestDiagnosticTagProducer.GetErrorsFromUpdateSource(workspace, updateArgs); Assert.Equal(1, spans.Count()); var first = spans.First(); @@ -327,10 +327,10 @@ class Test var updateArgs = DiagnosticsUpdatedArgs.DiagnosticsCreated( new LiveId(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id, ImmutableArray.Create( - TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 0)), - TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 1)))); + TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 0)), + TestDiagnosticTagProducer.CreateDiagnosticData(document, new TextSpan(0, 1)))); - var spans = await TestDiagnosticTagProducer.GetErrorsFromUpdateSource(workspace, updateArgs); + var spans = await TestDiagnosticTagProducer.GetErrorsFromUpdateSource(workspace, updateArgs); Assert.Equal(2, spans.Count()); var first = spans.First(); @@ -350,7 +350,7 @@ public LiveId() private static async Task>> GetTagSpansAsync(string content) { using var workspace = TestWorkspace.CreateCSharp(content, composition: SquiggleUtilities.CompositionWithSolutionCrawler); - return (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace)).Item2; + return (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace)).Item2; } private sealed class ReportOnClassWithLink : DiagnosticAnalyzer diff --git a/src/EditorFeatures/CSharpTest/SuggestionTags/SuggestionTagProducerTests.cs b/src/EditorFeatures/CSharpTest/SuggestionTags/SuggestionTagProducerTests.cs index 7d236a28c1f68..60a800bee0936 100644 --- a/src/EditorFeatures/CSharpTest/SuggestionTags/SuggestionTagProducerTests.cs +++ b/src/EditorFeatures/CSharpTest/SuggestionTags/SuggestionTagProducerTests.cs @@ -47,7 +47,7 @@ void M() { { LanguageNames.CSharp, ImmutableArray.Create(new CSharpUseObjectInitializerDiagnosticAnalyzer()) } }; - var spans = (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace, analyzerMap)).Item2; + var spans = (await TestDiagnosticTagProducer.GetDiagnosticsAndErrorSpans(workspace, analyzerMap)).Item2; return (spans, workspace.Documents.Single().SelectedSpans.Single()); } } diff --git a/src/EditorFeatures/TestUtilities/Diagnostics/DiagnosticTaggerWrapper.cs b/src/EditorFeatures/TestUtilities/Diagnostics/DiagnosticTaggerWrapper.cs index 9b228efd368af..bd97c0ed0d506 100644 --- a/src/EditorFeatures/TestUtilities/Diagnostics/DiagnosticTaggerWrapper.cs +++ b/src/EditorFeatures/TestUtilities/Diagnostics/DiagnosticTaggerWrapper.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Editor.Implementation.Diagnostics; +using Microsoft.CodeAnalysis.Editor.InlineDiagnostics; using Microsoft.CodeAnalysis.Editor.Shared.Utilities; using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces; using Microsoft.CodeAnalysis.Shared.TestHooks; @@ -76,7 +77,8 @@ public ITaggerProvider TaggerProvider if (typeof(TProvider) == typeof(DiagnosticsSquiggleTaggerProvider) || typeof(TProvider) == typeof(DiagnosticsSuggestionTaggerProvider) - || typeof(TProvider) == typeof(DiagnosticsClassificationTaggerProvider)) + || typeof(TProvider) == typeof(DiagnosticsClassificationTaggerProvider) + || typeof(TProvider) == typeof(InlineDiagnosticsTaggerProvider)) { _taggerProvider = _workspace.ExportProvider.GetExportedValues() .OfType() diff --git a/src/EditorFeatures/TestUtilities/Squiggles/SquiggleUtilities.cs b/src/EditorFeatures/TestUtilities/Squiggles/SquiggleUtilities.cs index 421c387d4c951..1df8d05f47a29 100644 --- a/src/EditorFeatures/TestUtilities/Squiggles/SquiggleUtilities.cs +++ b/src/EditorFeatures/TestUtilities/Squiggles/SquiggleUtilities.cs @@ -26,13 +26,17 @@ public static class SquiggleUtilities internal static TestComposition CompositionWithSolutionCrawler = EditorTestCompositions.EditorFeatures .RemoveParts(typeof(MockWorkspaceEventListenerProvider)); - internal static async Task<(ImmutableArray, ImmutableArray>)> GetDiagnosticsAndErrorSpansAsync( + internal static TestComposition WpfCompositionWithSolutionCrawler = EditorTestCompositions.EditorFeaturesWpf + .RemoveParts(typeof(MockWorkspaceEventListenerProvider)); + + internal static async Task<(ImmutableArray, ImmutableArray>)> GetDiagnosticsAndErrorSpansAsync( TestWorkspace workspace, IReadOnlyDictionary> analyzerMap = null) - where TProvider : AbstractDiagnosticsAdornmentTaggerProvider + where TProvider : AbstractDiagnosticsAdornmentTaggerProvider + where TTag : class, ITag { - using var wrapper = new DiagnosticTaggerWrapper(workspace, analyzerMap); - var tagger = wrapper.TaggerProvider.CreateTagger(workspace.Documents.First().GetTextBuffer()); + using var wrapper = new DiagnosticTaggerWrapper(workspace, analyzerMap); + var tagger = wrapper.TaggerProvider.CreateTagger(workspace.Documents.First().GetTextBuffer()); using var disposable = tagger as IDisposable; await wrapper.WaitForTags(); diff --git a/src/EditorFeatures/TestUtilities/Squiggles/TestDiagnosticTagProducer.cs b/src/EditorFeatures/TestUtilities/Squiggles/TestDiagnosticTagProducer.cs index 18e8a2a490cdf..bcf78b9d02685 100644 --- a/src/EditorFeatures/TestUtilities/Squiggles/TestDiagnosticTagProducer.cs +++ b/src/EditorFeatures/TestUtilities/Squiggles/TestDiagnosticTagProducer.cs @@ -22,24 +22,25 @@ namespace Microsoft.CodeAnalysis.Editor.UnitTests.Squiggles { - internal sealed class TestDiagnosticTagProducer - where TProvider : AbstractDiagnosticsAdornmentTaggerProvider + internal sealed class TestDiagnosticTagProducer + where TProvider : AbstractDiagnosticsAdornmentTaggerProvider + where TTag : class, ITag { - internal static Task<(ImmutableArray, ImmutableArray>)> GetDiagnosticsAndErrorSpans( + internal static Task<(ImmutableArray, ImmutableArray>)> GetDiagnosticsAndErrorSpans( TestWorkspace workspace, IReadOnlyDictionary> analyzerMap = null) { - return SquiggleUtilities.GetDiagnosticsAndErrorSpansAsync(workspace, analyzerMap); + return SquiggleUtilities.GetDiagnosticsAndErrorSpansAsync(workspace, analyzerMap); } - internal static async Task>> GetErrorsFromUpdateSource(TestWorkspace workspace, DiagnosticsUpdatedArgs updateArgs) + internal static async Task>> GetErrorsFromUpdateSource(TestWorkspace workspace, DiagnosticsUpdatedArgs updateArgs) { var globalOptions = workspace.GetService(); var source = new TestDiagnosticUpdateSource(globalOptions); - using var wrapper = new DiagnosticTaggerWrapper(workspace, updateSource: source); + using var wrapper = new DiagnosticTaggerWrapper(workspace, updateSource: source); - var tagger = wrapper.TaggerProvider.CreateTagger(workspace.Documents.First().GetTextBuffer()); + var tagger = wrapper.TaggerProvider.CreateTagger(workspace.Documents.First().GetTextBuffer()); using var disposable = (IDisposable)tagger; source.RaiseDiagnosticsUpdated(updateArgs);