diff --git a/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTestInspection.kt b/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTestInspection.kt
index ccd7cebbccce..1794984b4b7e 100644
--- a/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTestInspection.kt
+++ b/plugins/junit/src/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTestInspection.kt
@@ -22,12 +22,10 @@ import com.intellij.execution.junit.JUnitUtil
import com.intellij.openapi.projectRoots.JavaSdkVersion
import com.intellij.openapi.projectRoots.JavaVersionService
import com.intellij.openapi.util.text.StringUtil
-import com.intellij.psi.JavaElementVisitor
-import com.intellij.psi.JavaPsiFacade
-import com.intellij.psi.PsiElementVisitor
-import com.intellij.psi.PsiMethod
+import com.intellij.psi.*
import com.siyeh.InspectionGadgetsBundle
import com.siyeh.ig.junit.JUnitCommonClassNames
+import com.siyeh.ig.psiutils.ExpressionUtils
import org.jetbrains.annotations.Nls
class JUnit5MalformedRepeatedTestInspection : BaseJavaBatchLocalInspectionTool() {
@@ -55,6 +53,13 @@ class JUnit5MalformedRepeatedTestInspection : BaseJavaBatchLocalInspectionTool()
holder.registerProblem(testAnno, "Suspicious combination @Test and @RepeatedTest",
DeleteElementFix(testAnno))
}
+ val repeatedNumber = repeatedAnno.findDeclaredAttributeValue("value")
+ if (repeatedNumber is PsiExpression) {
+ val constant = ExpressionUtils.computeConstantExpression(repeatedNumber)
+ if (constant is Int && constant <= 0) {
+ holder.registerProblem(repeatedNumber, "The number of repetitions must be greater than zero")
+ }
+ }
}
else {
val repetitionInfo = JavaPsiFacade.getInstance(holder.project).findClass(JUnitCommonClassNames.ORG_JUNIT_JUPITER_API_REPETITION_INFO, file.resolveScope)
diff --git a/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTest.java b/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTest.java
index 5476606a0de2..a7b321ab1d01 100644
--- a/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTest.java
+++ b/plugins/junit/test/com/intellij/execution/junit/codeInsight/JUnit5MalformedRepeatedTest.java
@@ -32,7 +32,7 @@ public class JUnit5MalformedRepeatedTest extends LightInspectionTestCase {
protected void setUp() throws Exception {
super.setUp();
addEnvironmentClass("package org.junit.jupiter.api;\n" +
- "public @interface RepeatedTest {}");
+ "public @interface RepeatedTest {int value(); }");
addEnvironmentClass("package org.junit.jupiter.api;\n" +
"public @interface Test {}");
addEnvironmentClass("package org.junit.jupiter.api;\n" +
@@ -44,6 +44,7 @@ public class JUnit5MalformedRepeatedTest extends LightInspectionTestCase {
}
public void testMalformed() { doTest(); }
+ public void testPositiveRepetitions() { doTest(); }
@Override
protected String getBasePath() {
diff --git a/plugins/junit/testData/codeInsight/malformedRepeated/Malformed.java b/plugins/junit/testData/codeInsight/malformedRepeated/Malformed.java
index c55342adce46..7a75fe770d4f 100644
--- a/plugins/junit/testData/codeInsight/malformedRepeated/Malformed.java
+++ b/plugins/junit/testData/codeInsight/malformedRepeated/Malformed.java
@@ -12,10 +12,10 @@ class WithRepeatedInfoAndTest {
}
class WithRepeated {
- @RepeatedTest()
+ @RepeatedTest(1)
void repeatedTestNoParams() { }
- @RepeatedTest()
+ @RepeatedTest(1)
void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) { }
@BeforeAll
@@ -27,6 +27,6 @@ class WithRepeated {
class WithRepeatedAndTests {
@Test
- @RepeatedTest()
+ @RepeatedTest(1)
void repeatedTestAndTest() { }
}
diff --git a/plugins/junit/testData/codeInsight/malformedRepeated/PositiveRepetitions.java b/plugins/junit/testData/codeInsight/malformedRepeated/PositiveRepetitions.java
new file mode 100644
index 000000000000..478cf08a5ee5
--- /dev/null
+++ b/plugins/junit/testData/codeInsight/malformedRepeated/PositiveRepetitions.java
@@ -0,0 +1,6 @@
+import org.junit.jupiter.api.*;
+
+class WithRepeated {
+ @RepeatedTest(-1)
+ void repeatedTestNoParams() { }
+}