diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties index 7b9a66b426da..c4615ec9ace8 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/resources/messages/InspectionGadgetsBundle.properties @@ -1554,6 +1554,7 @@ law.of.demeter.problem.descriptor=#ref() call violates Law of Demet law.of.demeter.ignore.library.calls.option=Ignore calls on library methods assertequals.between.inconvertible.types.display.name='assertEquals()' between objects of inconvertible types assertequals.between.inconvertible.types.problem.descriptor=#ref() between objects of inconvertible types ''{0}'' and ''{1}'' #loc +assertnotequals.between.inconvertible.types.problem.descriptor=Assertion never fails enumeration.can.be.iteration.display.name=Enumeration can be iteration enumeration.can.be.iteration.problem.descriptor=#ref() can be replaced with ''{0}'' construct #loc enumeration.can.be.iteration.quickfix=Replace with 'Iterator' construct diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertHint.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertHint.java index f53854431f75..0b1efe3b551a 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertHint.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/AssertHint.java @@ -71,6 +71,10 @@ public class AssertHint { return create(expression, methodName -> "assertEquals".equals(methodName) ? 2 : null, checkTestNG); } + public static AssertHint createAssertNotEqualsHint(PsiMethodCallExpression expression, boolean checkTestNG) { + return create(expression, methodName -> "assertNotEquals".equals(methodName) ? 2 : null, checkTestNG); + } + public static AssertHint createAssertTrueFalseHint(PsiMethodCallExpression expression, boolean checkTestNG) { return create(expression, methodName -> "assertTrue".equals(methodName) || "assertFalse".equals(methodName) ? 1 : null, checkTestNG); } @@ -79,6 +83,10 @@ public class AssertHint { return create(expression, methodName -> "assertSame".equals(methodName) ? 2 : null, checkTestNG); } + public static AssertHint createAssertNotSameHint(PsiMethodCallExpression expression, boolean checkTestNG) { + return create(expression, methodName -> "assertNotSame".equals(methodName) ? 2 : null, checkTestNG); + } + public static AssertHint create(PsiMethodCallExpression expression, Function methodNameToParamCount, boolean checkTestNG) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/BaseAssertEqualsBetweenInconvertibleTypesInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/BaseAssertEqualsBetweenInconvertibleTypesInspection.java index b468fb07cee9..da0adbaacb1a 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/BaseAssertEqualsBetweenInconvertibleTypesInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/testFrameworks/BaseAssertEqualsBetweenInconvertibleTypesInspection.java @@ -10,26 +10,36 @@ import com.siyeh.ig.callMatcher.CallMatcher; import com.siyeh.ig.psiutils.InconvertibleTypesChecker; import com.siyeh.ig.psiutils.MethodCallUtils; import com.siyeh.ig.psiutils.TypeUtils; +import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Objects; +import java.util.Set; public abstract class BaseAssertEqualsBetweenInconvertibleTypesInspection extends BaseInspection { private static final CallMatcher ASSERTJ_IS_EQUAL = CallMatcher.instanceCall( - "org.assertj.core.api.Assert", "isEqualTo", "isSameAs").parameterTypes(CommonClassNames.JAVA_LANG_OBJECT); + "org.assertj.core.api.Assert", "isEqualTo", "isSameAs", "isNotEqualTo", "isNotSameAs") + .parameterTypes(CommonClassNames.JAVA_LANG_OBJECT); private static final CallMatcher ASSERTJ_DESCRIBED = CallMatcher.instanceCall( "org.assertj.core.api.Descriptable", "describedAs", "as"); private static final CallMatcher ASSERTJ_ASSERT_THAT = CallMatcher.staticCall( "org.assertj.core.api.Assertions", "assertThat").parameterCount(1); + private static final Set ASSERT_NOT_EQUALS_METHODS = new THashSet<>(Arrays.asList( + "assertNotEquals", "assertNotSame", "isNotEqualTo", "isNotSameAs")); protected abstract boolean checkTestNG(); @Override @NotNull public String buildErrorString(Object... infos) { - final PsiType comparedType = (PsiType)infos[0]; - final PsiType comparisonType = (PsiType)infos[1]; + final String methodName = (String)infos[0]; + if (ASSERT_NOT_EQUALS_METHODS.contains(methodName)) { + return InspectionGadgetsBundle.message("assertnotequals.between.inconvertible.types.problem.descriptor"); + } + final PsiType comparedType = (PsiType)infos[1]; + final PsiType comparisonType = (PsiType)infos[2]; return InspectionGadgetsBundle.message("assertequals.between.inconvertible.types.problem.descriptor", StringUtil.escapeXmlEntities(comparedType.getPresentableText()), StringUtil.escapeXmlEntities(comparisonType.getPresentableText())); @@ -50,7 +60,9 @@ public abstract class BaseAssertEqualsBetweenInconvertibleTypesInspection extend public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); processAssertEquals(expression); + processAssertNotEquals(expression); processAssertSame(expression); + processAssertNotSame(expression); processAssertJ(expression); } @@ -58,10 +70,18 @@ public abstract class BaseAssertEqualsBetweenInconvertibleTypesInspection extend processAssertHint(AssertHint.createAssertEqualsHint(expression, checkTestNG()), expression); } + private void processAssertNotEquals(@NotNull PsiMethodCallExpression expression) { + processAssertHint(AssertHint.createAssertNotEqualsHint(expression, checkTestNG()), expression); + } + private void processAssertSame(@NotNull PsiMethodCallExpression expression) { processAssertHint(AssertHint.createAssertSameHint(expression, checkTestNG()), expression); } + private void processAssertNotSame(@NotNull PsiMethodCallExpression expression) { + processAssertHint(AssertHint.createAssertNotSameHint(expression, checkTestNG()), expression); + } + private void processAssertJ(@NotNull PsiMethodCallExpression call) { if (!ASSERTJ_IS_EQUAL.test(call)) return; PsiMethodCallExpression qualifierCall = MethodCallUtils.getQualifierMethodCall(call); @@ -93,7 +113,7 @@ public abstract class BaseAssertEqualsBetweenInconvertibleTypesInspection extend InconvertibleTypesChecker.TypeMismatch mismatch = InconvertibleTypesChecker.checkTypes(type1, type2, lookForMutualSubclass); if (mismatch != null) { PsiElement name = Objects.requireNonNull(expression.getMethodExpression().getReferenceNameElement()); - registerError(name, mismatch.getLeft(), mismatch.getRight(), mismatch.isConvertible()); + registerError(name, name.getText(), mismatch.getLeft(), mismatch.getRight()); } } }