public async Task TestRegisteredCodeActionsWithSameEquivalenceKey(string?equivalenceKey) { var diagnosticId = "ID1"; var analyzer = new MockAnalyzerReference.MockDiagnosticAnalyzer(ImmutableArray.Create(diagnosticId)); var fixer = new CodeFixProviderWithDuplicateEquivalenceKeyActions(diagnosticId, equivalenceKey); // Verify multiple code actions registered with same equivalence key are not de-duped. var fixes = (await GetAddedFixesAsync(fixer, analyzer)).SelectMany(fixCollection => fixCollection.Fixes).ToList(); Assert.Equal(2, fixes.Count); }
public async Task TestNuGetAndVsixCodeFixersWithMultipleFixableDiagnosticIdsAsync() { const string id1 = "ID1"; const string id2 = "ID2"; var reportedDiagnosticIds = ImmutableArray.Create(id1, id2); var diagnosticAnalyzer = new MockAnalyzerReference.MockDiagnosticAnalyzer(reportedDiagnosticIds); // Only NuGet code fix provider which fixes both reported diagnostic IDs. // Verify only NuGet fixer's code actions registered and they fix all IDs. await TestNuGetAndVsixCodeFixersCoreAsync( nugetFixer : new NuGetCodeFixProvider(reportedDiagnosticIds), expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer : reportedDiagnosticIds, vsixFixer : null, expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer : ImmutableArray <string> .Empty, diagnosticAnalyzer); // Only Vsix code fix provider which fixes both reported diagnostic IDs. // Verify only Vsix fixer's code action registered and they fix all IDs. await TestNuGetAndVsixCodeFixersCoreAsync( nugetFixer : null, expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer : ImmutableArray <string> .Empty, vsixFixer : new VsixCodeFixProvider(reportedDiagnosticIds), expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer : reportedDiagnosticIds, diagnosticAnalyzer); // Both NuGet and Vsix code fix provider register same fixable IDs. // Verify only NuGet fixer's code actions registered. await TestNuGetAndVsixCodeFixersCoreAsync( nugetFixer : new NuGetCodeFixProvider(reportedDiagnosticIds), expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer : reportedDiagnosticIds, vsixFixer : new VsixCodeFixProvider(reportedDiagnosticIds), expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer : ImmutableArray <string> .Empty, diagnosticAnalyzer); // Both NuGet and Vsix code fix provider register different fixable IDs. // Verify both NuGet and Vsix fixer's code actions registered. await TestNuGetAndVsixCodeFixersCoreAsync( nugetFixer : new NuGetCodeFixProvider(ImmutableArray.Create(id1)), expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer : ImmutableArray.Create(id1), vsixFixer : new VsixCodeFixProvider(ImmutableArray.Create(id2)), expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer : ImmutableArray.Create(id2), diagnosticAnalyzer); // NuGet code fix provider registers subset of Vsix code fix provider fixable IDs. // Verify both NuGet and Vsix fixer's code actions registered, // there are no duplicates and NuGet ones are preferred for duplicates. await TestNuGetAndVsixCodeFixersCoreAsync( nugetFixer : new NuGetCodeFixProvider(ImmutableArray.Create(id1)), expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer : ImmutableArray.Create(id1), vsixFixer : new VsixCodeFixProvider(reportedDiagnosticIds), expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer : ImmutableArray.Create(id2), diagnosticAnalyzer); }
private async Task TestNuGetAndVsixCodeFixersCoreAsync( NuGetCodeFixProvider?nugetFixer, ImmutableArray <string> expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer, VsixCodeFixProvider?vsixFixer, ImmutableArray <string> expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer, MockAnalyzerReference.MockDiagnosticAnalyzer diagnosticAnalyzer) { var fixes = (await GetNuGetAndVsixCodeFixersCoreAsync(nugetFixer, vsixFixer, diagnosticAnalyzer)) .SelectMany(fixCollection => fixCollection.Fixes); var nugetFixerRegisteredActions = fixes.Where(f => f.Action.Title == nameof(NuGetCodeFixProvider)); var actualDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer = nugetFixerRegisteredActions.SelectMany(a => a.Diagnostics).Select(d => d.Id); Assert.True(actualDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer.SetEquals(expectedDiagnosticIdsWithRegisteredCodeActionsByNuGetFixer)); var vsixFixerRegisteredActions = fixes.Where(f => f.Action.Title == nameof(VsixCodeFixProvider)); var actualDiagnosticIdsWithRegisteredCodeActionsByVsixFixer = vsixFixerRegisteredActions.SelectMany(a => a.Diagnostics).Select(d => d.Id); Assert.True(actualDiagnosticIdsWithRegisteredCodeActionsByVsixFixer.SetEquals(expectedDiagnosticIdsWithRegisteredCodeActionsByVsixFixer)); }
public async Task TestGetFixesAsyncForFixableAndNonFixableAnalyzersAsync() { var codeFix = new MockFixer(); var analyzerWithFix = new MockAnalyzerReference.MockDiagnosticAnalyzer(); Assert.Equal(codeFix.FixableDiagnosticIds.Single(), analyzerWithFix.SupportedDiagnostics.Single().Id); var analyzerWithoutFix = new MockAnalyzerReference.MockDiagnosticAnalyzer("AnalyzerWithoutFixId", "Category"); var analyzers = ImmutableArray.Create <DiagnosticAnalyzer>(analyzerWithFix, analyzerWithoutFix); var analyzerReference = new MockAnalyzerReference(codeFix, analyzers); // Verify no callbacks received at initialization. Assert.False(analyzerWithFix.ReceivedCallback); Assert.False(analyzerWithoutFix.ReceivedCallback); var tuple = ServiceSetup(codeFix, includeConfigurationFixProviders: true); using var workspace = tuple.workspace; GetDocumentAndExtensionManager(tuple.analyzerService, workspace, out var document, out var extensionManager, analyzerReference); var options = CodeActionOptions.Default; // Verify only analyzerWithFix is executed when GetFixesAsync is invoked with 'CodeActionRequestPriority.Normal'. _ = await tuple.codeFixService.GetFixesAsync(document, TextSpan.FromBounds(0, 0), priority : CodeActionRequestPriority.Normal, options, addOperationScope : _ => null, cancellationToken : CancellationToken.None); Assert.True(analyzerWithFix.ReceivedCallback); Assert.False(analyzerWithoutFix.ReceivedCallback); // Verify both analyzerWithFix and analyzerWithoutFix are executed when GetFixesAsync is invoked with 'CodeActionRequestPriority.Lowest'. _ = await tuple.codeFixService.GetFixesAsync(document, TextSpan.FromBounds(0, 0), priority : CodeActionRequestPriority.Lowest, options, addOperationScope : _ => null, cancellationToken : CancellationToken.None); Assert.True(analyzerWithFix.ReceivedCallback); Assert.True(analyzerWithoutFix.ReceivedCallback); }