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 super String, Integer> 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());
}
}
}