[java] Fix run line marker for JUnit tests with Gradle config

#IDEA-353722 Fixed

GitOrigin-RevId: b85f9a3ec7a15e4f72c5a0ae8ddce371e32b22f0
This commit is contained in:
Bart van Helvert
2024-05-20 20:43:21 +02:00
committed by intellij-monorepo-bot
parent f39d73fa4d
commit 0be55e2dc4
2 changed files with 90 additions and 20 deletions

View File

@@ -21,9 +21,12 @@ import com.intellij.psi.PsiMethod;
import com.intellij.psi.util.ClassUtil;
import com.intellij.psi.util.PsiMethodUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author Dmitry Avdeev
*/
@@ -40,7 +43,11 @@ public class TestRunLineMarkerProvider extends RunLineMarkerContributor implemen
if (!isTestClass(psiClass)) return null;
String url = "java:suite://" + ClassUtil.getJVMClassName(psiClass);
TestStateStorage.Record state = TestStateStorage.getInstance(e.getProject()).getState(url);
if (isIgnoredForGradleConfiguration(psiClass, null)) return null;
if (isGradleConfiguration(psiClass)) {
List<PsiMethod> testMethods =
ContainerUtil.filter(psiClass.getAllMethods(), method -> TestFrameworks.getInstance().isTestMethod(method));
if (ContainerUtil.all(testMethods, method -> isIgnoredForGradleConfiguration(psiClass, method))) return null;
}
return getInfo(state, true, PsiMethodUtil.findMainInClass(psiClass) != null ? 1 : 0);
}
if (element instanceof PsiMethod psiMethod) {
@@ -55,22 +62,29 @@ public class TestRunLineMarkerProvider extends RunLineMarkerContributor implemen
return null;
}
private static boolean isIgnoredForGradleConfiguration(@Nullable PsiClass psiClass, @Nullable PsiMethod psiMethod) {
if (psiClass == null) return false;
RunnerAndConfigurationSettings currentConfiguration = RunManager.getInstance(psiClass.getProject()).getSelectedConfiguration();
if (currentConfiguration == null) return false;
ConfigurationType configurationType = currentConfiguration.getType();
if (!configurationType.getId().equals("GradleRunConfiguration")) return false;
/**
* Gradle can't run ignored methods while IDEA runner can, so when using a Gradle configuration, we don't want to show the line marker for
* ignored methods.
*/
private static boolean isIgnoredForGradleConfiguration(@NotNull PsiClass psiClass, @NotNull PsiMethod psiMethod) {
if (!isGradleConfiguration(psiClass)) return false;
//now gradle doesn't support dumb mode
if (DumbService.getInstance(psiClass.getProject()).isDumb()) return true;
for (TestFramework testFramework : TestFramework.EXTENSION_NAME.getExtensionList()) {
if (testFramework.isTestClass(psiClass) && (psiMethod == null || testFramework.isIgnoredMethod(psiMethod))) {
if (testFramework.isTestClass(psiClass) && testFramework.isIgnoredMethod(psiMethod)) {
return true;
}
}
return false;
}
private static boolean isGradleConfiguration(@NotNull PsiClass psiClass) {
RunnerAndConfigurationSettings currentConfiguration = RunManager.getInstance(psiClass.getProject()).getSelectedConfiguration();
if (currentConfiguration == null) return false;
ConfigurationType configurationType = currentConfiguration.getType();
return configurationType.getId().equals("GradleRunConfiguration");
}
private static boolean isTestClass(PsiClass clazz) {
if (clazz == null) return false;
try {

View File

@@ -104,14 +104,78 @@ public class TestRunLineMarkerTest extends LineMarkerTestCase {
}
public void testDisabledTestMethodWithGradleConfiguration() {
doTestWithDisabledAnnotation(new MockGradleRunConfiguration(myFixture.getProject(), "DisabledMethodTest"), 0);
doTestWithDisabledAnnotation(new MockGradleRunConfiguration(myFixture.getProject(), "DisabledMethodTest"), 0, """
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class DisabledMethodTest {
@Disabled
@Test
public void testDisabled<caret>() {}
}
""");
}
public void testDisabledTestMethodWithJunitConfiguration() {
doTestWithDisabledAnnotation(new JUnitConfiguration("DisabledMethodTest", myFixture.getProject()), 1);
doTestWithDisabledAnnotation(new JUnitConfiguration("DisabledMethodTest", myFixture.getProject()), 1, """
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class DisabledMethodTest {
@Disabled
@Test
public void testDisabled<caret>() {}
}
""");
}
private void doTestWithDisabledAnnotation(RunConfiguration configuration, int marksCount) {
public void testDisabledTestClassWithGradleConfiguration() {
doTestWithDisabledAnnotation(new MockGradleRunConfiguration(myFixture.getProject(), "DisabledMethodTest"), 0, """
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class Disabled<caret>MethodTest {
@Disabled
@Test
public void testDisabled() {}
@Disabled
@Test
public void testAlsoDisabled() {}
}
""");
}
public void testDisabledTestClassWithNonDisabledTestGradleConfiguration() {
doTestWithDisabledAnnotation(new MockGradleRunConfiguration(myFixture.getProject(), "DisabledMethodTest"), 1, """
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class Disabled<caret>MethodTest {
@Disabled
@Test
public void testDisabled() {}
@Test
public void testNotDisabled() {}
}
""");
}
public void testDisabledTestClassWithJunitConfiguration() {
doTestWithDisabledAnnotation(new JUnitConfiguration("DisabledMethodTest", myFixture.getProject()), 1, """
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class Disabled<caret>MethodTest {
@Disabled
@Test
public void testDisabled() {}
}
""");
}
private void doTestWithDisabledAnnotation(RunConfiguration configuration, int marksCount, String testClass) {
JUnit5TestFrameworkSetupUtil.setupJUnit5Library(myFixture);
myFixture.addClass("package org.junit.jupiter.api; public @interface Disabled {}");
@@ -122,15 +186,7 @@ public class TestRunLineMarkerTest extends LineMarkerTestCase {
myTempSettings.add(runnerAndConfigurationSettings);
manager.setSelectedConfiguration(runnerAndConfigurationSettings);
myFixture.configureByText("DisabledMethodTest.java", """
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
class DisabledMethodTest {
@Disabled
@Test
public void testDisabled<caret>() {}
}
""");
myFixture.configureByText("DisabledMethodTest.java", testClass);
List<GutterMark> marks = myFixture.findGuttersAtCaret();
assertEquals(marksCount, marks.size());
}