From 543f3ad6092c99884f8a8caaf3f620845d42ca93 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 17 Apr 2019 14:18:23 +0200 Subject: [PATCH] junit: ensure class methods are filtered by patterns (IDEA-210882) --- .../configurations/module1/pattern/TestA.java | 8 +++++++ .../java/execution/ConfigurationsTest.java | 18 ++++++++++++++ .../execution/junit/TestDirectory.java | 6 ++--- .../intellij/execution/junit/TestPackage.java | 19 ++++++++++----- .../execution/junit/TestsPattern.java | 24 ++++++++++++++----- 5 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/junit/configurations/module1/pattern/TestA.java diff --git a/java/java-tests/testData/junit/configurations/module1/pattern/TestA.java b/java/java-tests/testData/junit/configurations/module1/pattern/TestA.java new file mode 100644 index 000000000000..c48bcf060ffb --- /dev/null +++ b/java/java-tests/testData/junit/configurations/module1/pattern/TestA.java @@ -0,0 +1,8 @@ +package pattern; + +import junit.framework.TestCase; + +public class TestA extends TestCase { + public void test1() {} + public void test2() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java b/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java index 8d568722d308..f5e069dc0676 100644 --- a/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java @@ -224,6 +224,24 @@ public class ConfigurationsTest extends BaseConfigurationTestCase { "TestA"}, lines); } + + public void testPattern() throws IOException, ExecutionException { + Module module1 = getModule1(); + + JUnitConfiguration configuration = new JUnitConfiguration("", myProject); + configuration.getPersistentData().TEST_OBJECT = JUnitConfiguration.TEST_PATTERN; + configuration.getPersistentData().setPatterns(ContainerUtil.newLinkedHashSet("pattern.TestA,test1")); + configuration.setModule(module1); + JavaParameters parameters = checkCanRun(configuration); + String filePath = ContainerUtil.find(parameters.getProgramParametersList().getArray(), + value -> StringUtil.startsWithChar(value, '@') && !StringUtil.startsWith(value, "@w@")).substring(1); + List lines = FileUtilRt.loadLines(new File(filePath)); + lines.remove(0); + Assertion.compareUnordered( + //category, filters, classNames... + new Object[]{"", "pattern.TestA,test1"}, + lines); + } public void testRunAllInPackageWhenPackageIsEmptyInModule() throws ExecutionException { assignJdk(getModule2()); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestDirectory.java b/plugins/junit/src/com/intellij/execution/junit/TestDirectory.java index 771c7bb80611..fe5a96aca70d 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestDirectory.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestDirectory.java @@ -95,7 +95,7 @@ class TestDirectory extends TestPackage { } @Override - protected void searchTests5(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { + protected void searchTests5(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { if (module != null) { PsiDirectory directory = getDirectory(getConfiguration().getPersistentData()); PsiPackage aPackage = JavaRuntimeConfigurationProducerBase.checkPackage(directory); @@ -110,12 +110,12 @@ class TestDirectory extends TestPackage { } @Override - protected boolean filterOutputByDirectoryForJunit5(Set classNames) { + protected boolean filterOutputByDirectoryForJunit5(Set classNames) { return true; } @Override - protected String getFilters(Set foundClasses, String packageName) { + protected String getFilters(Set foundClasses, String packageName) { return foundClasses.isEmpty() ? super.getFilters(foundClasses, packageName) : StringUtil.join(foundClasses, CLASS_NAME_FUNCTION, "||"); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index 1950982fd2a2..a690b7179932 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -35,7 +35,14 @@ import java.util.LinkedHashSet; import java.util.Set; public class TestPackage extends TestObject { - protected static final Function CLASS_NAME_FUNCTION = psiClass -> psiClass != null ? ClassUtil.getJVMClassName(psiClass) : null; + protected static final Function CLASS_NAME_FUNCTION = member -> { + if (member instanceof PsiMethod) { + PsiClass containingClass = member.getContainingClass(); + if (containingClass == null) return null; + return ClassUtil.getJVMClassName(containingClass) + "," + member.getName(); + } + return member instanceof PsiClass ? ClassUtil.getJVMClassName((PsiClass)member) : null; + }; public TestPackage(JUnitConfiguration configuration, ExecutionEnvironment environment) { super(configuration, environment); @@ -53,7 +60,7 @@ public class TestPackage extends TestObject { final JUnitConfiguration.Data data = getConfiguration().getPersistentData(); final Module module = getConfiguration().getConfigurationModule().getModule(); return new SearchForTestsTask(getConfiguration().getProject(), myServerSocket) { - private final Set myClasses = new LinkedHashSet<>(); + private final Set myClasses = new LinkedHashSet<>(); @Override protected void search() { @@ -91,17 +98,17 @@ public class TestPackage extends TestObject { }; } - protected boolean filterOutputByDirectoryForJunit5(final Set classNames) { + protected boolean filterOutputByDirectoryForJunit5(final Set classNames) { return getConfiguration().getTestSearchScope() == TestSearchScope.SINGLE_MODULE; } - protected String getFilters(Set foundClasses, String packageName) { + protected String getFilters(Set foundClasses, String packageName) { return foundClasses.isEmpty() ? packageName.isEmpty() ? ".*" : packageName + "\\..*" : ""; } - protected void searchTests5(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { } + protected void searchTests5(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { } - protected void searchTests(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { + protected void searchTests(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { if (Registry.is("junit4.search.4.tests.all.in.scope", true)) { Condition acceptClassCondition = aClass -> ReadAction.compute(() -> aClass.isValid() && classFilter.isAccepted(aClass)); collectClassesRecursively(classFilter, acceptClassCondition, classes); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java index c61911a92597..ba9c9a853d12 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java @@ -42,28 +42,40 @@ public class TestsPattern extends TestPackage { } @Override - protected boolean filterOutputByDirectoryForJunit5(Set classNames) { + protected boolean filterOutputByDirectoryForJunit5(Set classNames) { return super.filterOutputByDirectoryForJunit5(classNames) && classNames.isEmpty(); } @Override - protected void searchTests5(Module module, TestClassFilter classFilter, Set classes) { + protected void searchTests5(Module module, TestClassFilter classFilter, Set classes) { searchTests(module, classFilter, classes, true); } @Override - protected void searchTests(Module module, TestClassFilter classFilter, Set classes) { + protected void searchTests(Module module, TestClassFilter classFilter, Set classes) { searchTests(module, classFilter, classes, false); } - private void searchTests(Module module, TestClassFilter classFilter, Set classes, boolean junit5) { + private void searchTests(Module module, TestClassFilter classFilter, Set classes, boolean junit5) { JUnitConfiguration.Data data = getConfiguration().getPersistentData(); Project project = getConfiguration().getProject(); for (String className : data.getPatterns()) { final PsiClass psiClass = ReadAction.compute(() -> getTestClass(project, className)); if (psiClass != null) { if (ReadAction.compute(() -> JUnitUtil.isTestClass(psiClass))) { - classes.add(psiClass); //with method, comma separated + if (className.contains(",")) { + String methodName = StringUtil.getShortName(className, ','); + PsiMethod[] methods = psiClass.findMethodsByName(methodName, true); + if (methods.length > 0) { + classes.add(methods[0]); + } + else { + classes.add(psiClass); + } + } + else { + classes.add(psiClass); + } } } else { @@ -77,7 +89,7 @@ public class TestsPattern extends TestPackage { } @Override - protected String getFilters(Set foundClasses, String packageName) { + protected String getFilters(Set foundClasses, String packageName) { return foundClasses.isEmpty() ? getConfiguration().getPersistentData().getPatternPresentation() : ""; }