detect tests: restore inner classes under option (IDEA-162259) webstorm/181.3022
authorAnna Kozlova <anna.kozlova@jetbrains.com>
Tue, 23 Jan 2018 10:09:38 +0000 (13:09 +0300)
committerAnna Kozlova <anna.kozlova@jetbrains.com>
Tue, 23 Jan 2018 10:16:12 +0000 (13:16 +0300)
java/java-tests/testData/junit/configurations/module1/test1/nested/TestA.java [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java
platform/util/resources/misc/registry.properties
plugins/junit/src/com/intellij/execution/junit/TestPackage.java

diff --git a/java/java-tests/testData/junit/configurations/module1/test1/nested/TestA.java b/java/java-tests/testData/junit/configurations/module1/test1/nested/TestA.java
new file mode 100644 (file)
index 0000000..3021ed1
--- /dev/null
@@ -0,0 +1,6 @@
+package test1.nested;
+
+import junit.framework.TestCase;
+
+public class TestA extends TestCase {
+}
\ No newline at end of file
index f1bd4a7a0db782169106aa05c9606f12fe672df9..3b5464eb3be7b72cd1d57bda1139c62b310ab6e0 100644 (file)
@@ -174,8 +174,9 @@ public class ConfigurationsTest extends BaseConfigurationTestCase {
     Assertion.compareUnordered(
       //category, filters, classNames...
       new Object[]{"", "", psiClass.getQualifiedName(),
-        psiClass.getQualifiedName(),
-        derivedTest.getQualifiedName(), //RT_INNER_TEST_NAME,
+        psiClass2.getQualifiedName(),
+        derivedTest.getQualifiedName(), RT_INNER_TEST_NAME,
+        "test1.nested.TestA",
         testB.getQualifiedName()},
       lines);
   }
index 5734a3ea4775194e7d08fd956d35a42dfc6b9df6..209a660d46a486d84a51f61546cca7c68fe4a6ab 100644 (file)
@@ -1433,4 +1433,7 @@ vue.extract.component.intention.description=Allows "Vue Extract Component" inten
 
 folding.signature.validation=false
 folding.signature.validation.description=Validate that signature for a PSI element, for which a folding region is generated, can be used to\
- find exactly the same PSI element
\ No newline at end of file
+ find exactly the same PSI element
+
+junit4.accept.inner.classes=true
+junit4.accept.inner.classes.description=If false, inner classes won't be included in search for tests in package
\ No newline at end of file
index ae0267d5b40577658150688a5bd398f2ef2c8553..ae8cb7878552b989de3e61c6609e9387c64a2cb3 100644 (file)
@@ -37,6 +37,7 @@ import com.intellij.psi.search.PackageScope;
 import com.intellij.psi.util.ClassUtil;
 import com.intellij.refactoring.listeners.RefactoringElementListener;
 import com.intellij.rt.execution.junit.JUnitStarter;
+import com.intellij.util.containers.JBTreeTraverser;
 import gnu.trove.THashSet;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.TestOnly;
@@ -47,7 +48,9 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.nio.file.Path;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.function.Predicate;
 
 public class TestPackage extends TestObject {
@@ -84,14 +87,21 @@ public class TestPackage extends TestObject {
             if (Registry.is("junit4.search.4.tests.all.in.scope", true)) {
               String packageName = getPackageName(data);
               PsiPackage aPackage = JavaPsiFacade.getInstance(myProject).findPackage(packageName);
-              PsiClass[] classes = aPackage == null
-                                   ? PsiClass.EMPTY_ARRAY
-                                   : ReadAction.compute(() ->
-                                                          aPackage.getClasses(GlobalSearchScope.projectScope(myProject)
-                                                                                               .intersectWith(classFilter.getScope())));
-              Arrays.stream(classes)
-                    .filter(aClass -> ReadAction.compute(() -> classFilter.isAccepted(aClass)))
-                    .forEach(myClasses::add);
+              List<PsiClass> classes = new ArrayList<>();
+              if (aPackage != null) {
+                ReadAction.run(() ->
+                               {
+                                 PsiDirectory[] directories =
+                                   aPackage.getDirectories(GlobalSearchScope.projectScope(myProject).intersectWith(classFilter.getScope()));
+                                 for (PsiDirectory directory : directories) {
+                                   collectClassesRecursively(directory, classes);
+                                 }
+                               });
+              }
+              classes
+                .stream()
+                .filter(aClass -> ReadAction.compute(() -> classFilter.isAccepted(aClass)))
+                .forEach(myClasses::add);
             }
             else if (Registry.is("junit4.search.4.tests.in.classpath", false)) {
               String packageName = getPackageName(data);
@@ -115,6 +125,23 @@ public class TestPackage extends TestObject {
         }
       }
 
+      private void collectClassesRecursively(PsiElement root, List<PsiClass> classes) {
+        PsiElement[] children = root.getChildren();
+        for (PsiElement child : children) {
+          if (child instanceof PsiClassOwner) {
+            for (PsiClass aClass : ((PsiClassOwner)child).getClasses()) {
+              classes.add(aClass);
+              if (Registry.is("junit4.accept.inner.classes", true)) {
+                classes.addAll(JBTreeTraverser.of(PsiClass::getInnerClasses).withRoot(aClass).toList());
+              }
+            }
+          }
+          else {
+            collectClassesRecursively(child, classes);
+          }
+        }
+      }
+
       @Override
       protected void onFound() {