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);
}
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
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;
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 {
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);
}
}
+ 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() {