From 5fea40dba7158fca66dbea2d73a235ce0640a997 Mon Sep 17 00:00:00 2001 From: Sergey Evdokimov Date: Thu, 26 May 2011 14:31:52 +0400 Subject: [PATCH] IDEA-70191 (Grails 1.4) User should be ably to run Grails Tests defined via @TestFor as JUnit. --- .../intellij/execution/junit/JUnitUtil.java | 13 +++++++++++ .../intellij/execution/JUnitRecognizer.java | 22 +++++++++++++++++++ .../intellij/execution/junit/TestMethod.java | 18 ++++++++++++--- resources/src/META-INF/IdeaPlugin.xml | 3 +++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 java/execution/openapi/src/com/intellij/execution/JUnitRecognizer.java diff --git a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java index 31ec84a2a9f4..2b4904441e91 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java @@ -84,6 +84,13 @@ public class JUnitUtil { if (AnnotationUtil.isAnnotated(aClass, RUN_WITH, true)) return true; if (psiMethod.getParameterList().getParametersCount() > 0) return false; if (psiMethod.hasModifierProperty(PsiModifier.STATIC) && BaseTestRunner.SUITE_METHODNAME.equals(psiMethod.getName())) return false; + + for (JUnitRecognizer jUnitRecognizer : JUnitRecognizer.EP_NAME.getExtensions()) { + if (jUnitRecognizer.isTestMethod(psiMethod)) { + return true; + } + } + if (!psiMethod.getName().startsWith("test")) return false; PsiClass testCaseClass = getTestCaseClassOrNull(location); return testCaseClass != null && psiMethod.getContainingClass().isInheritor(testCaseClass, true); @@ -122,6 +129,12 @@ public class JUnitUtil { if (isTestAnnotated(method)) return true; } + for (JUnitRecognizer jUnitRecognizer : JUnitRecognizer.EP_NAME.getExtensions()) { + if (jUnitRecognizer.isTestClass(psiClass)) { + return true; + } + } + return false; } diff --git a/java/execution/openapi/src/com/intellij/execution/JUnitRecognizer.java b/java/execution/openapi/src/com/intellij/execution/JUnitRecognizer.java new file mode 100644 index 000000000000..bd045cc82c4b --- /dev/null +++ b/java/execution/openapi/src/com/intellij/execution/JUnitRecognizer.java @@ -0,0 +1,22 @@ +package com.intellij.execution; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import org.jetbrains.annotations.NotNull; + +/** + * @author Sergey Evdokimov + */ +public abstract class JUnitRecognizer { + + public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.junitRecognizer"); + + public boolean isTestClass(@NotNull PsiClass aClass) { + return false; + } + + public boolean isTestMethod(@NotNull PsiMethod method) { + return false; + } +} diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethod.java b/plugins/junit/src/com/intellij/execution/junit/TestMethod.java index c3e384b9418c..471221326a1e 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestMethod.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestMethod.java @@ -129,16 +129,18 @@ class TestMethod extends TestObject { } final JUnitUtil.TestMethodFilter filter = new JUnitUtil.TestMethodFilter(psiClass); boolean found = false; - boolean testAnnotated = false; + boolean testAnnotatedOrFromRecognizer = false; for (final PsiMethod method : psiClass.findMethodsByName(methodName, true)) { if (filter.value(method)) found = true; - if (JUnitUtil.isTestAnnotated(method)) testAnnotated = true; + if (JUnitUtil.isTestAnnotated(method) || isFromRecognizer(method)) { + testAnnotatedOrFromRecognizer = true; + } } if (!found) { throw new RuntimeConfigurationWarning(ExecutionBundle.message("test.method.doesnt.exist.error.message", methodName)); } - if (!AnnotationUtil.isAnnotated(psiClass, JUnitUtil.RUN_WITH, true) && !testAnnotated) { + if (!AnnotationUtil.isAnnotated(psiClass, JUnitUtil.RUN_WITH, true) && !testAnnotatedOrFromRecognizer) { try { final PsiClass testCaseClass = JUnitUtil.getTestCaseClass(configurationModule.getModule()); if (!psiClass.isInheritor(testCaseClass, true)) { @@ -151,4 +153,14 @@ class TestMethod extends TestObject { } } } + + private static boolean isFromRecognizer(PsiMethod method) { + for (JUnitRecognizer jUnitRecognizer : JUnitRecognizer.EP_NAME.getExtensions()) { + if (jUnitRecognizer.isTestMethod(method)) { + return true; + } + } + + return false; + } } diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 8d6d19e543e9..2643dee51676 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -33,6 +33,9 @@ + +