diff --git a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties index 05359870f147..b139036737f9 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/src/com/siyeh/InspectionGadgetsBundle.properties @@ -1728,6 +1728,8 @@ redundant.string.format.call.problem.descriptor=Redundant call to #ref#ref inside class extending JUnit 3 TestCase #loc +ignore.test.method.in.class.extending.junit3.testcase.problem.descriptor=@Ignore annotated method #ref won't be ignored #loc +ignore.test.method.in.class.extending.junit3.testcase.problem.fix=Remove @Ignore and rename method to ''{0}'' equals.called.on.enum.constant.display.name='equals()' called on Enum value equals.called.on.enum.constant.problem.descriptor=#ref called on Enum value #loc equals.called.on.enum.constant.quickfix=Replace 'equals()' with '==' diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/RenameFix.java b/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/RenameFix.java index f9f4c37ec3c1..907316e0edbb 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/RenameFix.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/fixes/RenameFix.java @@ -52,6 +52,10 @@ public class RenameFix extends InspectionGadgetsFix { } } + public String getTargetName() { + return m_targetName; + } + @Override public void doFix(final Project project, ProblemDescriptor descriptor) { final PsiElement nameIdentifier = descriptor.getPsiElement(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit4AnnotatedMethodInJUnit3TestCaseInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit4AnnotatedMethodInJUnit3TestCaseInspection.java index 302c6ce727bd..fd9b4b845149 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit4AnnotatedMethodInJUnit3TestCaseInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnit4AnnotatedMethodInJUnit3TestCaseInspection.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.junit; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -23,14 +24,18 @@ import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.fixes.RenameFix; import com.siyeh.ig.psiutils.TestUtils; import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class JUnit4AnnotatedMethodInJUnit3TestCaseInspection extends BaseInspection { - @Override + private static final String IGNORE = "org.junit.Ignore"; + + @Override @Nls @NotNull public String getDisplayName() { @@ -41,14 +46,44 @@ public class JUnit4AnnotatedMethodInJUnit3TestCaseInspection extends @Override @NotNull protected String buildErrorString(Object... infos) { + + if (infos[0] instanceof PsiMethod && + AnnotationUtil.isAnnotated((PsiModifierListOwner)infos[0], IGNORE, false)) { + return InspectionGadgetsBundle.message("ignore.test.method.in.class.extending.junit3.testcase.problem.descriptor"); + } return InspectionGadgetsBundle.message( "junit4.test.method.in.class.extending.junit3.testcase.problem.descriptor"); } + @Override + public boolean isEnabledByDefault() { + return true; + } + @NotNull @Override protected InspectionGadgetsFix[] buildFixes(Object... infos) { - final String className = (String) infos[0]; + String className = null; + if (infos[0] instanceof PsiMethod) { + final PsiMethod method = (PsiMethod)infos[0]; + PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return InspectionGadgetsFix.EMPTY_ARRAY; + className = containingClass.getName(); + if (AnnotationUtil.isAnnotated(method, IGNORE, false)) { + if (!TestUtils.isJUnit4TestMethod(method)) { + return new InspectionGadgetsFix[] {new RemoveIgnoreAndRename(method), + new RemoveExtendsTestCaseFix(className)}; + } else { + return new InspectionGadgetsFix[] {new RemoveIgnoreAndRename(method), + new RemoveTestAnnotationFix(), + new RemoveExtendsTestCaseFix(className)}; + } + } + } + + if (className == null) { + className = (String) infos[0]; + } if (className != null) { return new InspectionGadgetsFix[] { new RemoveTestAnnotationFix(), @@ -61,6 +96,43 @@ public class JUnit4AnnotatedMethodInJUnit3TestCaseInspection extends } } + private static void deleteAnnotation(ProblemDescriptor descriptor, final String qualifiedName) { + final PsiElement element = descriptor.getPsiElement(); + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiModifierListOwner)) { + return; + } + final PsiModifierListOwner method = (PsiModifierListOwner) parent; + final PsiModifierList modifierList = method.getModifierList(); + if (modifierList == null) { + return; + } + final PsiAnnotation annotation = modifierList.findAnnotation(qualifiedName); + if (annotation == null) { + return; + } + annotation.delete(); + } + + private static class RemoveIgnoreAndRename extends RenameFix { + public RemoveIgnoreAndRename(@NonNls PsiMethod method) { + super("_" + method.getName()); + } + + @NotNull + @Override + public String getName() { + return InspectionGadgetsBundle.message("ignore.test.method.in.class.extending.junit3.testcase.problem.fix", getTargetName()); + } + + @Override + public void doFix(Project project, ProblemDescriptor descriptor) { + deleteAnnotation(descriptor, IGNORE); + super.doFix(project, descriptor); + } + } + + private static class RemoveExtendsTestCaseFix extends InspectionGadgetsFix { private final String className; @@ -107,23 +179,10 @@ public class JUnit4AnnotatedMethodInJUnit3TestCaseInspection extends @Override protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { - final PsiElement element = descriptor.getPsiElement(); - final PsiElement parent = element.getParent(); - if (!(parent instanceof PsiModifierListOwner)) { - return; - } - final PsiModifierListOwner method = (PsiModifierListOwner) parent; - final PsiModifierList modifierList = method.getModifierList(); - if (modifierList == null) { - return; - } - final PsiAnnotation annotation = - modifierList.findAnnotation("org.junit.Test"); - if (annotation == null) { - return; - } - annotation.delete(); + deleteAnnotation(descriptor, "org.junit.Test"); } + + } @Override @@ -137,6 +196,10 @@ public class JUnit4AnnotatedMethodInJUnit3TestCaseInspection extends @Override public void visitMethod(PsiMethod method) { super.visitMethod(method); + if (AnnotationUtil.isAnnotated(method, IGNORE, false) && method.getName().startsWith("test")) { + registerMethodError(method, method); + return; + } if (!TestUtils.isJUnit4TestMethod(method)) { return; } diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4AnnotatedMethodInJUnit3TestCase.html b/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4AnnotatedMethodInJUnit3TestCase.html index ac99fc0fdfa3..a01aa266abcb 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4AnnotatedMethodInJUnit3TestCase.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4AnnotatedMethodInJUnit3TestCase.html @@ -2,7 +2,7 @@ This inspection reports JUnit 4 @Test annotated methods which are located inside a class extending the abstract JUnit 3 class TestCase. Mixing JUnit API's like this is -confusing and can lead to problems running the tests. +confusing and can lead to problems running the tests, e.g. method annotated with @Ignore won't be actually ignored if its name starts with test

Powered by InspectionGadgets