made intention tests not dependent on internal representation of quick fix popup

This commit is contained in:
Alexey Kudravtsev
2017-04-03 12:24:57 +03:00
parent 015760b7c8
commit e9781665c8
9 changed files with 56 additions and 155 deletions
@@ -17,7 +17,6 @@ package com.intellij.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.codeInspection.java18StreamApi.StaticPseudoFunctionalStyleMethodInspection;
import com.intellij.openapi.application.PathManager;
import com.intellij.pom.java.LanguageLevel;
@@ -113,18 +112,9 @@ public class StaticPseudoFunctionalStyleMethodTest extends JavaCodeInsightFixtur
private void doTest() {
myFixture.configureByFile(getTestName(true) + "/test.java");
myFixture.enableInspections(new StaticPseudoFunctionalStyleMethodInspection());
boolean isQuickFixFound = false;
for (IntentionAction action : myFixture.getAvailableIntentions()) {
if (action instanceof QuickFixWrapper) {
final LocalQuickFix fix = ((QuickFixWrapper)action).getFix();
if (fix instanceof StaticPseudoFunctionalStyleMethodInspection.ReplacePseudoLambdaWithLambda) {
myFixture.launchAction(action);
isQuickFixFound = true;
break;
}
}
}
assertTrue("Quick fix isn't found", isQuickFixFound);
IntentionAction action = myFixture.getAvailableIntention("Replace with Java Stream API pipeline");
assertNotNull("Quick fix isn't found", action);
myFixture.launchAction(action);
myFixture.checkResultByFile(getTestName(true) + "/test_after.java");
}
}
@@ -2,6 +2,7 @@ package com.intellij.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.intention.IntentionActionDelegate;
import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.codeInspection.inheritance.ChangeSuperClassFix;
import com.intellij.codeInspection.inheritance.SuperClassHasFrequentlyUsedInheritorsInspection;
@@ -11,6 +12,7 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashSet;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Set;
public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCodeInsightFixtureTestCase {
@@ -65,7 +67,13 @@ public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCod
myFixture.enableInspections(SuperClassHasFrequentlyUsedInheritorsInspection.class);
final Set<Pair<String, Integer>> actualSet = new HashSet<Pair<String, Integer>>();
for (IntentionAction intentionAction : myFixture.getAvailableIntentions()) {
for (Pair<String, Integer> pair : expectedResults) {
IntentionAction action = myFixture.findSingleIntention("Make extends '" + pair.getFirst() +
"' - " + pair.getSecond() +
"%");
IntentionAction intentionAction = ((IntentionActionDelegate)action).getDelegate();
if (intentionAction instanceof QuickFixWrapper) {
ChangeSuperClassFix changeSuperClassFix = getQuickFixFromWrapper((QuickFixWrapper)intentionAction);
if (changeSuperClassFix != null) {
@@ -73,7 +81,6 @@ public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCod
}
}
}
final Set<Pair<String, Integer>> expectedSet = ContainerUtil.newHashSet(expectedResults);
assertEquals(actualSet, expectedSet);
}
@@ -82,18 +89,9 @@ public class SuperClassHasFrequentlyUsedInheritorsInspectionTest extends JavaCod
myFixture.configureByFile(getTestName(false) + ".java");
myFixture.enableInspections(SuperClassHasFrequentlyUsedInheritorsInspection.class);
List<IntentionAction> actions = myFixture.filterAvailableIntentions("Make extends '");
final Set<Pair<String, Integer>> actualSet = new HashSet<Pair<String, Integer>>();
for (IntentionAction intentionAction : myFixture.getAvailableIntentions()) {
if (intentionAction instanceof QuickFixWrapper) {
ChangeSuperClassFix changeSuperClassFix = getQuickFixFromWrapper((QuickFixWrapper)intentionAction);
if (changeSuperClassFix != null) {
actualSet.add(Pair.create(changeSuperClassFix.getNewSuperClass().getQualifiedName(), changeSuperClassFix.getPercent()));
}
}
}
assertSize(expectedSize, actualSet);
assertEquals(expectedSize, actions.size());
}
@Nullable
@@ -16,6 +16,7 @@
package com.intellij.refactoring;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
@@ -28,11 +29,9 @@ import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiTypeElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.changeSignature.ChangeSignatureHandler;
import com.intellij.refactoring.changeSignature.inplace.ApplyChangeSignatureAction;
import com.intellij.refactoring.changeSignature.inplace.InplaceChangeSignature;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import com.intellij.util.containers.ContainerUtil;
/**
* User: anna
@@ -50,7 +49,8 @@ public class ChangeSignatureGestureTest extends LightCodeInsightFixtureTestCase
ChangeSignatureHandler.REFACTORING_NAME, null);
run.run();
myFixture.launchAction(ContainerUtil.findInstance(myFixture.getAvailableIntentions(), ApplyChangeSignatureAction.class));
IntentionAction action = myFixture.findSingleIntention("Changing signature of ");
myFixture.launchAction(action);
myFixture.checkResultByFile("/refactoring/changeSignatureGesture/" + getTestName(false) + "_after.java");
}
@@ -16,20 +16,15 @@
package com.siyeh.ig;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.testFramework.builders.JavaModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.lang.annotations.Language;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import java.util.List;
/**
* @author anna
@@ -109,24 +104,12 @@ public abstract class IGQuickFixesTestCase extends JavaCodeInsightFixtureTestCas
protected void doTest(final String testName, final String hint) {
myFixture.configureByFile(getRelativePath() + "/" + testName + ".java");
final IntentionAction action = findIntention(hint);
final IntentionAction action = myFixture.getAvailableIntention(hint);
assertNotNull(action);
myFixture.launchAction(action);
myFixture.checkResultByFile(getRelativePath() + "/" + testName + ".after.java");
}
public IntentionAction findIntention(@NotNull final String hint) {
final List<IntentionAction> allIntentions = myFixture.getAvailableIntentions();
final List<IntentionAction> intentions =
ContainerUtil.findAll(allIntentions,
intentionAction -> intentionAction instanceof QuickFixWrapper &&
intentionAction.getText().equals(hint));
Assert.assertFalse("\"" + hint + "\" not in " + intentions, intentions.isEmpty());
Assert.assertFalse("Too many quickfixes found for \"" + hint + "\": " + intentions + "]", intentions.size() > 1);
return intentions.get(0);
}
protected void doExpressionTest(
@NotNull String hint,
@Language(value = "JAVA", prefix = "class $X$ {{System.out.print(", suffix = ");}}") @NotNull @NonNls String before,
@@ -153,7 +136,7 @@ public abstract class IGQuickFixesTestCase extends JavaCodeInsightFixtureTestCas
@NotNull String fileName) {
before = before.replace("/**/", "<caret>");
myFixture.configureByText(fileName, before);
final IntentionAction intention = findIntention(hint);
IntentionAction intention = myFixture.getAvailableIntention(hint);
assertNotNull(intention);
myFixture.launchAction(intention);
myFixture.checkResult(after);
@@ -15,7 +15,6 @@
*/
package com.siyeh.ig.fixes.controlflow;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.IGQuickFixesTestCase;
import com.siyeh.ig.controlflow.TrivialIfInspection;
@@ -26,7 +25,7 @@ public class TrivialIfFixTest extends IGQuickFixesTestCase {
super.setUp();
myFixture.enableInspections(new TrivialIfInspection());
myRelativePath = "controlflow/trivialIf";
myDefaultHint = InspectionGadgetsBundle.message("constant.conditional.expression.simplify.quickfix");
myDefaultHint = "Simplify 'if else'";
}
public void testComments() {
@@ -15,9 +15,8 @@
*/
package org.jetbrains.plugins.groovy.intentions
import com.intellij.codeInsight.intention.impl.config.IntentionActionWrapper
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import org.jetbrains.plugins.groovy.intentions.declaration.GrCreateFieldForParameterIntention
import org.jetbrains.annotations.NotNull
import org.jetbrains.plugins.groovy.util.TestUtils
/**
* @author Max Medvedev
@@ -28,37 +27,31 @@ class CreateFieldFromParameterTest extends LightCodeInsightFixtureTestCase {
"${TestUtils.testDataPath}intentions/createFieldFromParameter/"
}
void test1() {doTest()}
void test2() {doTest()}
void test3() {doTest()}
void test4() {doTest()}
void _test5() {doTest()}
void _test6() {doTest()}
void _test7() {doTest()}
void test8() {doTest()}
void testArrayType() {doTest()}
void testBoundListTypeParameter() {doTest()}
void _testCaretOnMethod() {doTest()}
void _testCaretOnMethodWithOnlyAssignedParams() {doTest()}
void _testCaretOnMethodWithoutParams() {doTest()}
void testClassTypeParameter() {doTest()}
void testListClassTypeParameter() {doTest()}
void testListTypeParameter() {doTest()}
void _testNotNull() {doTest()}
void _testNullable() {doTest()}
void testSimpleTypeParameter() {doTest()}
void testTypeParameter() {doTest()}
void test1() {doTest("Create field for parameter 'id'")}
void test2() {doTest("Create field for parameter 'test'")}
void test3() {doTest("Create field for parameter 'length'")}
void test4() {doTest("Create field for parameter 'p1'")}
void _test5() {doTest("")}
void _test6() {doTest("")}
void _test7() {doTest("")}
void test8() {doTest("Create field for parameter 'p1'")}
void testArrayType() {doTest("Create field for parameter 'p1'")}
void testBoundListTypeParameter() {doTest("Create field for parameter 'p1'")}
void _testCaretOnMethod() {doTest("")}
void _testCaretOnMethodWithOnlyAssignedParams() {doTest("")}
void _testCaretOnMethodWithoutParams() {doTest("")}
void testClassTypeParameter() {doTest("Create field for parameter 'p1'")}
void testListClassTypeParameter() {doTest("Create field for parameter 'p1'")}
void testListTypeParameter() {doTest("Create field for parameter 'p1'")}
void _testNotNull() {doTest("")}
void _testNullable() {doTest("")}
void testSimpleTypeParameter() {doTest("Create field for parameter 'p1'")}
void testTypeParameter() {doTest("Create field for parameter 'p1'")}
private void doTest() {
private void doTest(@NotNull String hint) {
myFixture.configureByFile("before${getTestName(false)}.groovy")
def intentions = myFixture.availableIntentions
for (intention in intentions) {
if (intention instanceof IntentionActionWrapper) intention = intention.delegate
if (intention instanceof GrCreateFieldForParameterIntention) {
myFixture.launchAction(intention)
break
}
}
def intention = myFixture.findSingleIntention(hint)
myFixture.launchAction(intention)
myFixture.checkResultByFile("after${getTestName(false)}.groovy")
}
}
@@ -15,7 +15,7 @@
*/
package org.jetbrains.plugins.groovy.refactoring.introduceVariable
import com.intellij.codeInsight.intention.impl.config.IntentionActionWrapper
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
@@ -24,7 +24,6 @@ import org.jetbrains.annotations.NotNull
import org.jetbrains.plugins.groovy.intentions.GrIntentionTestCase
import org.jetbrains.plugins.groovy.intentions.declaration.GrIntroduceLocalVariableIntention
import org.jetbrains.plugins.groovy.util.TestUtils
/**
* @author siosio
*/
@@ -52,12 +51,9 @@ class IntroduceLocalVariableTest extends GrIntentionTestCase {
protected void doTest() {
myFixture.configureByFile("${getTestName(false)}.groovy")
def intentions = myFixture.availableIntentions
for (intention in intentions) {
if (intention instanceof IntentionActionWrapper) intention = intention.delegate
if (intention instanceof GrIntroduceLocalVariableIntention) {
new MockGrIntroduceLocalVariableIntention().invoke(myFixture.project, myFixture.editor, myFixture.file)
}
IntentionAction intention = myFixture.getAvailableIntention("Introduce local variable")
if (intention != null) {
new MockGrIntroduceLocalVariableIntention().invoke(myFixture.project, myFixture.editor, myFixture.file)
}
myFixture.checkResultByFile("${getTestName(false)}-after.groovy")
}
@@ -16,11 +16,8 @@
package com.jetbrains.python.fixtures;
import com.google.common.base.Joiner;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupEx;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.actions.ConfigurationFromContext;
import com.intellij.execution.actions.RunConfigurationProducer;
@@ -201,29 +198,6 @@ public abstract class PyTestCase extends UsefulTestCase {
}
}
/**
* Searches for quickfix itetion by its class
*
* @param clazz quick fix class
* @param <T> quick fix class
* @return quick fix or null if nothing found
*/
@Nullable
public <T extends LocalQuickFix> T findQuickFixByClassInIntentions(@NotNull final Class<T> clazz) {
for (final IntentionAction action : myFixture.getAvailableIntentions()) {
if ((action instanceof QuickFixWrapper)) {
final QuickFixWrapper quickFixWrapper = (QuickFixWrapper)action;
final LocalQuickFix fix = quickFixWrapper.getFix();
if (clazz.isInstance(fix)) {
@SuppressWarnings("unchecked")
final T result = (T)fix;
return result;
}
}
}
return null;
}
protected static void assertNotParsed(PyFile file) {
@@ -16,18 +16,10 @@
package com.jetbrains.python.quickFixes;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInspection.ex.QuickFixWrapper;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyQuickFixTestCase;
import com.jetbrains.python.codeInsight.imports.AutoImportQuickFix;
import com.jetbrains.python.codeInsight.imports.ImportCandidateHolder;
import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author Mikhail Golubev
@@ -40,22 +32,12 @@ public class PyAddImportQuickFixTest extends PyQuickFixTestCase {
}
public void testOsPathFunctions() throws Exception {
doMultiFileAutoImportTest("Import", fix -> {
final List<ImportCandidateHolder> candidates = fix.getCandidates();
final List<String> names = ContainerUtil.map(candidates, c -> c.getPresentableText("join"));
assertSameElements(names, "os.path.join()");
return true;
});
doMultiFileAutoImportTest("Import 'os.path.join()'");
}
// PY-19975
public void testCanonicalNamesFromHigherLevelPackage() {
doMultiFileAutoImportTest("Import", fix -> {
final List<ImportCandidateHolder> candidates = fix.getCandidates();
final List<String> names = ContainerUtil.map(candidates, c -> c.getPresentableText("MyClass"));
assertOrderedEquals(names, "bar.MyClass", "foo.MyClass");
return true;
});
doMultiFileAutoImportTest("Import this name");
}
// PY-22422
@@ -65,37 +47,23 @@ public class PyAddImportQuickFixTest extends PyQuickFixTestCase {
getPythonCodeStyleSettings().FROM_IMPORT_NEW_LINE_AFTER_LEFT_PARENTHESIS = true;
getPythonCodeStyleSettings().FROM_IMPORT_PARENTHESES_FORCE_IF_MULTILINE = true;
getPythonCodeStyleSettings().FROM_IMPORT_TRAILING_COMMA_IF_MULTILINE = true;
doMultiFileAutoImportTest("Import");
doMultiFileAutoImportTest("Import 'bar from module'");
}
// PY-21563
public void testCombineFromImportsForReferencesInTypeComment() {
doMultiFileAutoImportTest("Import");
doMultiFileAutoImportTest("Import this name");
}
private void doMultiFileAutoImportTest(@NotNull String hintPrefix) {
doMultiFileAutoImportTest(hintPrefix, null);
}
private void doMultiFileAutoImportTest(@NotNull String hintPrefix, @Nullable Processor<AutoImportQuickFix> checkQuickfix) {
myFixture.copyDirectoryToProject(getTestName(true), "");
myFixture.enableInspections(PyUnresolvedReferencesInspection.class);
final String entryPoint = "main";
myFixture.configureByFile(entryPoint + ".py");
myFixture.checkHighlighting(true, false, false);
final List<IntentionAction> intentions = myFixture.filterAvailableIntentions(hintPrefix);
final IntentionAction intention = ContainerUtil.find(intentions, action -> {
return action instanceof QuickFixWrapper && ((QuickFixWrapper)action).getFix() instanceof AutoImportQuickFix;
});
assertNotNull("Auto import quick fix starting with '" + hintPrefix + "' wasn't found", intention);
final AutoImportQuickFix quickfix = (AutoImportQuickFix)((QuickFixWrapper)intention).getFix();
boolean applyFix = true;
if (checkQuickfix != null) {
applyFix = checkQuickfix.process(quickfix);
}
if (applyFix) {
myFixture.launchAction(intention);
myFixture.checkResultByFile(getTestName(true) + "/" + entryPoint + "_after.py", true);
}
IntentionAction intention = myFixture.findSingleIntention(hintPrefix);
myFixture.launchAction(intention);
myFixture.checkResultByFile(getTestName(true) + "/" + entryPoint + "_after.py", true);
}
}