提交 a9f28bbf 编写于 作者: M Manish Vasani

Add code action equivalence key validation in test framework

Fixes #44553
上级 19c0d73e
......@@ -19,6 +19,8 @@
using Roslyn.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CodeRefactorings;
#if CODE_STYLE
using System.Diagnostics;
......@@ -681,6 +683,46 @@ static void VerifyExpectedDocumentText(string expected, string actual)
protected virtual ImmutableArray<CodeAction> MassageActions(ImmutableArray<CodeAction> actions)
=> actions;
internal static void VerifyCodeActionsRegisteredByProvider(List<CodeFix> fixes)
{
var diagnosticsAndEquivalenceKeyToTitleMap = new Dictionary<(Diagnostic diagnostic, string equivalenceKey), string>();
foreach (var fix in fixes)
{
var codeAction = fix.Action;
foreach (var diagnostic in fix.Diagnostics)
{
var key = (diagnostic, codeAction.EquivalenceKey);
var existingTitle = diagnosticsAndEquivalenceKeyToTitleMap.GetOrAdd(key, _ => codeAction.Title);
if (existingTitle != codeAction.Title)
{
Assert.False(true, @$"Expected different 'CodeAction.EquivalenceKey' for code actions registered for same diagnostic:
- Title 1: '{codeAction.Title}'
- Title 2: '{existingTitle}'
- Shared equivalence key: '{codeAction.EquivalenceKey ?? "<null>"}'");
}
}
}
}
internal static void VerifyCodeActionsRegisteredByProvider(CodeRefactoring refactorings)
{
var applicableSpanAndEquivalenceKeyToTitleMap = new Dictionary<(TextSpan applicableToSpan, string equivalenceKey), string>();
foreach (var (codeAction, applicableToSpan) in refactorings.CodeActions)
{
var key = (applicableToSpan ?? default, codeAction.EquivalenceKey);
var existingTitle = applicableSpanAndEquivalenceKeyToTitleMap.GetOrAdd(key, _ => codeAction.Title);
if (existingTitle != codeAction.Title)
{
Assert.False(true, @$"Expected different 'CodeAction.EquivalenceKey' for code actions registered for same applicable span:
- Title 1: '{codeAction.Title}'
- Title 2: '{existingTitle}'
- Shared equivalence key: '{codeAction.EquivalenceKey ?? "<null>"}'");
}
}
}
protected static ImmutableArray<CodeAction> FlattenActions(ImmutableArray<CodeAction> codeActions)
{
return codeActions.SelectMany(a => a.NestedCodeActions.Length > 0
......
......@@ -70,6 +70,9 @@ protected override Task<ImmutableArray<Diagnostic>> GetDiagnosticsWorkerAsync(Te
var result = actions.Count > 0 ? new CodeRefactoring(provider, actions.ToImmutable()) : null;
actions.Free();
VerifyCodeActionsRegisteredByProvider(result);
return result;
}
......
......@@ -202,6 +202,8 @@ protected Document GetDocumentAndAnnotatedSpan(TestWorkspace workspace, out stri
await fixer.RegisterCodeFixesAsync(context);
}
VerifyCodeActionsRegisteredByProvider(fixes);
var actions = fixes.SelectAsArray(f => f.Action);
actions = MassageActions(actions);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册