mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
junit: fix pattern configurations by method in abstract class (IDEA-215065)
GitOrigin-RevId: 3730b67a4f0c697f59cd7c1008ae1e4565203e73
This commit is contained in:
committed by
intellij-monorepo-bot
parent
fd13ad4b81
commit
7c023430fd
@@ -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() : "";
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user