junit 5: discover test by method name with parameter types

This commit is contained in:
Anna Kozlova
2016-09-16 13:25:12 +03:00
parent 02f44a0fb5
commit 8b82f7cc0e
6 changed files with 62 additions and 12 deletions
@@ -54,14 +54,14 @@ public abstract class AbstractAddToTestsPatternAction<T extends ModuleBasedConfi
if (patternConfigurations.size() == 1) {
final T configuration = patternConfigurations.get(0);
for (PsiElement aClass : classes) {
getPatterns(configuration).add(AbstractPatternBasedConfigurationProducer.getQName(aClass));
getPatterns(configuration).add(getPatternBasedProducer().getQName(aClass));
}
} else {
JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep<T>("Choose suite to add", patternConfigurations) {
@Override
public PopupStep onChosen(T configuration, boolean finalChoice) {
for (PsiElement aClass : classes) {
getPatterns(configuration).add(AbstractPatternBasedConfigurationProducer.getQName(aClass));
getPatterns(configuration).add(getPatternBasedProducer().getQName(aClass));
}
return FINAL_CHOICE;
}
@@ -110,7 +110,7 @@ public abstract class AbstractAddToTestsPatternAction<T extends ModuleBasedConfi
for (RunConfiguration configuration : configurations) {
if (isPatternBasedConfiguration((T)configuration)) {
if (foundClasses.size() > 1 ||
!getPatterns((T)configuration).contains(AbstractPatternBasedConfigurationProducer.getQName(foundClasses.iterator().next()))) {
!getPatterns((T)configuration).contains(getPatternBasedProducer().getQName(foundClasses.iterator().next()))) {
foundConfigurations.add((T)configuration);
}
}
@@ -66,7 +66,7 @@ public class JUnitUtil {
private static final Collection<String> TEST_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(TEST_ANNOTATION,
TEST5_ANNOTATION,
TEST5_FACTORY_ANNOTATION));
private static final Collection<String> TEST5_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(TEST5_ANNOTATION, TEST5_FACTORY_ANNOTATION));
public static final Collection<String> TEST5_ANNOTATIONS = Collections.unmodifiableList(Arrays.asList(TEST5_ANNOTATION, TEST5_FACTORY_ANNOTATION));
private static final List<String> INSTANCE_CONFIGS = Arrays.asList(BEFORE_ANNOTATION_NAME, AFTER_ANNOTATION_NAME);
private static final List<String> INSTANCE_5_CONFIGS = Arrays.asList(BEFORE_EACH_ANNOTATION_NAME, AFTER_EACH_ANNOTATION_NAME);
@@ -222,7 +222,7 @@ public abstract class AbstractPatternBasedConfigurationProducer<T extends Module
return classes.size() > 1;
}
private static PsiElement[] collectLocationElements(LinkedHashSet<String> classes, DataContext dataContext) {
private PsiElement[] collectLocationElements(LinkedHashSet<String> classes, DataContext dataContext) {
final Location<?>[] locations = Location.DATA_KEYS.getData(dataContext);
if (locations != null) {
List<PsiElement> elements = new ArrayList<>();
@@ -238,11 +238,11 @@ public abstract class AbstractPatternBasedConfigurationProducer<T extends Module
return null;
}
public static String getQName(PsiElement psiMember) {
public String getQName(PsiElement psiMember) {
return getQName(psiMember, null);
}
public static String getQName(PsiElement psiMember, Location location) {
public String getQName(PsiElement psiMember, Location location) {
if (psiMember instanceof PsiClass) {
return ClassUtil.getJVMClassName((PsiClass)psiMember);
}
@@ -252,11 +252,15 @@ public abstract class AbstractPatternBasedConfigurationProducer<T extends Module
: location instanceof PsiMemberParameterizedLocation ? ((PsiMemberParameterizedLocation)location).getContainingClass()
: ((PsiMember)psiMember).getContainingClass();
assert containingClass != null;
return ClassUtil.getJVMClassName(containingClass) + "," + ((PsiMember)psiMember).getName();
return ClassUtil.getJVMClassName(containingClass) + "," + getMethodPresentation((PsiMember)psiMember);
} else if (psiMember instanceof PsiPackage) {
return ((PsiPackage)psiMember).getQualifiedName();
}
assert false;
return null;
}
protected String getMethodPresentation(PsiMember psiMember) {
return psiMember.getName();
}
}
@@ -16,6 +16,7 @@
package com.intellij.execution.junit;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.diagnostic.logging.LogConfigurationPanel;
import com.intellij.execution.*;
import com.intellij.execution.actions.RunConfigurationProducer;
@@ -42,6 +43,8 @@ import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.refactoring.listeners.RefactoringElementListener;
import com.intellij.rt.execution.junit.RepeatCount;
import org.jdom.Element;
@@ -452,7 +455,7 @@ public class JUnitConfiguration extends JavaTestConfigurationBase {
final LinkedHashSet<String> patterns = new LinkedHashSet<>();
final String methodSufiix;
if (method != null) {
myData.METHOD_NAME = method.getName();
myData.METHOD_NAME = Data.getMethodPresentation(method);
methodSufiix = "," + myData.METHOD_NAME;
} else {
methodSufiix = "";
@@ -602,11 +605,19 @@ public class JUnitConfiguration extends JavaTestConfigurationBase {
public Module setTestMethod(final Location<PsiMethod> methodLocation) {
final PsiMethod method = methodLocation.getPsiElement();
METHOD_NAME = method.getName();
METHOD_NAME = getMethodPresentation(method);
TEST_OBJECT = TEST_METHOD;
return setMainClass(methodLocation instanceof MethodLocation ? ((MethodLocation)methodLocation).getContainingClass() : method.getContainingClass());
}
public static String getMethodPresentation(PsiMethod method) {
return method.getParameterList().getParametersCount() > 0 && AnnotationUtil.isAnnotated(method, JUnitUtil.TEST5_ANNOTATIONS)
? PsiFormatUtil.formatMethod(method, PsiSubstitutor.EMPTY,
PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_FQ_CLASS_NAMES)
: method.getName();
}
public String getGeneratedName(final JavaRunConfigurationModule configurationModule) {
if (TEST_PACKAGE.equals(TEST_OBJECT) || TEST_DIRECTORY.equals(TEST_OBJECT)) {
final String moduleName = TEST_SEARCH_SCOPE.getScope() == TestSearchScope.WHOLE_PROJECT ? "" : configurationModule.getModuleName();
@@ -625,8 +636,8 @@ public class JUnitConfiguration extends JavaTestConfigurationBase {
if (TEST_PATTERN.equals(TEST_OBJECT)) {
final int size = myPattern.size();
if (size == 0) return "Temp suite";
final String fqName = myPattern.iterator().next();
return (fqName.contains("*") ? fqName : StringUtil.getShortName(fqName)) + (size > 1 ? " and " + (size - 1) + " more" : "");
String fqName = myPattern.iterator().next();
return (fqName.contains("*") ? fqName : StringUtil.getShortName(StringUtil.getPackageName(fqName, ','))) + (size > 1 ? " and " + (size - 1) + " more" : "");
}
if (TEST_CATEGORY.equals(TEST_OBJECT)) {
return "@Category(" + (StringUtil.isEmpty(CATEGORY_NAME) ? "Invalid" : CATEGORY_NAME) + ")";
@@ -25,6 +25,8 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMember;
import com.intellij.psi.PsiMethod;
import java.util.LinkedHashSet;
import java.util.Set;
@@ -44,6 +46,12 @@ public class PatternConfigurationProducer extends AbstractPatternBasedConfigurat
return JUnitUtil.getTestMethod(psiElement, checkAbstract) != null;
}
@Override
protected String getMethodPresentation(PsiMember psiMember) {
return psiMember instanceof PsiMethod ? JUnitConfiguration.Data.getMethodPresentation((PsiMethod)psiMember)
: super.getMethodPresentation(psiMember);
}
@Override
public boolean isPreferredConfiguration(ConfigurationFromContext self, ConfigurationFromContext other) {
return !other.isProducedBy(TestMethodConfigurationProducer.class);
@@ -17,6 +17,7 @@ package com.intellij.junit5;
import com.intellij.codeInsight.TestFrameworks;
import com.intellij.execution.junit.JUnit5Framework;
import com.intellij.execution.junit.JUnitConfiguration;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMethod;
@@ -25,10 +26,17 @@ import com.intellij.testFramework.TestRunnerUtil;
import com.intellij.testFramework.fixtures.*;
import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl;
import com.intellij.testIntegration.TestFramework;
import one.util.streamex.StreamEx;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -80,4 +88,23 @@ class JUnit5AcceptanceTest {
assertTrue(framework instanceof JUnit5Framework, framework.getName());
});
}
@Test
void methodPresentations() {
TestRunnerUtil.replaceIdeEventQueueSafely();
EdtTestUtil.runInEdtAndWait(() -> {
PsiClass aClass = myFixture.addClass("class MyTest {" +
" @org.junit.jupiter.api.Test void method() {}" +
" @org.junit.jupiter.api.Test void method(a.TestInfo info) {}" +
" @org.junit.Test void method1() {}" +
" @org.junit.Test void method1(a.TestInfo info) {}" +
"}");
assertNotNull(aClass);
Stream<String> expectedData = Arrays.stream(new String[]{"method", "method(a.TestInfo)", "method1", "method1"});
StreamEx.of(aClass.getMethods())
.zipWith(expectedData)
.forEach(e -> assertEquals(e.getValue(), JUnitConfiguration.Data.getMethodPresentation(e.getKey())));
});
}
}