junit: fix pattern configurations by method in abstract class (IDEA-215065)

GitOrigin-RevId: 3730b67a4f0c697f59cd7c1008ae1e4565203e73
This commit is contained in:
Anna Kozlova
2019-05-28 22:04:41 +03:00
committed by intellij-monorepo-bot
parent fd13ad4b81
commit 7c023430fd
8 changed files with 75 additions and 39 deletions
@@ -0,0 +1,7 @@
package abstractPattern;
import junit.framework.TestCase;
class TestA extends TestCase {
public void test1() {}
public void test2() {}
}
@@ -0,0 +1,2 @@
package abstractPattern;
public class TestB extends TestA {}
@@ -0,0 +1,2 @@
package abstractPattern;
public class TestC extends TestA {}
@@ -216,7 +216,7 @@ public class ConfigurationsTest extends BaseConfigurationTestCase {
lines.remove(0);
Assertion.compareUnordered(
//category, filters, classNames...
new Object[]{"", "", "", psiClass.getQualifiedName(),
new Object[]{"", "", "pattern.TestA", "abstractPattern.TestB", "abstractPattern.TestC", psiClass.getQualifiedName(),
"test1.DerivedTest", RT_INNER_TEST_NAME,
"test1.nested.TestA",
"test1.nested.TestWithJunit4",
@@ -243,6 +243,24 @@ public class ConfigurationsTest extends BaseConfigurationTestCase {
lines);
}
public void testSameMethodPattern() throws IOException, ExecutionException {
Module module1 = getModule1();
JUnitConfiguration configuration = new JUnitConfiguration("", myProject);
configuration.getPersistentData().TEST_OBJECT = JUnitConfiguration.TEST_PATTERN;
configuration.getPersistentData().setPatterns(ContainerUtil.newLinkedHashSet("abstractPattern.TestB,test1", "abstractPattern.TestC,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<String> lines = FileUtilRt.loadLines(new File(filePath));
lines.remove(0);
Assertion.compareUnordered(
//category, filters, classNames...
new Object[]{"", "", "abstractPattern.TestB,test1", "abstractPattern.TestC,test1"},
lines);
}
public void testRunAllInPackageWhenPackageIsEmptyInModule() throws ExecutionException {
assignJdk(getModule2());
JUnitConfiguration configuration = new JUnitConfiguration("", myProject);
@@ -3,6 +3,7 @@ package com.intellij.execution.junit;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.Location;
import com.intellij.execution.configurations.RuntimeConfigurationError;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.execution.runners.ExecutionEnvironment;
@@ -95,7 +96,7 @@ class TestDirectory extends TestPackage {
}
@Override
protected void searchTests5(Module module, TestClassFilter classFilter, Set<PsiMember> classes) throws CantRunException {
protected void searchTests5(Module module, TestClassFilter classFilter, Set<Location<?>> classes) throws CantRunException {
if (module != null) {
PsiDirectory directory = getDirectory(getConfiguration().getPersistentData());
PsiPackage aPackage = JavaRuntimeConfigurationProducerBase.checkPackage(directory);
@@ -110,12 +111,12 @@ class TestDirectory extends TestPackage {
}
@Override
protected boolean filterOutputByDirectoryForJunit5(Set<PsiMember> classNames) {
protected boolean filterOutputByDirectoryForJunit5(Set<Location<?>> classNames) {
return true;
}
@Override
protected String getFilters(Set<PsiMember> foundClasses, String packageName) {
protected String getFilters(Set<Location<?>> foundClasses, String packageName) {
return foundClasses.isEmpty()
? super.getFilters(foundClasses, packageName)
: StringUtil.join(foundClasses, CLASS_NAME_FUNCTION, "||");
@@ -124,14 +125,14 @@ class TestDirectory extends TestPackage {
@Override
protected void collectClassesRecursively(TestClassFilter classFilter,
Condition<? super PsiClass> acceptClassCondition,
Set<? super PsiClass> classes) throws CantRunException {
Set<Location<?>> classes) throws CantRunException {
collectClassesRecursively(getDirectory(getConfiguration().getPersistentData()), acceptClassCondition, classes);
}
private static void collectClassesRecursively(PsiDirectory directory,
Condition<? super PsiClass> acceptAsTest,
Set<? super PsiClass> classes) {
Set<Location<?>> classes) {
PsiDirectory[] subDirectories = ReadAction.compute(() -> directory.getSubdirectories());
for (PsiDirectory subDirectory : subDirectories) {
collectClassesRecursively(subDirectory, acceptAsTest, classes);
@@ -445,6 +445,9 @@ public abstract class TestObject extends JavaTestFrameworkRunnableState<JUnitCon
: GlobalSearchScope.projectScope(project));
}
if (element instanceof Location) {
return ((Location)element).getPsiElement();
}
return element instanceof PsiElement ? (PsiElement)element : null;
}
@@ -1,13 +1,11 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.execution.junit;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ConfigurationUtil;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.*;
import com.intellij.execution.configurations.JavaParameters;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.execution.configurations.RuntimeConfigurationWarning;
import com.intellij.execution.junit2.info.MethodLocation;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.testframework.SearchForTestsTask;
import com.intellij.execution.testframework.SourceScope;
@@ -35,13 +33,14 @@ import java.util.LinkedHashSet;
import java.util.Set;
public class TestPackage extends TestObject {
protected static final Function<PsiMember, String> CLASS_NAME_FUNCTION = member -> {
if (member instanceof PsiMethod) {
PsiClass containingClass = member.getContainingClass();
protected static final Function<Location<?>, String> CLASS_NAME_FUNCTION = location -> {
if (location instanceof MethodLocation) {
PsiClass containingClass = ((MethodLocation)location).getContainingClass();
if (containingClass == null) return null;
return ClassUtil.getJVMClassName(containingClass) + "," + member.getName();
return ClassUtil.getJVMClassName(containingClass) + "," + ((MethodLocation)location).getPsiElement().getName();
}
return member instanceof PsiClass ? ClassUtil.getJVMClassName((PsiClass)member) : null;
PsiElement psiElement = location.getPsiElement();
return psiElement instanceof PsiClass ? ClassUtil.getJVMClassName((PsiClass)psiElement) : null;
};
public TestPackage(JUnitConfiguration configuration, ExecutionEnvironment environment) {
@@ -60,7 +59,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<PsiMember> myClasses = new LinkedHashSet<>();
private final Set<Location<?>> myClasses = new LinkedHashSet<>();
@Override
protected void search() {
@@ -98,23 +97,25 @@ public class TestPackage extends TestObject {
};
}
protected boolean filterOutputByDirectoryForJunit5(final Set<PsiMember> classNames) {
protected boolean filterOutputByDirectoryForJunit5(final Set<Location<?>> classNames) {
return getConfiguration().getTestSearchScope() == TestSearchScope.SINGLE_MODULE;
}
protected String getFilters(Set<PsiMember> foundClasses, String packageName) {
protected String getFilters(Set<Location<?>> foundClasses, String packageName) {
return foundClasses.isEmpty() ? packageName.isEmpty() ? ".*" : packageName + "\\..*" : "";
}
protected void searchTests5(Module module, TestClassFilter classFilter, Set<PsiMember> classes) throws CantRunException { }
protected void searchTests5(Module module, TestClassFilter classFilter, Set<Location<?>> classes) throws CantRunException { }
protected void searchTests(Module module, TestClassFilter classFilter, Set<PsiMember> classes) throws CantRunException {
protected void searchTests(Module module, TestClassFilter classFilter, Set<Location<?>> classes) throws CantRunException {
if (Registry.is("junit4.search.4.tests.all.in.scope", true)) {
Condition<PsiClass> acceptClassCondition = aClass -> ReadAction.compute(() -> aClass.isValid() && classFilter.isAccepted(aClass));
collectClassesRecursively(classFilter, acceptClassCondition, classes);
}
else {
ConfigurationUtil.findAllTestClasses(classFilter, module, classes);
LinkedHashSet<PsiClass> psiClasses = new LinkedHashSet<>();
ConfigurationUtil.findAllTestClasses(classFilter, module, psiClasses);
psiClasses.stream().map(PsiLocation::fromPsiElement).forEach(classes::add);
}
}
@@ -130,7 +131,7 @@ public class TestPackage extends TestObject {
protected void collectClassesRecursively(TestClassFilter classFilter,
Condition<? super PsiClass> acceptClassCondition,
Set<? super PsiClass> classes) throws CantRunException {
Set<Location<?>> classes) throws CantRunException {
PsiPackage aPackage = getPackage(getConfiguration().getPersistentData());
if (aPackage != null) {
GlobalSearchScope scope = GlobalSearchScope.projectScope(getConfiguration().getProject()).intersectWith(classFilter.getScope());
@@ -141,7 +142,7 @@ public class TestPackage extends TestObject {
private static void collectClassesRecursively(PsiPackage aPackage,
GlobalSearchScope scope,
Condition<? super PsiClass> acceptAsTest,
Set<? super PsiClass> classes) {
Set<Location<?>> classes) {
PsiPackage[] psiPackages = ReadAction.compute(() -> aPackage.getSubPackages(scope));
for (PsiPackage psiPackage : psiPackages) {
collectClassesRecursively(psiPackage, scope, acceptAsTest, classes);
@@ -152,12 +153,14 @@ public class TestPackage extends TestObject {
}
}
protected static void collectInnerClasses(PsiClass aClass, Condition<? super PsiClass> acceptAsTest, Set<? super PsiClass> classes) {
protected static void collectInnerClasses(PsiClass aClass, Condition<? super PsiClass> acceptAsTest, Set<Location<?>> classes) {
if (Registry.is("junit4.accept.inner.classes", true)) {
classes.addAll(ReadAction.compute(() -> JBTreeTraverser.of(PsiClass::getInnerClasses).withRoot(aClass).filter(acceptAsTest).toList()));
classes.addAll(ReadAction.compute(() -> JBTreeTraverser.of(PsiClass::getInnerClasses)
.withRoot(aClass).filter(acceptAsTest).map(psiClass -> PsiLocation.fromPsiElement(psiClass))
.toList()));
}
else if (acceptAsTest.value(aClass)) {
classes.add(aClass);
classes.add(PsiLocation.fromPsiElement(aClass));
}
}
@@ -1,12 +1,10 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.execution.junit;
import com.intellij.execution.CantRunException;
import com.intellij.execution.ConfigurationUtil;
import com.intellij.execution.ExecutionBundle;
import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.*;
import com.intellij.execution.configurations.RuntimeConfigurationException;
import com.intellij.execution.configurations.RuntimeConfigurationWarning;
import com.intellij.execution.junit2.info.MethodLocation;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.testframework.SourceScope;
import com.intellij.execution.util.JavaParametersUtil;
@@ -42,21 +40,21 @@ public class TestsPattern extends TestPackage {
}
@Override
protected boolean filterOutputByDirectoryForJunit5(Set<PsiMember> classNames) {
protected boolean filterOutputByDirectoryForJunit5(Set<Location<?>> classNames) {
return super.filterOutputByDirectoryForJunit5(classNames) && classNames.isEmpty();
}
@Override
protected void searchTests5(Module module, TestClassFilter classFilter, Set<PsiMember> classes) {
protected void searchTests5(Module module, TestClassFilter classFilter, Set<Location<?>> classes) {
searchTests(module, classFilter, classes, true);
}
@Override
protected void searchTests(Module module, TestClassFilter classFilter, Set<PsiMember> classes) {
protected void searchTests(Module module, TestClassFilter classFilter, Set<Location<?>> classes) {
searchTests(module, classFilter, classes, false);
}
private void searchTests(Module module, TestClassFilter classFilter, Set<PsiMember> classes, boolean junit5) {
private void searchTests(Module module, TestClassFilter classFilter, Set<Location<?>> classes, boolean junit5) {
JUnitConfiguration.Data data = getConfiguration().getPersistentData();
Project project = getConfiguration().getProject();
for (String className : data.getPatterns()) {
@@ -67,21 +65,23 @@ public class TestsPattern extends TestPackage {
String methodName = StringUtil.getShortName(className, ',');
PsiMethod[] methods = psiClass.findMethodsByName(methodName, true);
if (methods.length > 0) {
classes.add(methods[0]);
classes.add(MethodLocation.elementInClass(methods[0], psiClass));
}
else {
classes.add(psiClass);
classes.add(PsiLocation.fromPsiElement(psiClass));
}
}
else {
classes.add(psiClass);
classes.add(PsiLocation.fromPsiElement(psiClass));
}
}
}
else {
classes.clear();
if (!junit5) {//junit 5 process tests automatically
ConfigurationUtil.findAllTestClasses(classFilter, module, classes);
LinkedHashSet<PsiClass> psiClasses = new LinkedHashSet<>();
ConfigurationUtil.findAllTestClasses(classFilter, module, psiClasses);
psiClasses.stream().map(PsiLocation::fromPsiElement).forEach(classes::add);
}
return;
}
@@ -89,7 +89,7 @@ public class TestsPattern extends TestPackage {
}
@Override
protected String getFilters(Set<PsiMember> foundClasses, String packageName) {
protected String getFilters(Set<Location<?>> foundClasses, String packageName) {
return foundClasses.isEmpty() ? getConfiguration().getPersistentData().getPatternPresentation() : "";
}