From f7da2f2e73d78c8c54d9fc859c07d299a14a51b4 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 22 Mar 2018 14:19:31 +0100 Subject: [PATCH] junit: search for tests by pattern from top to bottom assuming traversal of default package is slow or both ways are fast --- .../intellij/execution/junit/TestPackage.java | 44 +++++++++++-------- .../execution/junit/TestsPattern.java | 8 +++- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index 6883b06e0ae4..ba4b74e123e1 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -83,25 +83,7 @@ public class TestPackage extends TestObject { instance.setAlternativeResolveEnabled(true); final TestClassFilter classFilter = getClassFilter(data); LOG.assertTrue(classFilter.getBase() != null); - long start = System.currentTimeMillis(); - if (Registry.is("junit4.search.4.tests.all.in.scope", true)) { - Condition acceptClassCondition = aClass -> ReadAction.compute(() -> aClass.isValid() && classFilter.isAccepted(aClass)); - collectClassesRecursively(classFilter, acceptClassCondition, myClasses); - } - else if (Registry.is("junit4.search.4.tests.in.classpath", false)) { - String packageName = getPackageName(data); - String[] classNames = TestClassCollector.collectClassFQNames(packageName, getRootPath(), getConfiguration(), TestPackage::createPredicate); - PsiManager manager = PsiManager.getInstance(myProject); - Arrays.stream(classNames) - .filter(className -> acceptClassName(className)) //check patterns - .map(name -> ReadAction.compute(() -> ClassUtil.findPsiClass(manager, name, null, true, classFilter.getScope()))) - .filter(aClass -> aClass != null) - .forEach(myClasses::add); - LOG.info("Found tests in " + (System.currentTimeMillis() - start)); - } - else { - ConfigurationUtil.findAllTestClasses(classFilter, module, myClasses); - } + searchTests(module, classFilter, myClasses); } catch (CantRunException ignored) {} finally { @@ -122,6 +104,30 @@ public class TestPackage extends TestObject { }; } + + protected void searchTests(Module module, TestClassFilter classFilter, Set classes) throws CantRunException { + long start = System.currentTimeMillis(); + 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); + } + else if (Registry.is("junit4.search.4.tests.in.classpath", false)) { + String packageName = getPackageName(getConfiguration().getPersistentData()); + String[] classNames = + TestClassCollector.collectClassFQNames(packageName, getRootPath(), getConfiguration(), TestPackage::createPredicate); + PsiManager manager = PsiManager.getInstance(getConfiguration().getProject()); + Arrays.stream(classNames) + .filter(className -> acceptClassName(className)) //check patterns + .map(name -> ReadAction.compute(() -> ClassUtil.findPsiClass(manager, name, null, true, classFilter.getScope()))) + .filter(aClass -> aClass != null) + .forEach(classes::add); + LOG.info("Found tests in " + (System.currentTimeMillis() - start)); + } + else { + ConfigurationUtil.findAllTestClasses(classFilter, module, classes); + } + } + @Nullable protected Path getRootPath() { Module module = getConfiguration().getConfigurationModule().getModule(); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java index 30538ad58d6b..a241f8864038 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java @@ -17,6 +17,7 @@ package com.intellij.execution.junit; import com.intellij.execution.CantRunException; +import com.intellij.execution.ConfigurationUtil; import com.intellij.execution.ExecutionException; import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.configurations.RuntimeConfigurationException; @@ -74,7 +75,7 @@ public class TestsPattern extends TestPackage { if (!hasPattern) { return new SearchForTestsTask(project, myServerSocket) { @Override - protected void search() throws ExecutionException { } + protected void search() { } @Override protected void onFound() throws ExecutionException { @@ -87,6 +88,11 @@ public class TestsPattern extends TestPackage { return super.createSearchingForTestsTask(); } + @Override + protected void searchTests(Module module, TestClassFilter classFilter, Set classes) { + ConfigurationUtil.findAllTestClasses(classFilter, module, classes); + } + @Override protected boolean acceptClassName(String className) { String pattern = getConfiguration().getPersistentData().getPatternPresentation();