Compare commits

..
5 Commits
18 changed files with 315 additions and 109 deletions
+28 -6
View File
@@ -232,6 +232,22 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
``` ```
Analogously with ```isFalse()``` (except for ```containsAll()```). Analogously with ```isFalse()``` (except for ```containsAll()```).
Additional transformations for maps:
```
from: assertThat(map.get(key)).isEqualTo(value);
to: assertThat(map).containsEntry(key, value);
from: assertThat(map.get(key)).isNotEqualTo(value);
to: assertThat(map).doesNotContainEntry(key, value);
from: assertThat(map.get(key)).isNotNull();
to: assertThat(map).containsKey(key);
from: assertThat(map.get(key)).isNull();
to: assertThat(map).doesNotContainKey(key);
```
- AssertThatEnumerableIsEmpty - AssertThatEnumerableIsEmpty
Uses ```isEmpty()``` for ```hasSize(0)``` iterable assertions instead. Uses ```isEmpty()``` for ```hasSize(0)``` iterable assertions instead.
@@ -243,7 +259,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
- AssertThatSize - AssertThatSize
Makes assertions on sizes of arrays, collections, strings, Makes assertions on sizes of arrays, collections, maps, strings,
or ```CharSequence```s more concise. or ```CharSequence```s more concise.
``` ```
@@ -265,7 +281,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
to: assertThat(array).hasSameSizeAs(anotherArray); to: assertThat(array).hasSameSizeAs(anotherArray);
``` ```
and additionally with AssertJ 13.2.0 or later and additionally with AssertJ 3.12.0 or later
``` ```
from: assertThat(array.length).isLessThanOrEqualTo(expression); from: assertThat(array.length).isLessThanOrEqualTo(expression);
@@ -280,14 +296,14 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
from: assertThat(array.length).isGreaterThanOrEqualTo(expression); from: assertThat(array.length).isGreaterThanOrEqualTo(expression);
to: assertThat(array).hasSizeGreaterThanOrEqualTo(expression); to: assertThat(array).hasSizeGreaterThanOrEqualTo(expression);
``` ```
and analogously for collections, strings and CharSequences, e.g: and analogously for collections, maps, strings and CharSequences, e.g:
``` ```
from: assertThat("string".length()).isLessThan(1); from: assertThat("string".length()).isLessThan(1);
to: assertThat("string").isEmpty(); to: assertThat("string").isEmpty();
from: assertThat("string".length()).isEqualTo(collection.size()) from: assertThat("string".length()).isEqualTo(map.size())
to: assertThat("string").hasSameSizeAs(collection); to: assertThat("string").hasSameSizeAs(map);
from: assertThat("string".length()).hasSize("strong".length()) from: assertThat("string".length()).hasSize("strong".length())
to: assertThat("string").hasSameSizeAs("strong"); to: assertThat("string").hasSameSizeAs("strong");
@@ -527,6 +543,7 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
## Planned features ## Planned features
- More Optional fixes such as opt1.get() == opt2.get() etc. - More Optional fixes such as opt1.get() == opt2.get() etc.
- More moving out of methods for File, Path, LocalDate/Time etc.
- Converting ```foo.compareTo(bar) == 0``` to ```isEqualTo()``` (yes, I've *really* seen code like that) - Converting ```foo.compareTo(bar) == 0``` to ```isEqualTo()``` (yes, I've *really* seen code like that)
- Extraction with property names to lambda with Java 8 - Extraction with property names to lambda with Java 8
@@ -537,6 +554,11 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
## Changelog ## Changelog
#### V1.4 (25-Aug-19)
- Minor fix for highlighting of JoinVarArgsContains inspection.
- Extended AssertThatSize inspection to Maps, too.
- Extended AssertThatCollectionOrMap inspection for several ```assertThat(map.get())``` cases as suggested by Stefan H.
#### V1.3 (03-Aug-19) #### V1.3 (03-Aug-19)
- New JoinVarArgsContains inspection that will detect multiple ```.contains()```, ```.doesNotContain()```, - New JoinVarArgsContains inspection that will detect multiple ```.contains()```, ```.doesNotContain()```,
and ```.containsOnlyOnce()``` calls within the same statement that could be joined together using variadic arguments. and ```.containsOnlyOnce()``` calls within the same statement that could be joined together using variadic arguments.
@@ -607,7 +629,7 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
#### V0.3 (07-Apr-19) #### V0.3 (07-Apr-19)
- New inspection AssertThatBinaryExpressionIsTrueOrFalse that will find and fix common binary expressions and ```equals()``` statements (more than 150 combinations) inside ```assertThat()```. - New inspection AssertThatBinaryExpressionIsTrueOrFalse that will find and fix common binary expressions and ```equals()``` statements (more than 150 combinations) inside ```assertThat()```.
- Merged AssertThatObjectIsNull and AssertThatObjectIsNotNull to AssertThatObjectIsNullOrNotNull. - Merged AssertThatObjectIsNull and AssertThatObjectIsNotNull to AssertThatObjectIsNullOrNotNull.
- Support for ```hasSizeLessThan()```, ```hasSizeLessThanOrEqualTo()```, ```hasSizeGreaterThanOrEqualTo()```, and ```hasSizeGreaterThan()``` for AssertThatSizeInspection (with AssertJ >=13.2.0). - Support for ```hasSizeLessThan()```, ```hasSizeLessThanOrEqualTo()```, ```hasSizeGreaterThanOrEqualTo()```, and ```hasSizeGreaterThan()``` for AssertThatSizeInspection (with AssertJ >=3.12.0).
- Really fixed highlighting for JUnit conversion. Sorry. - Really fixed highlighting for JUnit conversion. Sorry.
#### V0.2 (01-Apr-19) #### V0.2 (01-Apr-19)
+9 -12
View File
@@ -1,13 +1,13 @@
plugins { plugins {
id 'java' id 'java'
id 'org.jetbrains.intellij' version '0.4.9' id 'org.jetbrains.intellij' version '0.4.10'
id 'org.jetbrains.kotlin.jvm' version '1.3.41' id 'org.jetbrains.kotlin.jvm' version '1.3.50'
id 'jacoco' id 'jacoco'
id 'com.github.kt3k.coveralls' version '2.8.4' id 'com.github.kt3k.coveralls' version '2.8.4'
} }
group 'de.platon42' group 'de.platon42'
version '1.3' version '1.4'
repositories { repositories {
mavenCentral() mavenCentral()
@@ -20,7 +20,7 @@ repositories {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testCompile "org.assertj:assertj-core:3.13.0" testCompile "org.assertj:assertj-core:3.13.2"
testCompile "org.assertj:assertj-guava:3.2.1" testCompile "org.assertj:assertj-guava:3.2.1"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.1'
@@ -35,7 +35,7 @@ compileTestKotlin {
kotlinOptions.jvmTarget = "1.8" kotlinOptions.jvmTarget = "1.8"
} }
intellij { intellij {
version '2019.2' version '2019.2.1'
// pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)' // pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)'
updateSinceUntilBuild false updateSinceUntilBuild false
plugins = ['java'] plugins = ['java']
@@ -43,14 +43,11 @@ intellij {
patchPluginXml { patchPluginXml {
changeNotes """ changeNotes """
<h4>V1.3 (03-Aug-19)</h4> <h4>V1.4 (25-Aug-19)</h4>
<ul> <ul>
<li>New JoinVarArgsContains inspection that will detect multiple .contains(), .doesNotContain(), and .containsOnlyOnce() <li>Minor fix for highlighting of JoinVarArgsContains inspection.
calls within the same statement that could be joined together using variadic arguments. <li>Extended AssertThatSize inspection to Maps, too.
<li>AssertJ 3.13.0 broke some inspections due to new AbstractStringAssert::isEqualTo() method. <li>Extended AssertThatCollectionOrMap inspection for several assertThat(map.get()) cases as suggested by Stefan H.
<li>AssertThatJava8Optional and AssertThatGuavaOptional inspections do not longer try to fix
assertThat(optional).isEqualTo(Optional.fromNullable(expression)) to contains()
when expression is not a non-null constant expression.
</ul> </ul>
<p>Full changelog available at <a href="https://github.com/chrisly42/cajon-plugin#changelog">Github project site</a>.</p> <p>Full changelog available at <a href="https://github.com/chrisly42/cajon-plugin#changelog">Github project site</a>.</p>
""" """
@@ -30,6 +30,12 @@ class AssertJClassNames {
@NonNls @NonNls
const val ABSTRACT_INTEGER_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractIntegerAssert" const val ABSTRACT_INTEGER_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractIntegerAssert"
@NonNls @NonNls
const val ABSTRACT_LONG_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractLongAssert"
@NonNls
const val ABSTRACT_FLOAT_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractFloatAssert"
@NonNls
const val ABSTRACT_DOUBLE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractDoubleAssert"
@NonNls
const val ABSTRACT_COMPARABLE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractComparableAssert" const val ABSTRACT_COMPARABLE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractComparableAssert"
@NonNls @NonNls
const val ABSTRACT_STRING_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractStringAssert" const val ABSTRACT_STRING_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractStringAssert"
@@ -9,10 +9,12 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import com.intellij.psi.util.PsiTypesUtil import com.intellij.psi.util.PsiTypesUtil
import com.siyeh.ig.callMatcher.CallMatcher import com.siyeh.ig.callMatcher.CallMatcher
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_BOOLEAN_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_BOOLEAN_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_COMPARABLE_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_COMPARABLE_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_DOUBLE_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_FLOAT_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_INTEGER_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_INTEGER_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_LONG_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_STRING_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_STRING_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ASSERTIONS_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ASSERTIONS_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ASSERT_INTERFACE import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ASSERT_INTERFACE
@@ -84,13 +86,30 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!! .parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
val IS_EQUAL_TO_STRING = CallMatcher.instanceCall(ABSTRACT_STRING_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO) val IS_EQUAL_TO_STRING = CallMatcher.instanceCall(ABSTRACT_STRING_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes(CommonClassNames.JAVA_LANG_STRING)!! .parameterTypes(CommonClassNames.JAVA_LANG_STRING)!!
val IS_NOT_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_NOT_EQUAL_TO) val IS_EQUAL_TO_INT = CallMatcher.instanceCall(ABSTRACT_INTEGER_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!! .parameterTypes("int")!!
val IS_EQUAL_TO_LONG = CallMatcher.instanceCall(ABSTRACT_LONG_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes("long")!!
val IS_EQUAL_TO_FLOAT = CallMatcher.instanceCall(ABSTRACT_FLOAT_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes("float")!!
val IS_EQUAL_TO_DOUBLE = CallMatcher.instanceCall(ABSTRACT_DOUBLE_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes("double")!!
val IS_EQUAL_TO_BOOLEAN = CallMatcher.instanceCall(ABSTRACT_BOOLEAN_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO) val IS_EQUAL_TO_BOOLEAN = CallMatcher.instanceCall(ABSTRACT_BOOLEAN_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes("boolean")!! .parameterTypes("boolean")!!
val IS_NOT_EQUAL_TO_BOOLEAN =
CallMatcher.instanceCall(ABSTRACT_BOOLEAN_ASSERT_CLASSNAME, MethodNames.IS_NOT_EQUAL_TO) val IS_NOT_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_NOT_EQUAL_TO)
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
val IS_NOT_EQUAL_TO_BOOLEAN = CallMatcher.instanceCall(ABSTRACT_BOOLEAN_ASSERT_CLASSNAME, MethodNames.IS_NOT_EQUAL_TO)
.parameterTypes("boolean")!! .parameterTypes("boolean")!!
val IS_NOT_EQUAL_TO_INT = CallMatcher.instanceCall(ABSTRACT_INTEGER_ASSERT_CLASSNAME, MethodNames.IS_NOT_EQUAL_TO)
.parameterTypes("int")!!
val IS_NOT_EQUAL_TO_LONG = CallMatcher.instanceCall(ABSTRACT_LONG_ASSERT_CLASSNAME, MethodNames.IS_NOT_EQUAL_TO)
.parameterTypes("long")!!
val IS_NOT_EQUAL_TO_FLOAT = CallMatcher.instanceCall(ABSTRACT_FLOAT_ASSERT_CLASSNAME, MethodNames.IS_NOT_EQUAL_TO)
.parameterTypes("float")!!
val IS_NOT_EQUAL_TO_DOUBLE = CallMatcher.instanceCall(ABSTRACT_DOUBLE_ASSERT_CLASSNAME, MethodNames.IS_NOT_EQUAL_TO)
.parameterTypes("double")!!
val IS_SAME_AS_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_SAME_AS) val IS_SAME_AS_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_SAME_AS)
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!! .parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
val IS_NOT_SAME_AS_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_NOT_SAME_AS) val IS_NOT_SAME_AS_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_NOT_SAME_AS)
@@ -106,8 +125,6 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
val HAS_SIZE = CallMatcher.instanceCall(ENUMERABLE_ASSERT_INTERFACE, MethodNames.HAS_SIZE) val HAS_SIZE = CallMatcher.instanceCall(ENUMERABLE_ASSERT_INTERFACE, MethodNames.HAS_SIZE)
.parameterTypes("int")!! .parameterTypes("int")!!
val IS_EQUAL_TO_INT = CallMatcher.instanceCall(ABSTRACT_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes("int")!!
val IS_GREATER_THAN_INT = CallMatcher.instanceCall(ABSTRACT_COMPARABLE_ASSERT_CLASSNAME, MethodNames.IS_GREATER_THAN) val IS_GREATER_THAN_INT = CallMatcher.instanceCall(ABSTRACT_COMPARABLE_ASSERT_CLASSNAME, MethodNames.IS_GREATER_THAN)
.parameterTypes("int")!! .parameterTypes("int")!!
val IS_GREATER_THAN_OR_EQUAL_TO_INT = CallMatcher.instanceCall(ABSTRACT_COMPARABLE_ASSERT_CLASSNAME, MethodNames.IS_GREATER_THAN_OR_EQUAL_TO) val IS_GREATER_THAN_OR_EQUAL_TO_INT = CallMatcher.instanceCall(ABSTRACT_COMPARABLE_ASSERT_CLASSNAME, MethodNames.IS_GREATER_THAN_OR_EQUAL_TO)
@@ -130,6 +147,8 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
val COLLECTION_SIZE = CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, "size") val COLLECTION_SIZE = CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, "size")
.parameterCount(0)!! .parameterCount(0)!!
val MAP_SIZE = CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, "size")
.parameterCount(0)!!
val CHAR_SEQUENCE_LENGTH = CallMatcher.instanceCall("java.lang.CharSequence", "length") val CHAR_SEQUENCE_LENGTH = CallMatcher.instanceCall("java.lang.CharSequence", "length")
.parameterCount(0)!! .parameterCount(0)!!
val OBJECT_EQUALS = CallMatcher.instanceCall(CommonClassNames.JAVA_LANG_OBJECT, "equals") val OBJECT_EQUALS = CallMatcher.instanceCall(CommonClassNames.JAVA_LANG_OBJECT, "equals")
@@ -11,6 +11,26 @@ class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection(
companion object { companion object {
private const val DISPLAY_NAME = "Asserting a collection or map specific expression" private const val DISPLAY_NAME = "Asserting a collection or map specific expression"
private val MAP_GET_MATCHER = CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, "get").parameterCount(1)
private val ANY_IS_EQUAL_TO_MATCHER = CallMatcher.anyOf(
IS_EQUAL_TO_OBJECT,
IS_EQUAL_TO_STRING,
IS_EQUAL_TO_INT,
IS_EQUAL_TO_LONG,
IS_EQUAL_TO_FLOAT,
IS_EQUAL_TO_DOUBLE,
IS_EQUAL_TO_BOOLEAN
)
private val ANY_IS_NOT_EQUAL_TO_MATCHER = CallMatcher.anyOf(
IS_NOT_EQUAL_TO_OBJECT,
IS_NOT_EQUAL_TO_INT,
IS_NOT_EQUAL_TO_LONG,
IS_NOT_EQUAL_TO_FLOAT,
IS_NOT_EQUAL_TO_DOUBLE,
IS_NOT_EQUAL_TO_BOOLEAN
)
private val MAPPINGS = listOf( private val MAPPINGS = listOf(
Mapping( Mapping(
CallMatcher.anyOf( CallMatcher.anyOf(
@@ -46,12 +66,31 @@ class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection(
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) return if (!statement.hasAssertThat()) return
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return
val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
val expectedCallExpression = statement.findOutmostMethodCall() ?: return
if (MAP_GET_MATCHER.test(assertThatArgument)) {
val nullOrNotNull = expectedCallExpression.getAllTheSameNullNotNullConstants()
if (nullOrNotNull != null) {
val replacementMethod = nullOrNotNull.map("containsKey", "doesNotContainKey")
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, replacementMethod) { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, useNullNonNull = true)
}
} else {
if (ANY_IS_EQUAL_TO_MATCHER.test(expectedCallExpression)) {
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, "containsEntry") { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, keepExpectedAsSecondArgument = true)
}
} else if (ANY_IS_NOT_EQUAL_TO_MATCHER.test(expectedCallExpression)) {
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, "doesNotContainEntry") { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, keepExpectedAsSecondArgument = true)
}
}
}
} else {
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return
val mapping = MAPPINGS.firstOrNull { it.callMatcher.test(assertThatArgument) } ?: return val mapping = MAPPINGS.firstOrNull { it.callMatcher.test(assertThatArgument) } ?: return
val expectedCallExpression = statement.findOutmostMethodCall() ?: return
val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return
val replacementMethod = if (expectedResult) mapping.replacementForTrue else mapping.replacementForFalse ?: return val replacementMethod = if (expectedResult) mapping.replacementForTrue else mapping.replacementForFalse ?: return
@@ -61,6 +100,7 @@ class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection(
} }
} }
} }
}
private class Mapping( private class Mapping(
val callMatcher: CallMatcher, val callMatcher: CallMatcher,
@@ -11,7 +11,7 @@ import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceSizeMethodCallQuickF
class AssertThatSizeInspection : AbstractAssertJInspection() { class AssertThatSizeInspection : AbstractAssertJInspection() {
companion object { companion object {
private const val DISPLAY_NAME = "Asserting the size of an collection, array or string" private const val DISPLAY_NAME = "Asserting the size of an collection, map, array or string"
private const val REMOVE_SIZE_DESCRIPTION_TEMPLATE = "Remove size determination of expected expression and replace %s() with %s()" private const val REMOVE_SIZE_DESCRIPTION_TEMPLATE = "Remove size determination of expected expression and replace %s() with %s()"
private const val REMOVE_ALL_MESSAGE = "Try to operate on the iterable itself rather than its size" private const val REMOVE_ALL_MESSAGE = "Try to operate on the iterable itself rather than its size"
@@ -26,13 +26,15 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
private fun isCollectionSize(expression: PsiExpression) = (expression is PsiMethodCallExpression) && COLLECTION_SIZE.test(expression) private fun isCollectionSize(expression: PsiExpression) = (expression is PsiMethodCallExpression) && COLLECTION_SIZE.test(expression)
private fun isMapSize(expression: PsiExpression) = (expression is PsiMethodCallExpression) && MAP_SIZE.test(expression)
private fun isArrayLength(expression: PsiExpression): Boolean { private fun isArrayLength(expression: PsiExpression): Boolean {
val psiReferenceExpression = expression as? PsiReferenceExpression ?: return false val psiReferenceExpression = expression as? PsiReferenceExpression ?: return false
return ((psiReferenceExpression.qualifierExpression?.type is PsiArrayType) return ((psiReferenceExpression.qualifierExpression?.type is PsiArrayType)
&& ((psiReferenceExpression.resolve() as? PsiField)?.name == "length")) && ((psiReferenceExpression.resolve() as? PsiField)?.name == "length"))
} }
fun getMatch(expression: PsiMethodCallExpression, isForArrayOrCollection: Boolean, isForString: Boolean): Match? { fun getMatch(expression: PsiMethodCallExpression, isForArrayCollectionOrMap: Boolean, isForString: Boolean): Match? {
val isLastExpression = expression.parent is PsiStatement val isLastExpression = expression.parent is PsiStatement
val constValue = expression.calculateConstantParameterValue(0) val constValue = expression.calculateConstantParameterValue(0)
if (IS_EQUAL_TO_INT.test(expression)) { if (IS_EQUAL_TO_INT.test(expression)) {
@@ -40,8 +42,10 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
Match(expression, MethodNames.IS_EMPTY, noExpectedExpression = true) Match(expression, MethodNames.IS_EMPTY, noExpectedExpression = true)
} else { } else {
val equalToExpression = expression.firstArg val equalToExpression = expression.firstArg
if (isForArrayOrCollection && (isCollectionSize(equalToExpression) || isArrayLength(equalToExpression)) || val equalsArrayCollectionOrMapSize = isArrayLength(equalToExpression) ||
isForString && (isCollectionSize(equalToExpression) || isArrayLength(equalToExpression) || isCharSequenceLength(equalToExpression)) isCollectionSize(equalToExpression) || isMapSize(equalToExpression)
if (isForArrayCollectionOrMap && equalsArrayCollectionOrMapSize ||
isForString && (equalsArrayCollectionOrMapSize || isCharSequenceLength(equalToExpression))
) { ) {
Match(expression, MethodNames.HAS_SAME_SIZE_AS, expectedIsCollection = true) Match(expression, MethodNames.HAS_SAME_SIZE_AS, expectedIsCollection = true)
} else { } else {
@@ -59,7 +63,7 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
val replacementMethod = isTestForEmpty.map(MethodNames.IS_EMPTY, MethodNames.IS_NOT_EMPTY) val replacementMethod = isTestForEmpty.map(MethodNames.IS_EMPTY, MethodNames.IS_NOT_EMPTY)
return Match(expression, replacementMethod, noExpectedExpression = true) return Match(expression, replacementMethod, noExpectedExpression = true)
} else if (hasAssertJMethod(expression, ABSTRACT_ITERABLE_ASSERT_CLASSNAME, MethodNames.HAS_SIZE_LESS_THAN)) { } else if (hasAssertJMethod(expression, ABSTRACT_ITERABLE_ASSERT_CLASSNAME, MethodNames.HAS_SIZE_LESS_THAN)) {
// new stuff in AssertJ 13.2.0 // new stuff in AssertJ 3.12.0
val replacementMethod = BONUS_EXPRESSIONS_CALL_MATCHER_MAP.find { it.first.test(expression) }?.second ?: return null val replacementMethod = BONUS_EXPRESSIONS_CALL_MATCHER_MAP.find { it.first.test(expression) }?.second ?: return null
return Match(expression, replacementMethod) return Match(expression, replacementMethod)
} }
@@ -79,12 +83,12 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
if (!ASSERT_THAT_INT.test(staticMethodCall)) return if (!ASSERT_THAT_INT.test(staticMethodCall)) return
val actualExpression = staticMethodCall.firstArg val actualExpression = staticMethodCall.firstArg
val isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression) val isForArrayCollectionOrMap = isArrayLength(actualExpression) || isCollectionSize(actualExpression) || isMapSize(actualExpression)
val isForString = isCharSequenceLength(actualExpression) val isForString = isCharSequenceLength(actualExpression)
if (!(isForArrayOrCollection || isForString)) return if (!(isForArrayCollectionOrMap || isForString)) return
val matches = staticMethodCall.collectMethodCallsUpToStatement() val matches = staticMethodCall.collectMethodCallsUpToStatement()
.mapNotNull { getMatch(it, isForArrayOrCollection, isForString) } .mapNotNull { getMatch(it, isForArrayCollectionOrMap, isForString) }
.toList() .toList()
if (matches.isNotEmpty()) { if (matches.isNotEmpty()) {
if (matches.size == 1) { if (matches.size == 1) {
@@ -112,9 +116,9 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
if (!HAS_SIZE.test(expression)) return if (!HAS_SIZE.test(expression)) return
val actualExpression = expression.firstArg val actualExpression = expression.firstArg
val isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression) val isForArrayCollectionOrMap = isArrayLength(actualExpression) || isCollectionSize(actualExpression) || isMapSize(actualExpression)
val isForString = isCharSequenceLength(actualExpression) val isForString = isCharSequenceLength(actualExpression)
if (!(isForArrayOrCollection if (!(isForArrayCollectionOrMap
|| (isForString && checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME))) || (isForString && checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME)))
) return ) return
@@ -14,7 +14,7 @@ import de.platon42.intellij.plugins.cajon.quickfixes.JoinVarArgsContainsQuickFix
class JoinVarArgsContainsInspection : AbstractAssertJInspection() { class JoinVarArgsContainsInspection : AbstractAssertJInspection() {
companion object { companion object {
private const val DISPLAY_NAME = "Join variadic arguments of contains()/containsOnlyOnce()/doesNotContain()" private const val DISPLAY_NAME = "Join arguments to variadic for contains()/containsOnlyOnce()/doesNotContain()"
private const val JOIN_VARARGS_MESSAGE = "Calls to same methods may be joined to variadic version" private const val JOIN_VARARGS_MESSAGE = "Calls to same methods may be joined to variadic version"
private val MATCHERS = listOf(MethodNames.CONTAINS, MethodNames.CONTAINS_ONLY_ONCE, MethodNames.DOES_NOT_CONTAIN) private val MATCHERS = listOf(MethodNames.CONTAINS, MethodNames.CONTAINS_ONLY_ONCE, MethodNames.DOES_NOT_CONTAIN)
@@ -42,7 +42,7 @@ class JoinVarArgsContainsInspection : AbstractAssertJInspection() {
if (onlyAssertionCalls.count(methodMatcher::test) > 1) { if (onlyAssertionCalls.count(methodMatcher::test) > 1) {
val outmostMethodCall = statement.findOutmostMethodCall() ?: return val outmostMethodCall = statement.findOutmostMethodCall() ?: return
val quickFix = JoinVarArgsContainsQuickFix(MATCHERS) val quickFix = JoinVarArgsContainsQuickFix(MATCHERS)
val textRange = TextRange(outmostMethodCall.qualifierExpression.textLength, outmostMethodCall.textLength) val textRange = TextRange(assertThatCall.textLength, outmostMethodCall.textLength)
holder.registerProblem(outmostMethodCall, textRange, JOIN_VARARGS_MESSAGE, quickFix) holder.registerProblem(outmostMethodCall, textRange, JOIN_VARARGS_MESSAGE, quickFix)
return return
} }
@@ -9,7 +9,8 @@ class MoveOutMethodCallExpressionQuickFix(
description: String, description: String,
private val replacementMethod: String, private val replacementMethod: String,
private val useNullNonNull: Boolean = false, private val useNullNonNull: Boolean = false,
private val noExpectedExpression: Boolean = false private val noExpectedExpression: Boolean = false,
private val keepExpectedAsSecondArgument: Boolean = false
) : ) :
AbstractCommonQuickFix(description) { AbstractCommonQuickFix(description) {
@@ -27,6 +28,16 @@ class MoveOutMethodCallExpressionQuickFix(
val assertExpression = assertThatMethodCall.firstArg as? PsiMethodCallExpression ?: return val assertExpression = assertThatMethodCall.firstArg as? PsiMethodCallExpression ?: return
val assertExpressionArg = if (noExpectedExpression) null else assertExpression.getArgOrNull(0)?.copy() val assertExpressionArg = if (noExpectedExpression) null else assertExpression.getArgOrNull(0)?.copy()
if (keepExpectedAsSecondArgument) {
assertExpressionArg ?: return
val secondArg = outmostCallExpression.getArgOrNull(0)?.copy() ?: return
assertExpression.replace(assertExpression.qualifierExpression)
val expectedExpression = createExpectedMethodCall(outmostCallExpression, replacementMethod, assertExpressionArg, secondArg)
expectedExpression.replaceQualifierFromMethodCall(outmostCallExpression)
outmostCallExpression.replace(expectedExpression)
} else {
val methodsToFix = assertThatMethodCall.collectMethodCallsUpToStatement() val methodsToFix = assertThatMethodCall.collectMethodCallsUpToStatement()
.filter { (if (useNullNonNull) it.getExpectedNullNonNullResult() else it.getExpectedBooleanResult()) != null } .filter { (if (useNullNonNull) it.getExpectedNullNonNullResult() else it.getExpectedBooleanResult()) != null }
.toList() .toList()
@@ -40,4 +51,5 @@ class MoveOutMethodCallExpressionQuickFix(
it.replace(expectedExpression) it.replace(expectedExpression)
} }
} }
}
} }
@@ -15,7 +15,7 @@ class ReplaceHasSizeMethodCallQuickFix(description: String, private val replacem
override fun applyFix(project: Project, descriptor: ProblemDescriptor) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val methodCallExpression = descriptor.startElement as? PsiMethodCallExpression ?: return val methodCallExpression = descriptor.startElement as? PsiMethodCallExpression ?: return
replaceCollectionSizeOrArrayLength(methodCallExpression.firstArg) replaceCollectionAndMapSizeOrArrayLength(methodCallExpression.firstArg)
val expectedExpression = createExpectedMethodCall(methodCallExpression, replacementMethod, methodCallExpression.firstArg) val expectedExpression = createExpectedMethodCall(methodCallExpression, replacementMethod, methodCallExpression.firstArg)
@@ -23,7 +23,7 @@ class ReplaceHasSizeMethodCallQuickFix(description: String, private val replacem
methodCallExpression.replace(expectedExpression) methodCallExpression.replace(expectedExpression)
} }
private fun replaceCollectionSizeOrArrayLength(assertExpression: PsiExpression) { private fun replaceCollectionAndMapSizeOrArrayLength(assertExpression: PsiExpression) {
assertExpression.replace( assertExpression.replace(
when (assertExpression) { when (assertExpression) {
is PsiReferenceExpression -> assertExpression.qualifierExpression!! is PsiReferenceExpression -> assertExpression.qualifierExpression!!
@@ -26,10 +26,10 @@ class ReplaceSizeMethodCallQuickFix(
val outmostCallExpression = descriptor.startElement as? PsiMethodCallExpression ?: return val outmostCallExpression = descriptor.startElement as? PsiMethodCallExpression ?: return
val assertThatMethodCall = outmostCallExpression.findStaticMethodCall() ?: return val assertThatMethodCall = outmostCallExpression.findStaticMethodCall() ?: return
val assertExpression = assertThatMethodCall.firstArg val assertExpression = assertThatMethodCall.firstArg
replaceCollectionSizeOrArrayLength(assertExpression) replaceCollectionAndMapSizeOrArrayLength(assertExpression)
if (expectedIsCollection) { if (expectedIsCollection) {
replaceCollectionSizeOrArrayLength(outmostCallExpression.firstArg) replaceCollectionAndMapSizeOrArrayLength(outmostCallExpression.firstArg)
} }
val args = if (noExpectedExpression) emptyArray() else arrayOf(outmostCallExpression.firstArg) val args = if (noExpectedExpression) emptyArray() else arrayOf(outmostCallExpression.firstArg)
@@ -39,7 +39,7 @@ class ReplaceSizeMethodCallQuickFix(
outmostCallExpression.replace(expectedExpression) outmostCallExpression.replace(expectedExpression)
} }
private fun replaceCollectionSizeOrArrayLength(assertExpression: PsiExpression) { private fun replaceCollectionAndMapSizeOrArrayLength(assertExpression: PsiExpression) {
assertExpression.replace( assertExpression.replace(
when (assertExpression) { when (assertExpression) {
is PsiReferenceExpression -> assertExpression.qualifierExpression!! is PsiReferenceExpression -> assertExpression.qualifierExpression!!
@@ -1,8 +1,10 @@
<html> <html>
<body> <body>
Turns assertThat(collectionOrMap.someMethod(arg)).isTrue/isFalse() into assertThat(collectionOrMap).someMethod(arg). Turns assertThat(collectionOrMap.someMethod(arg)).isTrue/isFalse() into assertThat(collectionOrMap).someMethod(arg) and
assertThat(map.get(key)).isEqualTo/isNotEqualTo(value) into assertThat(map).containsEntry(key, value).
<!-- tooltip end --> <!-- tooltip end -->
<br>someMethod() can be isEmpty(), contains(), and containsAll() for collections and <br>someMethod() can be isEmpty(), contains(), and containsAll() for collections and
isEmpty(), containsKey(), and containsValue() for maps. isEmpty(), containsKey(), and containsValue() for maps.
get() may be transformed into containsKey(), doesNotContainKey(), containsEntry() or doesNotContainEntry().
</body> </body>
</html> </html>
@@ -1,7 +1,7 @@
<html> <html>
<body> <body>
Makes assertions on sizes of arrays, collections, strings, or CharSequences more concise by replacing them with isEmpty(), isNotEmpty(), hasSize(), or hasSameSizeAs(). Makes assertions on sizes of arrays, collections, maps, strings, or CharSequences more concise by replacing them with isEmpty(), isNotEmpty(), hasSize(), or hasSameSizeAs().
<!-- tooltip end --> <!-- tooltip end -->
<br>Several more conversions are available with AssertJ 13.2.0 or later. <br>Several more conversions are available with AssertJ 3.12.0 or later.
</body> </body>
</html> </html>
@@ -22,6 +22,10 @@ internal class AssertThatCollectionOrMapExpressionInspectionTest : AbstractCajon
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().doesNotContain() instead"), 2) executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().doesNotContain() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().doesNotContainKey() instead"), 2) executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().doesNotContainKey() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().doesNotContainValue() instead"), 2) executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().doesNotContainValue() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsEntry() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainEntry() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsKey() instead"), 4)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 4)
myFixture.checkResultByFile("CollectionMapExpressionAfter.java") myFixture.checkResultByFile("CollectionMapExpressionAfter.java")
} }
} }
@@ -12,25 +12,25 @@ internal class AssertThatSizeInspectionTest : AbstractCajonTest() {
@Test @Test
@TestDataSubPath("inspections/Size") @TestDataSubPath("inspections/Size")
internal fun assertThat_size_of_array_or_collection_can_be_simplified(@MyFixture myFixture: JavaCodeInsightTestFixture) { internal fun assertThat_size_of_array_collection_or_map_can_be_simplified(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.enableInspections(AssertThatSizeInspection::class.java) myFixture.enableInspections(AssertThatSizeInspection::class.java)
myFixture.configureByFile("SizeBefore.java") myFixture.configureByFile("SizeBefore.java")
assertThat(myFixture.doHighlighting()).extrakting { it.description }.containsOnlyOnce("Try to operate on the iterable itself rather than its size") assertThat(myFixture.doHighlighting()).extrakting { it.description }.containsOnlyOnce("Try to operate on the iterable itself rather than its size")
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isZero() with isEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isZero() with isEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotZero() with isNotEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotZero() with isNotEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThan() with isNotEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThan() with isNotEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with isNotEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with isNotEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThan() with isEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThan() with isEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThanOrEqualTo() with isEmpty()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThanOrEqualTo() with isEmpty()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSameSizeAs()"), 12) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSameSizeAs()"), 19)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSize()"), 8) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSize()"), 11)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThan() with hasSizeGreaterThan()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThan() with hasSizeGreaterThan()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with hasSizeGreaterThanOrEqualTo()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with hasSizeGreaterThanOrEqualTo()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThan() with hasSizeLessThan()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThan() with hasSizeLessThan()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThanOrEqualTo() with hasSizeLessThanOrEqualTo()"), 4) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThanOrEqualTo() with hasSizeLessThanOrEqualTo()"), 5)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove size determination of expected expression and replace hasSize() with hasSameSizeAs()"), 14) executeQuickFixes(myFixture, Regex.fromLiteral("Remove size determination of expected expression and replace hasSize() with hasSameSizeAs()"), 21)
myFixture.checkResultByFile("SizeAfter.java") myFixture.checkResultByFile("SizeAfter.java")
} }
} }
@@ -38,6 +38,21 @@ public class CollectionMapExpression {
assertThat(keyValueMap).doesNotContainValue(2); assertThat(keyValueMap).doesNotContainValue(2);
assertThat(keyValueMap).doesNotContainValue(2); assertThat(keyValueMap).doesNotContainValue(2);
assertThat(keyValueMap).containsEntry("foo", 2);
assertThat(keyValueMap).doesNotContainEntry("foo", 3);
assertThat(keyValueMap).doesNotContainKey("foo");
assertThat(keyValueMap).doesNotContainKey("foo");
assertThat(keyValueMap).containsKey("foo");
assertThat(keyValueMap).containsKey("foo");
Map<String, String> stringStringMap = new HashMap<>();
assertThat(stringStringMap).containsEntry("foo", "bar");
assertThat(stringStringMap).doesNotContainEntry("foo", "bar");
assertThat(stringStringMap).doesNotContainKey("foo");
assertThat(stringStringMap).doesNotContainKey("foo");
assertThat(stringStringMap).containsKey("foo");
assertThat(stringStringMap).containsKey("foo");
assertThat(stringList).as("foo").isNotEmpty().as("bar").isNotEmpty(); assertThat(stringList).as("foo").isNotEmpty().as("bar").isNotEmpty();
assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isTrue(); assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isTrue();
assertThat(stringList.isEmpty()).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse(); assertThat(stringList.isEmpty()).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse();
@@ -38,6 +38,21 @@ public class CollectionMapExpression {
assertThat(keyValueMap.containsValue(2)).isEqualTo(false); assertThat(keyValueMap.containsValue(2)).isEqualTo(false);
assertThat(keyValueMap.containsValue(2)).isFalse(); assertThat(keyValueMap.containsValue(2)).isFalse();
assertThat(keyValueMap.get("foo")).isEqualTo(2);
assertThat(keyValueMap.get("foo")).isNotEqualTo(3);
assertThat(keyValueMap.get("foo")).isEqualTo(null);
assertThat(keyValueMap.get("foo")).isNull();
assertThat(keyValueMap.get("foo")).isNotEqualTo(null);
assertThat(keyValueMap.get("foo")).isNotNull();
Map<String, String> stringStringMap = new HashMap<>();
assertThat(stringStringMap.get("foo")).isEqualTo("bar");
assertThat(stringStringMap.get("foo")).isNotEqualTo("bar");
assertThat(stringStringMap.get("foo")).isEqualTo(null);
assertThat(stringStringMap.get("foo")).isNull();
assertThat(stringStringMap.get("foo")).isNotEqualTo(null);
assertThat(stringStringMap.get("foo")).isNotNull();
assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isFalse(); assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isFalse();
assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isTrue(); assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isTrue();
assertThat(stringList.isEmpty()).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse(); assertThat(stringList.isEmpty()).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse();
@@ -1,4 +1,6 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.Assertions.fail;
@@ -12,6 +14,8 @@ public class Size {
long[] otherArray = new long[4]; long[] otherArray = new long[4];
String string = "string"; String string = "string";
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
Map<String, Integer> map = new HashMap<>();
Map<String, Integer> otherMap = new HashMap<>();
assertThat(list).isEmpty(); assertThat(list).isEmpty();
assertThat(list).isEmpty(); assertThat(list).isEmpty();
@@ -24,6 +28,7 @@ public class Size {
assertThat(list).hasSameSizeAs(array); assertThat(list).hasSameSizeAs(array);
assertThat(list).hasSize(string.length()); assertThat(list).hasSize(string.length());
assertThat(list).hasSize(stringBuilder.length()); assertThat(list).hasSize(stringBuilder.length());
assertThat(list).hasSameSizeAs(map);
assertThat(list).hasSize(1); assertThat(list).hasSize(1);
assertThat(list).hasSizeGreaterThan(otherList.size() * 2); assertThat(list).hasSizeGreaterThan(otherList.size() * 2);
assertThat(list).hasSizeGreaterThanOrEqualTo(otherList.size() * 2); assertThat(list).hasSizeGreaterThanOrEqualTo(otherList.size() * 2);
@@ -33,6 +38,7 @@ public class Size {
assertThat(list).hasSameSizeAs(array); assertThat(list).hasSameSizeAs(array);
assertThat(list).hasSize(string.length()); assertThat(list).hasSize(string.length());
assertThat(list).hasSize(stringBuilder.length()); assertThat(list).hasSize(stringBuilder.length());
assertThat(list).hasSameSizeAs(map);
assertThat(array).isEmpty(); assertThat(array).isEmpty();
assertThat(array).isEmpty(); assertThat(array).isEmpty();
@@ -45,6 +51,7 @@ public class Size {
assertThat(array).hasSameSizeAs(otherArray); assertThat(array).hasSameSizeAs(otherArray);
assertThat(array).hasSize(string.length()); assertThat(array).hasSize(string.length());
assertThat(array).hasSize(stringBuilder.length()); assertThat(array).hasSize(stringBuilder.length());
assertThat(array).hasSameSizeAs(map);
assertThat(array).hasSize(1); assertThat(array).hasSize(1);
assertThat(array).hasSizeGreaterThan(otherArray.length - 1); assertThat(array).hasSizeGreaterThan(otherArray.length - 1);
assertThat(array).hasSizeGreaterThanOrEqualTo(otherArray.length + 1); assertThat(array).hasSizeGreaterThanOrEqualTo(otherArray.length + 1);
@@ -54,6 +61,7 @@ public class Size {
assertThat(array).hasSameSizeAs(otherArray); assertThat(array).hasSameSizeAs(otherArray);
assertThat(array).hasSize(string.length()); assertThat(array).hasSize(string.length());
assertThat(array).hasSize(stringBuilder.length()); assertThat(array).hasSize(stringBuilder.length());
assertThat(array).hasSameSizeAs(map);
assertThat(string).isEmpty(); assertThat(string).isEmpty();
assertThat(string).isEmpty(); assertThat(string).isEmpty();
@@ -63,18 +71,20 @@ public class Size {
assertThat(string).isEmpty(); assertThat(string).isEmpty();
assertThat(string).isEmpty(); assertThat(string).isEmpty();
assertThat(string).hasSameSizeAs(list); assertThat(string).hasSameSizeAs(list);
assertThat(string).hasSameSizeAs(otherArray);
assertThat(string).hasSameSizeAs(string);
assertThat(string).hasSameSizeAs(stringBuilder);
assertThat(string).hasSize(1);
assertThat(string).hasSizeGreaterThan(otherArray.length - 1);
assertThat(string).hasSizeGreaterThanOrEqualTo(otherArray.length + 1);
assertThat(string).hasSizeLessThan(otherArray.length - 3);
assertThat(string).hasSizeLessThanOrEqualTo(1 - otherArray.length);
assertThat(string).hasSameSizeAs(otherList);
assertThat(string).hasSameSizeAs(array); assertThat(string).hasSameSizeAs(array);
assertThat(string).hasSameSizeAs(string); assertThat(string).hasSameSizeAs(string);
assertThat(string).hasSameSizeAs(stringBuilder); assertThat(string).hasSameSizeAs(stringBuilder);
assertThat(string).hasSameSizeAs(map);
assertThat(string).hasSize(1);
assertThat(string).hasSizeGreaterThan(array.length - 1);
assertThat(string).hasSizeGreaterThanOrEqualTo(array.length + 1);
assertThat(string).hasSizeLessThan(array.length - 3);
assertThat(string).hasSizeLessThanOrEqualTo(1 - array.length);
assertThat(string).hasSameSizeAs(list);
assertThat(string).hasSameSizeAs(array);
assertThat(string).hasSameSizeAs(string);
assertThat(string).hasSameSizeAs(stringBuilder);
assertThat(string).hasSameSizeAs(map);
assertThat(stringBuilder).isEmpty(); assertThat(stringBuilder).isEmpty();
assertThat(stringBuilder).isEmpty(); assertThat(stringBuilder).isEmpty();
@@ -84,18 +94,43 @@ public class Size {
assertThat(stringBuilder).isEmpty(); assertThat(stringBuilder).isEmpty();
assertThat(stringBuilder).isEmpty(); assertThat(stringBuilder).isEmpty();
assertThat(stringBuilder).hasSameSizeAs(list); assertThat(stringBuilder).hasSameSizeAs(list);
assertThat(stringBuilder).hasSameSizeAs(otherArray);
assertThat(stringBuilder).hasSameSizeAs(string);
assertThat(stringBuilder).hasSameSizeAs(stringBuilder);
assertThat(stringBuilder).hasSize(1);
assertThat(stringBuilder).hasSizeGreaterThan(otherArray.length - 1);
assertThat(stringBuilder).hasSizeGreaterThanOrEqualTo(otherArray.length + 1);
assertThat(stringBuilder).hasSizeLessThan(otherArray.length - 3);
assertThat(stringBuilder).hasSizeLessThanOrEqualTo(1 - otherArray.length);
assertThat(stringBuilder).hasSameSizeAs(otherList);
assertThat(stringBuilder).hasSameSizeAs(array); assertThat(stringBuilder).hasSameSizeAs(array);
assertThat(stringBuilder).hasSameSizeAs(string); assertThat(stringBuilder).hasSameSizeAs(string);
assertThat(stringBuilder).hasSameSizeAs(stringBuilder); assertThat(stringBuilder).hasSameSizeAs(stringBuilder);
assertThat(stringBuilder).hasSameSizeAs(map);
assertThat(stringBuilder).hasSize(1);
assertThat(stringBuilder).hasSizeGreaterThan(array.length - 1);
assertThat(stringBuilder).hasSizeGreaterThanOrEqualTo(array.length + 1);
assertThat(stringBuilder).hasSizeLessThan(array.length - 3);
assertThat(stringBuilder).hasSizeLessThanOrEqualTo(1 - array.length);
assertThat(stringBuilder).hasSameSizeAs(list);
assertThat(stringBuilder).hasSameSizeAs(array);
assertThat(stringBuilder).hasSameSizeAs(string);
assertThat(stringBuilder).hasSameSizeAs(stringBuilder);
assertThat(stringBuilder).hasSameSizeAs(map);
assertThat(map).isEmpty();
assertThat(map).isEmpty();
assertThat(map).isNotEmpty();
assertThat(map).as("hi").isNotEmpty();
assertThat(map).isNotEmpty();
assertThat(map).isEmpty();
assertThat(map).isEmpty();
assertThat(map).hasSameSizeAs(list);
assertThat(map).hasSameSizeAs(array);
assertThat(map).hasSize(string.length());
assertThat(map).hasSize(stringBuilder.length());
assertThat(map).hasSameSizeAs(otherMap);
assertThat(map).hasSize(1);
assertThat(map).hasSizeGreaterThan(array.length - 1);
assertThat(map).hasSizeGreaterThanOrEqualTo(array.length + 1);
assertThat(map).hasSizeLessThan(array.length - 3);
assertThat(map).hasSizeLessThanOrEqualTo(1 - array.length);
assertThat(map).hasSameSizeAs(list);
assertThat(map).hasSameSizeAs(array);
assertThat(map).hasSize(string.length());
assertThat(map).hasSize(stringBuilder.length());
assertThat(map).hasSameSizeAs(otherMap);
assertThat(stringBuilder.length()).as("foo").isEqualTo(0).isZero().as("bar").isNotZero().isEqualTo(10); assertThat(stringBuilder.length()).as("foo").isEqualTo(0).isZero().as("bar").isNotZero().isEqualTo(10);
@@ -1,4 +1,6 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.Assertions.fail;
@@ -12,6 +14,8 @@ public class Size {
long[] otherArray = new long[4]; long[] otherArray = new long[4];
String string = "string"; String string = "string";
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
Map<String, Integer> map = new HashMap<>();
Map<String, Integer> otherMap = new HashMap<>();
assertThat(list.size()).isEqualTo(0); assertThat(list.size()).isEqualTo(0);
assertThat(list.size()).isZero(); assertThat(list.size()).isZero();
@@ -24,6 +28,7 @@ public class Size {
assertThat(list.size()).isEqualTo(array.length); assertThat(list.size()).isEqualTo(array.length);
assertThat(list.size()).isEqualTo(string.length()); assertThat(list.size()).isEqualTo(string.length());
assertThat(list.size()).isEqualTo(stringBuilder.length()); assertThat(list.size()).isEqualTo(stringBuilder.length());
assertThat(list.size()).isEqualTo(map.size());
assertThat(list.size()).isEqualTo(1); assertThat(list.size()).isEqualTo(1);
assertThat(list.size()).isGreaterThan(otherList.size() * 2); assertThat(list.size()).isGreaterThan(otherList.size() * 2);
assertThat(list.size()).isGreaterThanOrEqualTo(otherList.size() * 2); assertThat(list.size()).isGreaterThanOrEqualTo(otherList.size() * 2);
@@ -33,6 +38,7 @@ public class Size {
assertThat(list).hasSize(array.length); assertThat(list).hasSize(array.length);
assertThat(list).hasSize(string.length()); assertThat(list).hasSize(string.length());
assertThat(list).hasSize(stringBuilder.length()); assertThat(list).hasSize(stringBuilder.length());
assertThat(list).hasSize(map.size());
assertThat(array.length).isEqualTo(0); assertThat(array.length).isEqualTo(0);
assertThat(array.length).isZero(); assertThat(array.length).isZero();
@@ -45,6 +51,7 @@ public class Size {
assertThat(array.length).isEqualTo(otherArray.length); assertThat(array.length).isEqualTo(otherArray.length);
assertThat(array.length).isEqualTo(string.length()); assertThat(array.length).isEqualTo(string.length());
assertThat(array.length).isEqualTo(stringBuilder.length()); assertThat(array.length).isEqualTo(stringBuilder.length());
assertThat(array.length).isEqualTo(map.size());
assertThat(array.length).isEqualTo(1); assertThat(array.length).isEqualTo(1);
assertThat(array.length).isGreaterThan(otherArray.length - 1); assertThat(array.length).isGreaterThan(otherArray.length - 1);
assertThat(array.length).isGreaterThanOrEqualTo(otherArray.length + 1); assertThat(array.length).isGreaterThanOrEqualTo(otherArray.length + 1);
@@ -54,6 +61,7 @@ public class Size {
assertThat(array).hasSize(otherArray.length); assertThat(array).hasSize(otherArray.length);
assertThat(array).hasSize(string.length()); assertThat(array).hasSize(string.length());
assertThat(array).hasSize(stringBuilder.length()); assertThat(array).hasSize(stringBuilder.length());
assertThat(array).hasSize(map.size());
assertThat(string.length()).isEqualTo(0); assertThat(string.length()).isEqualTo(0);
assertThat(string.length()).isZero(); assertThat(string.length()).isZero();
@@ -63,18 +71,20 @@ public class Size {
assertThat(string.length()).isLessThan(1); assertThat(string.length()).isLessThan(1);
assertThat(string.length()).isLessThanOrEqualTo(0); assertThat(string.length()).isLessThanOrEqualTo(0);
assertThat(string.length()).isEqualTo(list.size()); assertThat(string.length()).isEqualTo(list.size());
assertThat(string.length()).isEqualTo(otherArray.length); assertThat(string.length()).isEqualTo(array.length);
assertThat(string.length()).isEqualTo(string.length()); assertThat(string.length()).isEqualTo(string.length());
assertThat(string.length()).isEqualTo(stringBuilder.length()); assertThat(string.length()).isEqualTo(stringBuilder.length());
assertThat(string.length()).isEqualTo(map.size());
assertThat(string.length()).isEqualTo(1); assertThat(string.length()).isEqualTo(1);
assertThat(string.length()).isGreaterThan(otherArray.length - 1); assertThat(string.length()).isGreaterThan(array.length - 1);
assertThat(string.length()).isGreaterThanOrEqualTo(otherArray.length + 1); assertThat(string.length()).isGreaterThanOrEqualTo(array.length + 1);
assertThat(string.length()).isLessThan(otherArray.length - 3); assertThat(string.length()).isLessThan(array.length - 3);
assertThat(string.length()).isLessThanOrEqualTo(1 - otherArray.length); assertThat(string.length()).isLessThanOrEqualTo(1 - array.length);
assertThat(string).hasSize(otherList.size()); assertThat(string).hasSize(list.size());
assertThat(string).hasSize(array.length); assertThat(string).hasSize(array.length);
assertThat(string).hasSize(string.length()); assertThat(string).hasSize(string.length());
assertThat(string).hasSize(stringBuilder.length()); assertThat(string).hasSize(stringBuilder.length());
assertThat(string).hasSize(map.size());
assertThat(stringBuilder.length()).isEqualTo(0); assertThat(stringBuilder.length()).isEqualTo(0);
assertThat(stringBuilder.length()).isZero(); assertThat(stringBuilder.length()).isZero();
@@ -84,18 +94,43 @@ public class Size {
assertThat(stringBuilder.length()).isLessThan(1); assertThat(stringBuilder.length()).isLessThan(1);
assertThat(stringBuilder.length()).isLessThanOrEqualTo(0); assertThat(stringBuilder.length()).isLessThanOrEqualTo(0);
assertThat(stringBuilder.length()).isEqualTo(list.size()); assertThat(stringBuilder.length()).isEqualTo(list.size());
assertThat(stringBuilder.length()).isEqualTo(otherArray.length); assertThat(stringBuilder.length()).isEqualTo(array.length);
assertThat(stringBuilder.length()).isEqualTo(string.length()); assertThat(stringBuilder.length()).isEqualTo(string.length());
assertThat(stringBuilder.length()).isEqualTo(stringBuilder.length()); assertThat(stringBuilder.length()).isEqualTo(stringBuilder.length());
assertThat(stringBuilder.length()).isEqualTo(map.size());
assertThat(stringBuilder.length()).isEqualTo(1); assertThat(stringBuilder.length()).isEqualTo(1);
assertThat(stringBuilder.length()).isGreaterThan(otherArray.length - 1); assertThat(stringBuilder.length()).isGreaterThan(array.length - 1);
assertThat(stringBuilder.length()).isGreaterThanOrEqualTo(otherArray.length + 1); assertThat(stringBuilder.length()).isGreaterThanOrEqualTo(array.length + 1);
assertThat(stringBuilder.length()).isLessThan(otherArray.length - 3); assertThat(stringBuilder.length()).isLessThan(array.length - 3);
assertThat(stringBuilder.length()).isLessThanOrEqualTo(1 - otherArray.length); assertThat(stringBuilder.length()).isLessThanOrEqualTo(1 - array.length);
assertThat(stringBuilder).hasSize(otherList.size()); assertThat(stringBuilder).hasSize(list.size());
assertThat(stringBuilder).hasSize(array.length); assertThat(stringBuilder).hasSize(array.length);
assertThat(stringBuilder).hasSize(string.length()); assertThat(stringBuilder).hasSize(string.length());
assertThat(stringBuilder).hasSize(stringBuilder.length()); assertThat(stringBuilder).hasSize(stringBuilder.length());
assertThat(stringBuilder).hasSize(map.size());
assertThat(map.size()).isEqualTo(0);
assertThat(map.size()).isZero();
assertThat(map.size()).isNotZero();
assertThat(map.size()).as("hi").isGreaterThan(0);
assertThat(map.size()).isGreaterThanOrEqualTo(1);
assertThat(map.size()).isLessThan(1);
assertThat(map.size()).isLessThanOrEqualTo(0);
assertThat(map.size()).isEqualTo(list.size());
assertThat(map.size()).isEqualTo(array.length);
assertThat(map.size()).isEqualTo(string.length());
assertThat(map.size()).isEqualTo(stringBuilder.length());
assertThat(map.size()).isEqualTo(otherMap.size());
assertThat(map.size()).isEqualTo(1);
assertThat(map.size()).isGreaterThan(array.length - 1);
assertThat(map.size()).isGreaterThanOrEqualTo(array.length + 1);
assertThat(map.size()).isLessThan(array.length - 3);
assertThat(map.size()).isLessThanOrEqualTo(1 - array.length);
assertThat(map).hasSize(list.size());
assertThat(map).hasSize(array.length);
assertThat(map).hasSize(string.length());
assertThat(map).hasSize(stringBuilder.length());
assertThat(map).hasSize(otherMap.size());
assertThat(stringBuilder.length()).as("foo").isEqualTo(0).isZero().as("bar").isNotZero().isEqualTo(10); assertThat(stringBuilder.length()).as("foo").isEqualTo(0).isZero().as("bar").isNotZero().isEqualTo(10);