diff --git a/java/execution/impl/src/com/intellij/execution/testframework/AbstractJavaTestConfigurationProducer.java b/java/execution/impl/src/com/intellij/execution/testframework/AbstractJavaTestConfigurationProducer.java index da5f5cc6460d..a3bb261ede5b 100644 --- a/java/execution/impl/src/com/intellij/execution/testframework/AbstractJavaTestConfigurationProducer.java +++ b/java/execution/impl/src/com/intellij/execution/testframework/AbstractJavaTestConfigurationProducer.java @@ -71,10 +71,12 @@ public abstract class AbstractJavaTestConfigurationProducer frameworks = TestFrameworks.detectApplicableFrameworks(psiClass); + return frameworks.stream().filter(framework -> framework instanceof JavaTestFramework && ((JavaTestFramework)framework).isMyConfigurationType(configurationType)) + .map(framework -> (JavaTestFramework)framework) + .findFirst() + .orElse(null); } return null; } diff --git a/java/java-psi-api/src/com/intellij/codeInsight/TestFrameworks.java b/java/java-psi-api/src/com/intellij/codeInsight/TestFrameworks.java index 45bd2c4c4bc0..e13a5a99bc3b 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/TestFrameworks.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/TestFrameworks.java @@ -26,6 +26,9 @@ import com.intellij.testIntegration.TestFramework; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.LinkedHashSet; +import java.util.Set; + /** * @author yole */ @@ -60,6 +63,29 @@ public abstract class TestFrameworks { .create(computeFramework(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT)); } + @NotNull + public static Set detectApplicableFrameworks(@NotNull final PsiClass psiClass) { + return CachedValuesManager.getCachedValue(psiClass, () -> CachedValueProvider.Result + .create(computeFrameworks(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT)); + } + + private static Set computeFrameworks(PsiClass psiClass) { + Set frameworks = new LinkedHashSet<>(); + for (TestFramework framework : Extensions.getExtensions(TestFramework.EXTENSION_NAME)) { + if (framework.isTestClass(psiClass)) { + frameworks.add(framework); + } + } + + for (TestFramework framework : Extensions.getExtensions(TestFramework.EXTENSION_NAME)) { + if (frameworks.contains(framework)) continue;; + if (framework.findSetUpMethod(psiClass) != null || framework.findTearDownMethod(psiClass) != null) { + frameworks.add(framework); + } + } + return frameworks; + } + @Nullable private static TestFramework computeFramework(PsiClass psiClass) { for (TestFramework framework : Extensions.getExtensions(TestFramework.EXTENSION_NAME)) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java index 05727e23fb47..b76b701159b5 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java @@ -23,6 +23,8 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.naming.ConventionInspection; import org.jetbrains.annotations.NotNull; +import java.util.Set; + public class JUnitTestClassNamingConventionInspectionBase extends ConventionInspection { private static final int DEFAULT_MIN_LENGTH = 8; private static final int DEFAULT_MAX_LENGTH = 64; @@ -88,8 +90,8 @@ public class JUnitTestClassNamingConventionInspectionBase extends ConventionInsp return; } - final TestFramework framework = TestFrameworks.detectFramework(aClass); - if (framework == null || !framework.getName().startsWith("JUnit") || !framework.isTestClass(aClass)) { + final Set frameworks = TestFrameworks.detectApplicableFrameworks(aClass); + if (frameworks.stream().noneMatch(framework -> framework.getName().startsWith("JUnit") && framework.isTestClass(aClass))) { return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java index 1d324d2e38e6..c6cc3638a00d 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java @@ -28,6 +28,8 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + public class TestUtils { public static final String RUN_WITH = "org.junit.runner.RunWith"; @@ -64,8 +66,8 @@ public class TestUtils { if (method == null) return false; final PsiClass containingClass = method.getContainingClass(); if (containingClass == null) return false; - final TestFramework framework = TestFrameworks.detectFramework(containingClass); - return framework != null && framework.getName().startsWith("JUnit") && framework.isTestMethod(method, false); + final Set frameworks = TestFrameworks.detectApplicableFrameworks(containingClass); + return frameworks.stream().anyMatch(framework -> framework.getName().startsWith("JUnit") && framework.isTestMethod(method, false)); } public static boolean isRunnable(PsiMethod method) {