Compare commits

...
14 Commits
Author SHA1 Message Date
chrisly42 e3444db213 Fixes to AssertThatSize inspection after extending it for Maps in previous release as not all combinations for .hasSameSizeAs() are supported.
Bumped to IntelliJ IDEA 2019.2.3.
2019-09-24 22:55:02 +02:00
chrisly42 855fb03f7c One more option for AssertThatCollectionOrMap inspection for warnings without quickfix.
AssertThatGuavaOptional inspections will now avoid conversions from .get() to .contains() for array types (currently not correctly supported by AssertJ-Guava).
2019-09-24 22:16:11 +02:00
chrisly42 8d678411b5 Fix for AssertThatCollectionOrMap inspection sometimes causing an index out of bounds exception.
Added an settings option for AssertThatCollectionOrMap inspection respecting the degenerated case of maps with null values.
Upgrade to JUnit Jupiter 5.5.2.
2019-09-09 23:13:45 +02:00
chrisly42 341d1877df Prepared for 1.4 release. 2019-08-25 18:40:58 +02:00
chrisly42 05dc4905ca Extended AssertThatCollectionOrMap inspection for several assertThat(map.get()) cases as suggested by Stefan H. 2019-08-23 19:58:11 +02:00
chrisly42 315b93d90d Extended AssertThatSize inspection to Maps, too. 2019-08-23 18:21:08 +02:00
chrisly42 36f63d26d2 Minor fix for highlighting of JoinVarArgsContains inspection.
Upgraded to kotlin 1.3.50, intellij plugin 0.4.10, assertj 3.13.2, idea 2019.2.1
2019-08-23 18:04:07 +02:00
chrisly42 a4535afbbb Fixed references to wrong AssertJ version 13.2.0 instead of 3.12.0, courtesy of Bernhard R. 2019-08-04 18:29:59 +02:00
chrisly42 df11939589 New JoinVarArgsContains inspection that will detect multiple .contains(), .doesNotContain(), and .containsOnlyOnce() calls within the same statement that could be joined together using variadic arguments. 2019-08-03 20:57:34 +02:00
chrisly42 4420a0a392 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. 2019-07-30 20:02:40 +02:00
chrisly42 8fb3ecce95 Bumped kotlin to 1.3.41, jupiter 5.5.1, added compatibility with IDEA 2019.2 and fixed regressions with new AssertJ 3.13.0. 2019-07-30 19:43:40 +02:00
chrisly42 5048c898ec Fixed broken code in test classes (missing imports, undefined variables). 2019-07-30 19:39:16 +02:00
chrisly42 b84a781134 Reverted removed method (identical to default implementation) that causes compatibility problem with older IDEA versions (again, sigh)... 2019-06-23 19:24:36 +02:00
chrisly42 095345a456 The JoinAssertThatStatements inspection will now add line breaks on joining statements.
Unrelated: Upgraded Gradle to 5.4.1. Upgraded kotlin to 1.3.40. Upgraded jacoco to 0.8.4. Minor style change for immediate returns. Increased test/branch coverage.
2019-06-23 18:51:12 +02:00
79 changed files with 1202 additions and 332 deletions
+85 -10
View File
@@ -79,7 +79,8 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
``` ```
from: assertThat(expected).someCondition(); from: assertThat(expected).someCondition();
assertThat(expected).anotherCondition(); assertThat(expected).anotherCondition();
to: assertThat(expected).someCondition().anotherCondition(); to: assertThat(expected).someCondition()
.anotherCondition();
``` ```
Joining will work on actual expressions inside ```assertThat()``` that are equivalent expressions, Joining will work on actual expressions inside ```assertThat()``` that are equivalent expressions,
except for method calls with known side-effect methods such as ```Iterator.next()``` and except for method calls with known side-effect methods such as ```Iterator.next()``` and
@@ -88,6 +89,26 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
The comments of the statements will be preserved. When using ```extracting()``` or similar, The comments of the statements will be preserved. When using ```extracting()``` or similar,
the statements will not be merged. the statements will not be merged.
The behavior regarding the insertion of line breaks between the expressions can be configured in the
inspection settings.
- JoinVarArgsContains
Looks for ```.contains()```, ```.doesNotContain()```, and .```containsOnlyOnce()``` calls for iterables
within the same statement. The available quickfix can join the arguments to variadic version of the call
and remove the surplus one.
```
from: assertThat(expected).contains("foo").doesNotContain("bar").contains("etc").doesNotContain("huh");
to: assertThat(expected).contains("foo", "etc").doesNotContain("bar", "huh");
```
Will not be performed on more complex statements with ```.extracting()``` or ```.as()``` to avoid
changing semantics or losing descriptions.
Note that the quickfix does not handle comments very well and might remove them during the operation.
You may need to perform some manual reformatting, if the line gets too long after applying the fix.
- AssertThatObjectIsNullOrNotNull - AssertThatObjectIsNullOrNotNull
Uses ```isNull()``` and ```isNotNull()``` instead. Uses ```isNull()``` and ```isNotNull()``` instead.
@@ -211,6 +232,32 @@ 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);
```
The last transformation is the default, but may not be 100% equivalent depending whether the map
is a degenerated case with ```null``` values, where ```map.get(key)``` returns ```null```,
but ```containsKey(key)``` is ```true```.
For that special case (which usually is the result of a bad design decision!)
the quickfix should rather generate ```assertThat(map).containsEntry(key, null)```.
Therefore, the behavior can be configured in the settings for this inspection to either
create the default case (```doesNotContainKey```), the degenerated case (```containsEntry```),
choosing between both fixes (does not work well for batch processing), or ignore this edge case
altogether (just to be sure to not break any code).
- AssertThatEnumerableIsEmpty - AssertThatEnumerableIsEmpty
Uses ```isEmpty()``` for ```hasSize(0)``` iterable assertions instead. Uses ```isEmpty()``` for ```hasSize(0)``` iterable assertions instead.
@@ -222,7 +269,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.
``` ```
@@ -244,7 +291,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);
@@ -259,14 +306,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(map.size()).isEqualTo(anotherMap.size())
to: assertThat("string").hasSameSizeAs(collection); to: assertThat(map).hasSameSizeAs(anotherMap);
from: assertThat("string".length()).hasSize("strong".length()) from: assertThat("string".length()).hasSize("strong".length())
to: assertThat("string").hasSameSizeAs("strong"); to: assertThat("string").hasSameSizeAs("strong");
@@ -339,7 +386,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
to: assertThat(opt).isPresent(); to: assertThat(opt).isPresent();
from: assertThat(opt).isEqualTo(Optional.of("foo")); from: assertThat(opt).isEqualTo(Optional.of("foo"));
from: assertThat(opt).isEqualTo(Optional.ofNullable("foo")); from: assertThat(opt).isEqualTo(Optional.ofNullable("foo")); // only for constant "foo"
to: assertThat(opt).contains("foo"); to: assertThat(opt).contains("foo");
from: assertThat(opt).isEqualTo(Optional.empty()); from: assertThat(opt).isEqualTo(Optional.empty());
@@ -376,7 +423,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
to: assertThat(opt).isPresent(); to: assertThat(opt).isPresent();
from: assertThat(opt).isEqualTo(Optional.of("foo")); from: assertThat(opt).isEqualTo(Optional.of("foo"));
from: assertThat(opt).isEqualTo(Optional.fromNullable("foo")); from: assertThat(opt).isEqualTo(Optional.fromNullable("foo")); // only for constant "foo"
to: assertThat(opt).contains("foo"); to: assertThat(opt).contains("foo");
from: assertThat(opt).isEqualTo(Optional.absent()); from: assertThat(opt).isEqualTo(Optional.absent());
@@ -505,7 +552,8 @@ The IntelliJ framework actually uses the JUnit 3 TestCase for plugin testing and
Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for your projects (with attribution). Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for your projects (with attribution).
## Planned features ## Planned features
- Joining .contains() expressions - 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
@@ -516,6 +564,33 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
## Changelog ## Changelog
#### V1.5 (24-Sep-19)
- Fix for AssertThatCollectionOrMap inspection sometimes causing an index out of bounds exception.
- AssertThatGuavaOptional inspections will now avoid conversions from ```.get()``` to ```.contains()```
for array types (currently not correctly supported by ```contains()``` in AssertJ-Guava).
- Added an settings option for AssertThatCollectionOrMap inspection respecting the degenerated case of maps with ```null``` values.
It is now possible to change the behavior for ```map.get(key) == null```, so it can offer either ```.doesNotContainKey()``` (default)
or ```.containsEntry(key, null)```, or even both.
- Fixes to AssertThatSize inspection after extending it for Maps in previous release as not all
combinations for ```.hasSameSizeAs()``` are supported.
#### 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 Georgij G.
#### V1.3 (03-Aug-19)
- New JoinVarArgsContains inspection that will detect multiple ```.contains()```, ```.doesNotContain()```,
and ```.containsOnlyOnce()``` calls within the same statement that could be joined together using variadic arguments.
- AssertJ 3.13.0 broke some inspections due to new ```AbstractStringAssert::isEqualTo()``` method.
- 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.
#### V1.2 (23-Jun-19)
- Due to popular demand the JoinAssertThatStatements inspection will now add line breaks on joining statements.
The amount of statements joined without causing line breaks can be configured but defaults to 1 (always).
#### V1.1 (09-Jun-19) #### V1.1 (09-Jun-19)
- Improved JoinAssertThatStatements detection of expressions with side-effects and added pre/post-increment/decrement detection. - Improved JoinAssertThatStatements detection of expressions with side-effects and added pre/post-increment/decrement detection.
- Added Guava Optional ```opt.orNull() == null``` case. You know, I'm not making this stuff up, people actually write this kind of code. - Added Guava Optional ```opt.orNull() == null``` case. You know, I'm not making this stuff up, people actually write this kind of code.
@@ -574,7 +649,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)
+19 -18
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.31' id 'org.jetbrains.kotlin.jvm' version '1.3.50'
id 'jacoco' id 'jacoco'
id 'com.github.kt3k.coveralls' version '2.8.2' id 'com.github.kt3k.coveralls' version '2.8.4'
} }
group 'de.platon42' group 'de.platon42'
version '1.1' version '1.5'
repositories { repositories {
mavenCentral() mavenCentral()
@@ -20,10 +20,10 @@ repositories {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
testCompile "org.assertj:assertj-core:3.12.2" 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.0-RC1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.0-RC1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
testImplementation "org.jetbrains.kotlin:kotlin-test" testImplementation "org.jetbrains.kotlin:kotlin-test"
// testImplementation "org.jetbrains.kotlin:kotlin-test-junit" // testImplementation "org.jetbrains.kotlin:kotlin-test-junit"
} }
@@ -35,23 +35,24 @@ compileTestKotlin {
kotlinOptions.jvmTarget = "1.8" kotlinOptions.jvmTarget = "1.8"
} }
intellij { intellij {
version '2019.1.2' version '2019.2.3'
// pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)' // pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)'
updateSinceUntilBuild false updateSinceUntilBuild false
plugins = ['java']
} }
patchPluginXml { patchPluginXml {
changeNotes """ changeNotes """
<h4>V1.1 (09-Jun-19)</h4> <h4>V1.5 (24-Sep-19)</h4>
<ul> <ul>
<li>Improved JoinAssertThatStatements detection of expressions with side-effects and added pre/post-increment/decrement detection. <li>Fix for AssertThatCollectionOrMap inspection sometimes causing an index out of bounds exception.
<li>Added Guava Optional opt.orNull() == null case. You know, I'm not making this stuff up, people actually write this kind of code. <li>AssertThatGuavaOptional inspections will now avoid conversions from .get() to .contains()
<li>Added Java 8 Optional opt.orElse(null) == null case, too. for array types (currently not correctly supported by AssertJ-Guava).
<li>Extended JUnitAssertToAssertJ inspection to convert JUnit assume statements, too. <li>Added an settings option for AssertThatCollectionOrMap inspection respecting the degenerated case of maps with null values.
<li>Improved JUnitAssertToAssertJ quick fix to swap expected and actual expressions if the actual one is a constant. It is now possible to change the behavior for map.get(key) == null, so it can offer either .doesNotContainKey() (default)
<li>New ImplicitAssertion inspection for implicit isNotNull(), isNotEmpty() and isPresent() assertions that will be covered by chained assertions. or .containsEntry(key, null), or even both.
<li>Fix for multiple JUnit Conversions in batch mode with and without delta creating an exception. <li>Fixes to AssertThatSize inspection after extending it for Maps in previous release as not all
<li>Added new AssertThatObjectExpression inspection for toString() and hashCode() and moved equals() from AssertThatBinaryExpression there. combinations for .hasSameSizeAs() are supported.
</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>
""" """
@@ -65,7 +66,7 @@ test {
} }
jacoco { jacoco {
toolVersion = '0.8.3' toolVersion = '0.8.4'
} }
jacocoTestReport { jacocoTestReport {
+1 -1
View File
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
@@ -30,12 +30,20 @@ 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"
@NonNls @NonNls
const val ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractCharSequenceAssert" const val ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractCharSequenceAssert"
@NonNls @NonNls
const val ABSTRACT_MAP_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractMapAssert"
@NonNls
const val ABSTRACT_ITERABLE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractIterableAssert" const val ABSTRACT_ITERABLE_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractIterableAssert"
@NonNls @NonNls
const val ABSTRACT_OPTIONAL_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractOptionalAssert" const val ABSTRACT_OPTIONAL_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractOptionalAssert"
@@ -36,14 +36,18 @@ val MORE_EXTENSION_POINTS = CallMatcher.instanceCall(
"hasOnlyOneElementSatisfying", "anyMatch", "noneMatch", "anySatisfy", "noneSatisfy" "hasOnlyOneElementSatisfying", "anyMatch", "noneMatch", "anySatisfy", "noneSatisfy"
)!! )!!
val NOT_ACTUAL_ASSERTIONS = CallMatcher.anyOf( val COMPLEX_CALLS_THAT_MAKES_STUFF_TRICKY = CallMatcher.anyOf(
ALL_ASSERT_THAT_MATCHERS,
DESCRIBED_AS, DESCRIBED_AS,
WITH_REPRESENTATION_AND_SUCH, WITH_REPRESENTATION_AND_SUCH,
USING_COMPARATOR, USING_COMPARATOR,
IN_HEXADECIMAL_OR_BINARY IN_HEXADECIMAL_OR_BINARY
)!! )!!
val NOT_ACTUAL_ASSERTIONS = CallMatcher.anyOf(
ALL_ASSERT_THAT_MATCHERS,
COMPLEX_CALLS_THAT_MAKES_STUFF_TRICKY
)!!
val KNOWN_METHODS_WITH_SIDE_EFFECTS = CallMatcher.anyOf( val KNOWN_METHODS_WITH_SIDE_EFFECTS = CallMatcher.anyOf(
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_ITERATOR, "next") CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_ITERATOR, "next")
)!! )!!
@@ -106,7 +106,7 @@ fun PsiMethodCallExpression.getExpectedNullNonNullResult(): Boolean? {
if (isNull || isNotNull) { if (isNull || isNotNull) {
return isNotNull return isNotNull
} else { } else {
val isEqualTo = AbstractAssertJInspection.IS_EQUAL_TO_OBJECT.test(this) val isEqualTo = CallMatcher.anyOf(AbstractAssertJInspection.IS_EQUAL_TO_OBJECT, AbstractAssertJInspection.IS_EQUAL_TO_STRING).test(this)
val isNotEqualTo = AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT.test(this) val isNotEqualTo = AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT.test(this)
if ((isEqualTo || isNotEqualTo) && firstArg.type == PsiType.NULL) { if ((isEqualTo || isNotEqualTo) && firstArg.type == PsiType.NULL) {
return isNotEqualTo return isNotEqualTo
@@ -144,9 +144,7 @@ fun PsiExpression.getAllTheSameExpectedBooleanConstants(): Boolean? {
for (methodCall in methodsToView) { for (methodCall in methodsToView) {
val expectedResult = methodCall.getExpectedBooleanResult() val expectedResult = methodCall.getExpectedBooleanResult()
if (expectedResult != null) { if (expectedResult != null) {
if ((lockedResult != null) && (lockedResult != expectedResult)) { if ((lockedResult != null) && (lockedResult != expectedResult)) return null
return null
}
lockedResult = expectedResult lockedResult = expectedResult
} else { } else {
val isNotConstant = CallMatcher.anyOf( val isNotConstant = CallMatcher.anyOf(
@@ -157,9 +155,7 @@ fun PsiExpression.getAllTheSameExpectedBooleanConstants(): Boolean? {
AbstractAssertJInspection.IS_NOT_EQUAL_TO_BOOLEAN, AbstractAssertJInspection.IS_NOT_EQUAL_TO_BOOLEAN,
AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT
).test(methodCall) ).test(methodCall)
if (isNotConstant) { if (isNotConstant) return null
return null
}
} }
} }
return lockedResult return lockedResult
@@ -173,9 +169,7 @@ fun PsiExpression.getAllTheSameNullNotNullConstants(): Boolean? {
for (methodCall in methodsToView) { for (methodCall in methodsToView) {
val expectedResult = methodCall.getExpectedNullNonNullResult() val expectedResult = methodCall.getExpectedNullNonNullResult()
if (expectedResult != null) { if (expectedResult != null) {
if ((lockedResult != null) && (lockedResult != expectedResult)) { if ((lockedResult != null) && (lockedResult != expectedResult)) return null
return null
}
lockedResult = expectedResult lockedResult = expectedResult
} else { } else {
val isNotConstant = CallMatcher.anyOf( val isNotConstant = CallMatcher.anyOf(
@@ -184,9 +178,7 @@ fun PsiExpression.getAllTheSameNullNotNullConstants(): Boolean? {
AbstractAssertJInspection.IS_EQUAL_TO_OBJECT, AbstractAssertJInspection.IS_EQUAL_TO_OBJECT,
AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT AbstractAssertJInspection.IS_NOT_EQUAL_TO_OBJECT
).test(methodCall) ).test(methodCall)
if (isNotConstant) { if (isNotConstant) return null
return null
}
} }
} }
return lockedResult return lockedResult
@@ -86,6 +86,8 @@ class MethodNames {
@NonNls @NonNls
const val CONTAINS = "contains" const val CONTAINS = "contains"
@NonNls @NonNls
const val CONTAINS_ONLY_ONCE = "containsOnlyOnce"
@NonNls
const val DOES_NOT_CONTAIN = "doesNotContain" const val DOES_NOT_CONTAIN = "doesNotContain"
@NonNls @NonNls
const val CONTAINS_EXACTLY = "containsExactly" const val CONTAINS_EXACTLY = "containsExactly"
@@ -100,6 +102,10 @@ class MethodNames {
@NonNls @NonNls
const val DOES_NOT_CONTAIN_VALUE = "doesNotContainValue" const val DOES_NOT_CONTAIN_VALUE = "doesNotContainValue"
@NonNls @NonNls
const val CONTAINS_ENTRY = "containsEntry"
@NonNls
const val DOES_NOT_CONTAIN_ENTRY = "doesNotContainEntry"
@NonNls
const val IS_EQUAL_TO_IC = "isEqualToIgnoringCase" const val IS_EQUAL_TO_IC = "isEqualToIgnoringCase"
@NonNls @NonNls
const val IS_NOT_EQUAL_TO_IC = "isNotEqualToIgnoringCase" const val IS_NOT_EQUAL_TO_IC = "isNotEqualToIgnoringCase"
@@ -9,10 +9,13 @@ 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.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
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ENUMERABLE_ASSERT_INTERFACE import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ENUMERABLE_ASSERT_INTERFACE
@@ -81,13 +84,32 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
val IS_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_EQUAL_TO) val IS_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_EQUAL_TO)
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!! .parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
val IS_NOT_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ASSERT_INTERFACE, MethodNames.IS_NOT_EQUAL_TO) val IS_EQUAL_TO_STRING = CallMatcher.instanceCall(ABSTRACT_STRING_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!! .parameterTypes(CommonClassNames.JAVA_LANG_STRING)!!
val IS_EQUAL_TO_INT = CallMatcher.instanceCall(ABSTRACT_INTEGER_ASSERT_CLASSNAME, MethodNames.IS_EQUAL_TO)
.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)
@@ -103,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)
@@ -127,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")
@@ -205,6 +227,20 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
holder.registerProblem(expression, message, quickfix) holder.registerProblem(expression, message, quickfix)
} }
protected fun registerMoveOutMethod(
holder: ProblemsHolder,
expression: PsiMethodCallExpression,
oldActualExpression: PsiMethodCallExpression,
replacementMethod: String,
quickFixSupplier: (String) -> List<LocalQuickFix>
) {
val originalMethod = getOriginalMethodName(oldActualExpression) ?: return
val description = MOVE_ACTUAL_EXPRESSION_DESCRIPTION_TEMPLATE.format(originalMethod, replacementMethod)
val message = MOVING_OUT_MESSAGE_TEMPLATE.format(originalMethod)
val quickfixes = quickFixSupplier(description)
holder.registerProblem(expression, message, *quickfixes.toTypedArray())
}
protected fun registerReplaceMethod( protected fun registerReplaceMethod(
holder: ProblemsHolder, holder: ProblemsHolder,
expression: PsiMethodCallExpression, expression: PsiMethodCallExpression,
@@ -21,13 +21,9 @@ class AssertThatBinaryExpressionInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return
return
}
val expectedCallExpression = statement.findOutmostMethodCall() ?: return val expectedCallExpression = statement.findOutmostMethodCall() ?: return
val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return
@@ -39,9 +35,9 @@ class AssertThatBinaryExpressionInspection : AbstractAssertJInspection() {
val bothTypes = listOf(leftType, rightType) val bothTypes = listOf(leftType, rightType)
val (isLeftNull, isRightNull) = bothTypes.map(TypeConversionUtil::isNullType) val (isLeftNull, isRightNull) = bothTypes.map(TypeConversionUtil::isNullType)
if (isLeftNull && isRightNull) {
return if (isLeftNull && isRightNull) return
} else if (isLeftNull || isRightNull) { if (isLeftNull || isRightNull) {
val replacementMethod = expectedResult.map(MethodNames.IS_NULL, MethodNames.IS_NOT_NULL) val replacementMethod = expectedResult.map(MethodNames.IS_NULL, MethodNames.IS_NOT_NULL)
registerSplitMethod(holder, expectedCallExpression, replacementMethod) { desc, method -> registerSplitMethod(holder, expectedCallExpression, replacementMethod) { desc, method ->
SplitBinaryExpressionMethodCallQuickFix(desc, method, pickRightOperand = isLeftNull, noExpectedExpression = true) SplitBinaryExpressionMethodCallQuickFix(desc, method, pickRightOperand = isLeftNull, noExpectedExpression = true)
@@ -20,24 +20,17 @@ class AssertThatBooleanConditionInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val matchingCalls = listOf( val matchingCalls = listOf(
IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_BOOLEAN, IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_BOOLEAN,
IS_NOT_EQUAL_TO_OBJECT, IS_NOT_EQUAL_TO_BOOLEAN IS_NOT_EQUAL_TO_OBJECT, IS_NOT_EQUAL_TO_BOOLEAN
).map { it.test(expression) } ).map { it.test(expression) }
if (matchingCalls.none { it }) { if (matchingCalls.none { it }) return
return if (!checkAssertedType(expression, ABSTRACT_BOOLEAN_ASSERT_CLASSNAME)) return
}
if (!checkAssertedType(expression, ABSTRACT_BOOLEAN_ASSERT_CLASSNAME)) {
return
}
val expectedExpression = expression.firstArg val expectedExpression = expression.firstArg
if (!TypeConversionUtil.isBooleanType(expectedExpression.type)) { if (!TypeConversionUtil.isBooleanType(expectedExpression.type)) return
return
}
val expectedResult = expression.calculateConstantParameterValue(0) as? Boolean ?: return val expectedResult = expression.calculateConstantParameterValue(0) as? Boolean ?: return
val flippedBooleanTest = matchingCalls.drop(2).any { it } val flippedBooleanTest = matchingCalls.drop(2).any { it }
@@ -1,38 +1,65 @@
package de.platon42.intellij.plugins.cajon.inspections package de.platon42.intellij.plugins.cajon.inspections
import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.ProblemsHolder
import com.intellij.openapi.ui.ComboBox
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.util.ui.FormBuilder
import com.siyeh.ig.callMatcher.CallMatcher import com.siyeh.ig.callMatcher.CallMatcher
import de.platon42.intellij.plugins.cajon.* import de.platon42.intellij.plugins.cajon.*
import de.platon42.intellij.plugins.cajon.quickfixes.MoveOutMethodCallExpressionQuickFix import de.platon42.intellij.plugins.cajon.quickfixes.MoveOutMethodCallExpressionQuickFix
import java.awt.BorderLayout
import javax.swing.JComponent
import javax.swing.JPanel
class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection() { 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 const val DEFAULT_MAP_VALUES_NEVER_NULL = 2
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(
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, "isEmpty").parameterCount(0), CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, MethodNames.IS_EMPTY).parameterCount(0),
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, "isEmpty").parameterCount(0) CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, MethodNames.IS_EMPTY).parameterCount(0)
), ),
MethodNames.IS_EMPTY, MethodNames.IS_NOT_EMPTY MethodNames.IS_EMPTY, MethodNames.IS_NOT_EMPTY
), ),
Mapping( Mapping(
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, "contains").parameterCount(1), CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, MethodNames.CONTAINS).parameterCount(1),
MethodNames.CONTAINS, MethodNames.DOES_NOT_CONTAIN MethodNames.CONTAINS, MethodNames.DOES_NOT_CONTAIN
), ),
Mapping( Mapping(
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, "containsAll").parameterCount(1), CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_COLLECTION, MethodNames.CONTAINS_ALL).parameterCount(1),
MethodNames.CONTAINS_ALL, null MethodNames.CONTAINS_ALL, null
), ),
Mapping( Mapping(
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, "containsKey").parameterCount(1), CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, MethodNames.CONTAINS_KEY).parameterCount(1),
MethodNames.CONTAINS_KEY, MethodNames.DOES_NOT_CONTAIN_KEY MethodNames.CONTAINS_KEY, MethodNames.DOES_NOT_CONTAIN_KEY
), ),
Mapping( Mapping(
CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, "containsValue").parameterCount(1), CallMatcher.instanceCall(CommonClassNames.JAVA_UTIL_MAP, MethodNames.CONTAINS_VALUE).parameterCount(1),
MethodNames.CONTAINS_VALUE, MethodNames.DOES_NOT_CONTAIN_VALUE MethodNames.CONTAINS_VALUE, MethodNames.DOES_NOT_CONTAIN_VALUE
) )
) )
@@ -40,21 +67,78 @@ class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection(
override fun getDisplayName() = DISPLAY_NAME override fun getDisplayName() = DISPLAY_NAME
@JvmField
var behaviorForMapValueEqualsNull: Int = DEFAULT_MAP_VALUES_NEVER_NULL
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) {
return val assertThatArgument = staticMethodCall.getArgOrNull(0) as? PsiMethodCallExpression ?: return
val expectedCallExpression = statement.findOutmostMethodCall() ?: return
if (MAP_GET_MATCHER.test(assertThatArgument)) {
val nullOrNotNull = expectedCallExpression.getAllTheSameNullNotNullConstants()
if (nullOrNotNull == true) {
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.CONTAINS_KEY) { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, useNullNonNull = true)
} }
val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return } else if (nullOrNotNull == false) {
when (behaviorForMapValueEqualsNull) {
1 -> // warning only
registerMoveOutMethod(
holder,
expectedCallExpression,
assertThatArgument,
""
) { _ -> emptyList() }
2 -> // as doesNotContainKey(key)
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.DOES_NOT_CONTAIN_KEY) { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, useNullNonNull = true)
}
3 -> // as containsEntry(key, null)
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.CONTAINS_ENTRY) { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, keepExpectedAsSecondArgument = true, useNullNonNull = true)
}
4 -> // both
registerMoveOutMethod(
holder,
expectedCallExpression,
assertThatArgument,
MethodNames.DOES_NOT_CONTAIN_KEY + "/" + MethodNames.CONTAINS_ENTRY
) { desc ->
listOf(
MoveOutMethodCallExpressionQuickFix(
"Remove get() of actual expression and use assertThat().doesNotContainKey() instead (regular map)",
MethodNames.DOES_NOT_CONTAIN_KEY,
useNullNonNull = true
),
MoveOutMethodCallExpressionQuickFix(
"Remove get() of actual expression and use assertThat().containsEntry(key, null) instead (degenerated map)",
MethodNames.CONTAINS_ENTRY,
keepExpectedAsSecondArgument = true,
useNullNonNull = true
)
)
}
}
} else {
if (ANY_IS_EQUAL_TO_MATCHER.test(expectedCallExpression)) {
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.CONTAINS_ENTRY) { desc, method ->
MoveOutMethodCallExpressionQuickFix(desc, method, keepExpectedAsSecondArgument = true)
}
} else if (ANY_IS_NOT_EQUAL_TO_MATCHER.test(expectedCallExpression)) {
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.DOES_NOT_CONTAIN_ENTRY) { 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
@@ -64,6 +148,21 @@ class AssertThatCollectionOrMapExpressionInspection : AbstractAssertJInspection(
} }
} }
} }
}
override fun createOptionsPanel(): JComponent {
val comboBox = ComboBox(
arrayOf("ignore", "warning only, no fixes", "as doesNotContainKey(key)", "as containsEntry(key, null)", "both choices")
)
comboBox.selectedIndex = behaviorForMapValueEqualsNull
comboBox.addActionListener { behaviorForMapValueEqualsNull = comboBox.selectedIndex }
val panel = JPanel(BorderLayout())
panel.add(
FormBuilder.createFormBuilder().addLabeledComponent("Fix get() on maps expecting null values:", comboBox).panel,
BorderLayout.NORTH
)
return panel
}
private class Mapping( private class Mapping(
val callMatcher: CallMatcher, val callMatcher: CallMatcher,
@@ -21,13 +21,9 @@ class AssertThatEnumerableIsEmptyInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val isLastExpression = expression.parent is PsiStatement val isLastExpression = expression.parent is PsiStatement
if (!(HAS_SIZE.test(expression) && isLastExpression)) { if (!(HAS_SIZE.test(expression) && isLastExpression)) return
return
}
val value = expression.calculateConstantParameterValue(0) ?: return val value = expression.calculateConstantParameterValue(0) ?: return
if (value == 0) { if (value == 0) {
@@ -21,20 +21,17 @@ class AssertThatGuavaOptionalInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!checkPreconditions(staticMethodCall)) { if (!checkPreconditions(staticMethodCall)) return
return
}
val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
val outmostMethodCall = statement.findOutmostMethodCall() ?: return val outmostMethodCall = statement.findOutmostMethodCall() ?: return
if (GUAVA_OPTIONAL_GET.test(actualExpression)) { if (GUAVA_OPTIONAL_GET.test(actualExpression)) {
if (actualExpression.resolveMethod()?.returnType is PsiArrayType) return
val expectedCallExpression = staticMethodCall.gatherAssertionCalls().singleOrNull() ?: return val expectedCallExpression = staticMethodCall.gatherAssertionCalls().singleOrNull() ?: return
if (IS_EQUAL_TO_OBJECT.test(expectedCallExpression)) { if (CallMatcher.anyOf(IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_STRING).test(expectedCallExpression)) {
registerMoveOutMethod(holder, outmostMethodCall, actualExpression, MethodNames.CONTAINS) { desc, method -> registerMoveOutMethod(holder, outmostMethodCall, actualExpression, MethodNames.CONTAINS) { desc, method ->
QuickFixWithPostfixDelegate( QuickFixWithPostfixDelegate(
RemoveActualOutmostMethodCallQuickFix(desc, method), RemoveActualOutmostMethodCallQuickFix(desc, method),
@@ -65,18 +62,18 @@ class AssertThatGuavaOptionalInspection : AbstractAssertJInspection() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val staticMethodCall = expression.findStaticMethodCall() ?: return val staticMethodCall = expression.findStaticMethodCall() ?: return
if (!checkPreconditions(staticMethodCall)) { if (!checkPreconditions(staticMethodCall)) return
return
}
// We're not calling an assertThat() from Guava, but a core-AssertJ one! // We're not calling an assertThat() from Guava, but a core-AssertJ one!
// We need to replace that by the Guava one, if we want to apply a formally correct fix. // We need to replace that by the Guava one, if we want to apply a formally correct fix.
if (IS_EQUAL_TO_OBJECT.test(expression)) { if (IS_EQUAL_TO_OBJECT.test(expression)) {
val innerExpectedCall = expression.firstArg as? PsiMethodCallExpression ?: return val innerExpectedCall = expression.firstArg as? PsiMethodCallExpression ?: return
if (CallMatcher.anyOf(GUAVA_OPTIONAL_OF, GUAVA_OPTIONAL_FROM_NULLABLE).test(innerExpectedCall)) { if (CallMatcher.anyOf(GUAVA_OPTIONAL_OF, GUAVA_OPTIONAL_FROM_NULLABLE).test(innerExpectedCall)) {
if (GUAVA_OPTIONAL_FROM_NULLABLE.test(innerExpectedCall)) {
innerExpectedCall.firstArg.calculateConstantValue() ?: return
}
registerRemoveExpectedOutmostMethod(holder, expression, expression, MethodNames.CONTAINS) { desc, method -> registerRemoveExpectedOutmostMethod(holder, expression, expression, MethodNames.CONTAINS) { desc, method ->
QuickFixWithPostfixDelegate( QuickFixWithPostfixDelegate(
UnwrapExpectedStaticMethodCallQuickFix(desc, method), UnwrapExpectedStaticMethodCallQuickFix(desc, method),
@@ -20,13 +20,9 @@ class AssertThatInstanceOfInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return
return
}
val expectedCallExpression = statement.findOutmostMethodCall() ?: return val expectedCallExpression = statement.findOutmostMethodCall() ?: return
val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return val expectedResult = expectedCallExpression.getAllTheSameExpectedBooleanConstants() ?: return
@@ -18,13 +18,9 @@ class AssertThatInvertedBooleanConditionInspection : AbstractAssertJInspection()
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val staticMethodCall = expression.findStaticMethodCall() ?: return val staticMethodCall = expression.findStaticMethodCall() ?: return
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return
return
}
expression.getExpectedBooleanResult() ?: return expression.getExpectedBooleanResult() ?: return
val prefixExpression = staticMethodCall.firstArg as? PsiPrefixExpression ?: return val prefixExpression = staticMethodCall.firstArg as? PsiPrefixExpression ?: return
@@ -20,19 +20,15 @@ class AssertThatJava8OptionalInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_ANY.test(staticMethodCall)) { if (!ASSERT_THAT_ANY.test(staticMethodCall)) return
return
}
val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
val actualExpression = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
val outmostMethodCall = statement.findOutmostMethodCall() ?: return val outmostMethodCall = statement.findOutmostMethodCall() ?: return
if (OPTIONAL_GET.test(actualExpression)) { if (OPTIONAL_GET.test(actualExpression)) {
val expectedCallExpression = staticMethodCall.gatherAssertionCalls().singleOrNull() ?: return val expectedCallExpression = staticMethodCall.gatherAssertionCalls().singleOrNull() ?: return
if (IS_EQUAL_TO_OBJECT.test(expectedCallExpression)) { if (CallMatcher.anyOf(IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_STRING).test(expectedCallExpression)) {
registerMoveOutMethod(holder, outmostMethodCall, actualExpression, MethodNames.CONTAINS) { desc, method -> registerMoveOutMethod(holder, outmostMethodCall, actualExpression, MethodNames.CONTAINS) { desc, method ->
RemoveActualOutmostMethodCallQuickFix(desc, method) RemoveActualOutmostMethodCallQuickFix(desc, method)
} }
@@ -58,16 +54,15 @@ class AssertThatJava8OptionalInspection : AbstractAssertJInspection() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val staticMethodCall = expression.findStaticMethodCall() ?: return val staticMethodCall = expression.findStaticMethodCall() ?: return
if (!ASSERT_THAT_JAVA8_OPTIONAL.test(staticMethodCall)) { if (!ASSERT_THAT_JAVA8_OPTIONAL.test(staticMethodCall)) return
return
}
if (IS_EQUAL_TO_OBJECT.test(expression)) { if (IS_EQUAL_TO_OBJECT.test(expression)) {
val innerExpectedCall = expression.firstArg as? PsiMethodCallExpression ?: return val innerExpectedCall = expression.firstArg as? PsiMethodCallExpression ?: return
if (CallMatcher.anyOf(OPTIONAL_OF, OPTIONAL_OF_NULLABLE).test(innerExpectedCall)) { if (CallMatcher.anyOf(OPTIONAL_OF, OPTIONAL_OF_NULLABLE).test(innerExpectedCall)) {
if (OPTIONAL_OF_NULLABLE.test(innerExpectedCall)) {
innerExpectedCall.firstArg.calculateConstantValue() ?: return
}
registerRemoveExpectedOutmostMethod(holder, expression, expression, MethodNames.CONTAINS, ::UnwrapExpectedStaticMethodCallQuickFix) registerRemoveExpectedOutmostMethod(holder, expression, expression, MethodNames.CONTAINS, ::UnwrapExpectedStaticMethodCallQuickFix)
} else if (OPTIONAL_EMPTY.test(innerExpectedCall)) { } else if (OPTIONAL_EMPTY.test(innerExpectedCall)) {
registerSimplifyMethod(holder, expression, MethodNames.IS_NOT_PRESENT) registerSimplifyMethod(holder, expression, MethodNames.IS_NOT_PRESENT)
@@ -24,9 +24,7 @@ class AssertThatObjectExpressionInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
@@ -40,7 +38,7 @@ class AssertThatObjectExpressionInspection : AbstractAssertJInspection() {
} }
} }
OBJECT_TO_STRING.test(assertThatArgument) -> { OBJECT_TO_STRING.test(assertThatArgument) -> {
staticMethodCall.findFluentCallTo(IS_EQUAL_TO_OBJECT) ?: return staticMethodCall.findFluentCallTo(IS_EQUAL_TO_OBJECT) ?: staticMethodCall.findFluentCallTo(IS_EQUAL_TO_STRING) ?: return
registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.HAS_TO_STRING) { desc, method -> registerMoveOutMethod(holder, expectedCallExpression, assertThatArgument, MethodNames.HAS_TO_STRING) { desc, method ->
RemoveActualOutmostMethodCallQuickFix(desc, method) RemoveActualOutmostMethodCallQuickFix(desc, method)
} }
@@ -2,6 +2,7 @@ package de.platon42.intellij.plugins.cajon.inspections
import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.ProblemsHolder
import com.intellij.psi.* import com.intellij.psi.*
import com.siyeh.ig.callMatcher.CallMatcher
import de.platon42.intellij.plugins.cajon.MethodNames import de.platon42.intellij.plugins.cajon.MethodNames
import de.platon42.intellij.plugins.cajon.firstArg import de.platon42.intellij.plugins.cajon.firstArg
import de.platon42.intellij.plugins.cajon.hasAssertThat import de.platon42.intellij.plugins.cajon.hasAssertThat
@@ -19,15 +20,11 @@ class AssertThatObjectIsNullOrNotNullInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val isNotEqualTo = IS_NOT_EQUAL_TO_OBJECT.test(expression) val isNotEqualTo = IS_NOT_EQUAL_TO_OBJECT.test(expression)
val isEqualTo = IS_EQUAL_TO_OBJECT.test(expression) val isEqualTo = CallMatcher.anyOf(IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_STRING).test(expression)
val isLastExpression = expression.parent is PsiStatement val isLastExpression = expression.parent is PsiStatement
if (!((isEqualTo && isLastExpression) || isNotEqualTo)) { if (!((isEqualTo && isLastExpression) || isNotEqualTo)) return
return
}
if (expression.firstArg.type == PsiType.NULL) { if (expression.firstArg.type == PsiType.NULL) {
registerSimplifyMethod(holder, expression, isEqualTo.map(MethodNames.IS_NULL, MethodNames.IS_NOT_NULL)) registerSimplifyMethod(holder, expression, isEqualTo.map(MethodNames.IS_NULL, MethodNames.IS_NOT_NULL))
@@ -5,13 +5,14 @@ import com.intellij.psi.*
import de.platon42.intellij.plugins.cajon.* import de.platon42.intellij.plugins.cajon.*
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_ITERABLE_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_ITERABLE_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_MAP_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceHasSizeMethodCallQuickFix import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceHasSizeMethodCallQuickFix
import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceSizeMethodCallQuickFix import de.platon42.intellij.plugins.cajon.quickfixes.ReplaceSizeMethodCallQuickFix
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 +27,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, isForArrayOrCollection: Boolean, isForMap: 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 +43,11 @@ 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 equalsArrayOrCollectionSize = isArrayLength(equalToExpression) ||
isForString && (isCollectionSize(equalToExpression) || isArrayLength(equalToExpression) || isCharSequenceLength(equalToExpression)) isCollectionSize(equalToExpression)
if ((isForArrayOrCollection && equalsArrayOrCollectionSize)
|| (isForMap && (equalsArrayOrCollectionSize || isMapSize(equalToExpression)))
|| (isForString && (equalsArrayOrCollectionSize || isCharSequenceLength(equalToExpression)))
) { ) {
Match(expression, MethodNames.HAS_SAME_SIZE_AS, expectedIsCollection = true) Match(expression, MethodNames.HAS_SAME_SIZE_AS, expectedIsCollection = true)
} else { } else {
@@ -59,7 +65,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)
} }
@@ -74,21 +80,18 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_INT.test(staticMethodCall)) { if (!ASSERT_THAT_INT.test(staticMethodCall)) return
return
}
val actualExpression = staticMethodCall.firstArg val actualExpression = staticMethodCall.firstArg
val isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression) val isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression)
val isForMap = isMapSize(actualExpression)
val isForString = isCharSequenceLength(actualExpression) val isForString = isCharSequenceLength(actualExpression)
if (!(isForArrayOrCollection || isForString)) { if (!(isForArrayOrCollection || isForMap || isForString)) return
return
}
val matches = staticMethodCall.collectMethodCallsUpToStatement() val matches = staticMethodCall.collectMethodCallsUpToStatement()
.mapNotNull { getMatch(it, isForArrayOrCollection, isForString) } .mapNotNull { getMatch(it, isForArrayOrCollection, isForMap, isForString) }
.toList() .toList()
if (matches.isNotEmpty()) { if (matches.isNotEmpty()) {
if (matches.size == 1) { if (matches.size == 1) {
@@ -112,21 +115,18 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return 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 isForArrayOrCollection = isArrayLength(actualExpression) || isCollectionSize(actualExpression)
val isForMap = isMapSize(actualExpression)
val isForString = isCharSequenceLength(actualExpression) val isForString = isCharSequenceLength(actualExpression)
if (!(isForArrayOrCollection if (!(isForArrayOrCollection
|| (isForMap && checkAssertedType(expression, ABSTRACT_MAP_ASSERT_CLASSNAME))
|| (isForString && checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME))) || (isForString && checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME)))
) { ) return
return
}
registerConciseMethod( registerConciseMethod(
REMOVE_SIZE_DESCRIPTION_TEMPLATE, REMOVE_SIZE_DESCRIPTION_TEMPLATE,
holder, holder,
@@ -48,13 +48,10 @@ class AssertThatStringExpressionInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitExpressionStatement(statement) super.visitExpressionStatement(statement)
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return
return
}
val staticMethodCall = statement.findStaticMethodCall() ?: return val staticMethodCall = statement.findStaticMethodCall() ?: return
if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) { if (!ASSERT_THAT_BOOLEAN.test(staticMethodCall)) return
return
}
val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return val assertThatArgument = staticMethodCall.firstArg as? PsiMethodCallExpression ?: return
val mapping = MAPPINGS.firstOrNull { it.callMatcher.test(assertThatArgument) } ?: return val mapping = MAPPINGS.firstOrNull { it.callMatcher.test(assertThatArgument) } ?: return
@@ -5,6 +5,7 @@ import com.intellij.psi.JavaElementVisitor
import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.PsiMethodCallExpression
import com.intellij.psi.PsiStatement import com.intellij.psi.PsiStatement
import com.siyeh.ig.callMatcher.CallMatcher
import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME import de.platon42.intellij.plugins.cajon.AssertJClassNames.Companion.ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME
import de.platon42.intellij.plugins.cajon.MethodNames import de.platon42.intellij.plugins.cajon.MethodNames
import de.platon42.intellij.plugins.cajon.calculateConstantParameterValue import de.platon42.intellij.plugins.cajon.calculateConstantParameterValue
@@ -22,19 +23,13 @@ class AssertThatStringIsEmptyInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return val isEqual = CallMatcher.anyOf(IS_EQUAL_TO_OBJECT, IS_EQUAL_TO_STRING).test(expression)
}
val isEqual = IS_EQUAL_TO_OBJECT.test(expression)
val hasSize = HAS_SIZE.test(expression) val hasSize = HAS_SIZE.test(expression)
val isLastExpression = expression.parent is PsiStatement val isLastExpression = expression.parent is PsiStatement
if (!((isEqual || hasSize) && isLastExpression)) { if (!((isEqual || hasSize) && isLastExpression)) return
return
}
if (!checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME)) { if (!checkAssertedType(expression, ABSTRACT_CHAR_SEQUENCE_ASSERT_CLASSNAME)) return
return
}
val value = expression.calculateConstantParameterValue(0) ?: return val value = expression.calculateConstantParameterValue(0) ?: return
if ((isEqual && (value == "")) || (hasSize && (value == 0))) { if ((isEqual && (value == "")) || (hasSize && (value == 0))) {
@@ -54,9 +54,7 @@ class AssumeThatInsteadOfReturnInspection : AbstractAssertJInspection() {
super.visitMethod(method) super.visitMethod(method)
// Note: replace with if(TEST_ANNOTATIONS.none(method::hasAnnotation)) for IDEA >= 2018.2 // Note: replace with if(TEST_ANNOTATIONS.none(method::hasAnnotation)) for IDEA >= 2018.2
val annotations = method.annotations.mapNotNull { it.qualifiedName } val annotations = method.annotations.mapNotNull { it.qualifiedName }
if (annotations.none(TEST_ANNOTATIONS::contains)) { if (annotations.none(TEST_ANNOTATIONS::contains)) return
return
}
val containingClass = method.containingClass ?: return val containingClass = method.containingClass ?: return
val visitor: PsiElementVisitor = TestMethodVisitor(holder, isOnTheFly, containingClass) val visitor: PsiElementVisitor = TestMethodVisitor(holder, isOnTheFly, containingClass)
method.accept(visitor) method.accept(visitor)
@@ -119,9 +117,7 @@ class AssumeThatInsteadOfReturnInspection : AbstractAssertJInspection() {
var aborted = false var aborted = false
override fun visitExpressionStatement(statement: PsiExpressionStatement) { override fun visitExpressionStatement(statement: PsiExpressionStatement) {
if (foundAssertThat || aborted) { if (foundAssertThat || aborted) return
return
}
if (++statementCount > MAX_STATEMENTS_COUNT) { if (++statementCount > MAX_STATEMENTS_COUNT) {
aborted = true aborted = true
return return
@@ -29,7 +29,7 @@ class ImplicitAssertionInspection : AbstractAssertJInspection() {
private val OBJECT_ENUMERABLE_ANY_CONTENT_ASSERTIONS = CallMatcher.instanceCall( private val OBJECT_ENUMERABLE_ANY_CONTENT_ASSERTIONS = CallMatcher.instanceCall(
AssertJClassNames.OBJECT_ENUMERABLE_ASSERT_INTERFACE, AssertJClassNames.OBJECT_ENUMERABLE_ASSERT_INTERFACE,
MethodNames.CONTAINS, "containsOnly", "containsOnlyNulls", "containsOnlyOnce", MethodNames.CONTAINS, "containsOnly", "containsOnlyNulls", MethodNames.CONTAINS_ONLY_ONCE,
"containsExactly", "containsExactlyInAnyOrder", "containsExactlyInAnyOrderElementsOf", "containsExactly", "containsExactlyInAnyOrder", "containsExactlyInAnyOrderElementsOf",
"containsAll", "containsAnyOf", "containsAll", "containsAnyOf",
"containsAnyElementsOf", "containsExactlyElementsOf", "containsOnlyElementsOf", "containsAnyElementsOf", "containsExactlyElementsOf", "containsOnlyElementsOf",
@@ -113,9 +113,8 @@ class ImplicitAssertionInspection : AbstractAssertJInspection() {
return object : JavaElementVisitor() { return object : JavaElementVisitor() {
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) { override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
super.visitMethodCallExpression(expression) super.visitMethodCallExpression(expression)
if (!expression.hasAssertThat()) { if (!expression.hasAssertThat()) return
return
}
val mapping = MAPPINGS.firstOrNull { it.first.test(expression) } ?: return val mapping = MAPPINGS.firstOrNull { it.first.test(expression) } ?: return
val followupExpression = expression.findFluentCallTo(mapping.second) ?: return val followupExpression = expression.findFluentCallTo(mapping.second) ?: return
val redundantName = getOriginalMethodName(expression) ?: return val redundantName = getOriginalMethodName(expression) ?: return
@@ -2,19 +2,25 @@ package de.platon42.intellij.plugins.cajon.inspections
import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.ProblemsHolder
import com.intellij.codeInspection.ui.SingleIntegerFieldOptionsPanel
import com.intellij.psi.* import com.intellij.psi.*
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import com.siyeh.ig.psiutils.EquivalenceChecker import com.siyeh.ig.psiutils.EquivalenceChecker
import de.platon42.intellij.plugins.cajon.* import de.platon42.intellij.plugins.cajon.*
import de.platon42.intellij.plugins.cajon.quickfixes.JoinStatementsQuickFix import de.platon42.intellij.plugins.cajon.quickfixes.JoinStatementsQuickFix
import javax.swing.JComponent
class JoinAssertThatStatementsInspection : AbstractAssertJInspection() { class JoinAssertThatStatementsInspection : AbstractAssertJInspection() {
companion object { companion object {
private const val DISPLAY_NAME = "Join multiple assertThat() statements with same actual expression" private const val DISPLAY_NAME = "Join multiple assertThat() statements with same actual expression"
private const val CAN_BE_JOINED_DESCRIPTION = "Multiple assertThat() statements can be joined together" private const val CAN_BE_JOINED_DESCRIPTION = "Multiple assertThat() statements can be joined together"
private const val DEFAULT_SEPARATE_LINE_LIMIT = 1
} }
@JvmField
var separateLineLimit: Int = DEFAULT_SEPARATE_LINE_LIMIT
override fun getDisplayName() = DISPLAY_NAME override fun getDisplayName() = DISPLAY_NAME
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
@@ -63,9 +69,8 @@ class JoinAssertThatStatementsInspection : AbstractAssertJInspection() {
private fun isLegitAssertThatCall(statement: PsiStatement?): PsiMethodCallExpression? { private fun isLegitAssertThatCall(statement: PsiStatement?): PsiMethodCallExpression? {
if ((statement is PsiExpressionStatement) && (statement.expression is PsiMethodCallExpression)) { if ((statement is PsiExpressionStatement) && (statement.expression is PsiMethodCallExpression)) {
if (!statement.hasAssertThat()) { if (!statement.hasAssertThat()) return null
return null
}
val assertThatCall = PsiTreeUtil.findChildrenOfType(statement, PsiMethodCallExpression::class.java).find { ALL_ASSERT_THAT_MATCHERS.test(it) } val assertThatCall = PsiTreeUtil.findChildrenOfType(statement, PsiMethodCallExpression::class.java).find { ALL_ASSERT_THAT_MATCHERS.test(it) }
return assertThatCall?.takeIf { it.findFluentCallTo(EXTRACTING_CALL_MATCHERS) == null } return assertThatCall?.takeIf { it.findFluentCallTo(EXTRACTING_CALL_MATCHERS) == null }
} }
@@ -93,6 +98,10 @@ class JoinAssertThatStatementsInspection : AbstractAssertJInspection() {
} }
} }
override fun createOptionsPanel(): JComponent {
return SingleIntegerFieldOptionsPanel("Limit for joins before adding line breaks:", this, "separateLineLimit")
}
private fun registerProblem(holder: ProblemsHolder, isOnTheFly: Boolean, firstStatement: PsiStatement, lastStatement: PsiStatement) { private fun registerProblem(holder: ProblemsHolder, isOnTheFly: Boolean, firstStatement: PsiStatement, lastStatement: PsiStatement) {
val problemDescriptor = holder.manager.createProblemDescriptor( val problemDescriptor = holder.manager.createProblemDescriptor(
firstStatement, firstStatement,
@@ -100,7 +109,7 @@ class JoinAssertThatStatementsInspection : AbstractAssertJInspection() {
CAN_BE_JOINED_DESCRIPTION, CAN_BE_JOINED_DESCRIPTION,
ProblemHighlightType.GENERIC_ERROR_OR_WARNING, ProblemHighlightType.GENERIC_ERROR_OR_WARNING,
isOnTheFly, isOnTheFly,
JoinStatementsQuickFix() JoinStatementsQuickFix(separateLineLimit)
) )
holder.registerProblem(problemDescriptor) holder.registerProblem(problemDescriptor)
} }
@@ -0,0 +1,53 @@
package de.platon42.intellij.plugins.cajon.inspections
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.openapi.util.TextRange
import com.intellij.psi.JavaElementVisitor
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiExpressionStatement
import com.intellij.psi.PsiMethodCallExpression
import com.intellij.psi.util.PsiTreeUtil
import com.siyeh.ig.callMatcher.CallMatcher
import de.platon42.intellij.plugins.cajon.*
import de.platon42.intellij.plugins.cajon.quickfixes.JoinVarArgsContainsQuickFix
class JoinVarArgsContainsInspection : AbstractAssertJInspection() {
companion object {
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 val MATCHERS = listOf(MethodNames.CONTAINS, MethodNames.CONTAINS_ONLY_ONCE, MethodNames.DOES_NOT_CONTAIN)
.map { CallMatcher.instanceCall(AssertJClassNames.ABSTRACT_ITERABLE_ASSERT_CLASSNAME, it) }
}
override fun getDisplayName() = DISPLAY_NAME
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
return object : JavaElementVisitor() {
override fun visitExpressionStatement(statement: PsiExpressionStatement) {
super.visitStatement(statement)
if (!statement.hasAssertThat()) return
val assertThatCall = PsiTreeUtil.findChildrenOfType(statement, PsiMethodCallExpression::class.java).find { ALL_ASSERT_THAT_MATCHERS.test(it) } ?: return
val allCalls = assertThatCall.collectMethodCallsUpToStatement().toList()
if (allCalls.find(COMPLEX_CALLS_THAT_MAKES_STUFF_TRICKY::test) != null) return
val onlyAssertionCalls = allCalls
.filterNot { NOT_ACTUAL_ASSERTIONS.test(it) }
.toList()
for (methodMatcher in MATCHERS) {
if (onlyAssertionCalls.count(methodMatcher::test) > 1) {
val outmostMethodCall = statement.findOutmostMethodCall() ?: return
val quickFix = JoinVarArgsContainsQuickFix(MATCHERS)
val textRange = TextRange(assertThatCall.textLength, outmostMethodCall.textLength)
holder.registerProblem(outmostMethodCall, textRange, JOIN_VARARGS_MESSAGE, quickFix)
return
}
}
}
}
}
}
@@ -7,7 +7,7 @@ import com.intellij.psi.util.PsiTreeUtil
import de.platon42.intellij.plugins.cajon.findStaticMethodCall import de.platon42.intellij.plugins.cajon.findStaticMethodCall
import de.platon42.intellij.plugins.cajon.shortenAndReformat import de.platon42.intellij.plugins.cajon.shortenAndReformat
class JoinStatementsQuickFix : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) { class JoinStatementsQuickFix(private val separateLineLimit: Int) : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) {
companion object { companion object {
private const val JOIN_STATEMENTS_MESSAGE = "Join assertThat() statements" private const val JOIN_STATEMENTS_MESSAGE = "Join assertThat() statements"
@@ -16,6 +16,10 @@ class JoinStatementsQuickFix : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) {
override fun applyFix(project: Project, descriptor: ProblemDescriptor) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val firstStatement = descriptor.startElement as PsiExpressionStatement val firstStatement = descriptor.startElement as PsiExpressionStatement
val lastStatement = descriptor.endElement as PsiExpressionStatement val lastStatement = descriptor.endElement as PsiExpressionStatement
val expressionCount = countExpressions(firstStatement, lastStatement)
val addLineBreaks = (expressionCount > separateLineLimit)
do { do {
val commentsToKeep = ArrayList<PsiComment>() val commentsToKeep = ArrayList<PsiComment>()
val stuffToDelete = ArrayList<PsiElement>() val stuffToDelete = ArrayList<PsiElement>()
@@ -37,10 +41,10 @@ class JoinStatementsQuickFix : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) {
val lastElementBeforeConcat = assertThatCallOfCursorStatement.parent val lastElementBeforeConcat = assertThatCallOfCursorStatement.parent
commentsToKeep.forEach { commentsToKeep.forEach {
lastElementBeforeConcat.addAfter(it, lastElementBeforeConcat.firstChild) lastElementBeforeConcat.addAfter(it, lastElementBeforeConcat.firstChild)
val newLineNode = addLineBreak(project, lastElementBeforeConcat)
PsiParserFacade.SERVICE.getInstance(project).createWhiteSpaceFromText("\n\t") }
if (commentsToKeep.isEmpty() && addLineBreaks) {
lastElementBeforeConcat.addAfter(newLineNode, lastElementBeforeConcat.firstChild) addLineBreak(project, lastElementBeforeConcat)
} }
val newLeaf = previousStatement.firstChild val newLeaf = previousStatement.firstChild
@@ -50,4 +54,27 @@ class JoinStatementsQuickFix : AbstractCommonQuickFix(JOIN_STATEMENTS_MESSAGE) {
val codeBlock = PsiTreeUtil.getParentOfType(lastStatement, PsiCodeBlock::class.java) ?: return val codeBlock = PsiTreeUtil.getParentOfType(lastStatement, PsiCodeBlock::class.java) ?: return
codeBlock.shortenAndReformat() codeBlock.shortenAndReformat()
} }
private fun addLineBreak(project: Project, lastElementBeforeConcat: PsiElement) {
val newLineNode =
PsiParserFacade.SERVICE.getInstance(project).createWhiteSpaceFromText("\n\t")
lastElementBeforeConcat.addAfter(newLineNode, lastElementBeforeConcat.firstChild)
}
private fun countExpressions(firstStatement: PsiElement, lastStatement: PsiElement): Int {
var count = 0
var currentStatement = firstStatement
do {
while (currentStatement !is PsiExpressionStatement) {
currentStatement = currentStatement.nextSibling!!
}
count++
if (currentStatement === lastStatement) {
break
}
currentStatement = currentStatement.nextSibling!!
} while (true)
return count
}
} }
@@ -0,0 +1,38 @@
package de.platon42.intellij.plugins.cajon.quickfixes
import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiMethodCallExpression
import com.siyeh.ig.callMatcher.CallMatcher
import de.platon42.intellij.plugins.cajon.*
class JoinVarArgsContainsQuickFix(private val matchers: Iterable<CallMatcher>) : AbstractCommonQuickFix(JOIN_VARARGS_DESCRIPTION) {
companion object {
private const val JOIN_VARARGS_DESCRIPTION = "Join multiple arguments to variadic argument method calls"
}
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
var outmostCallExpression = descriptor.startElement as? PsiMethodCallExpression ?: return
for (matcher in matchers) {
val assertThatMethodCall = outmostCallExpression.findStaticMethodCall() ?: return
val methodsToFix = assertThatMethodCall.gatherAssertionCalls()
val matchedCalls = methodsToFix.filter(matcher::test)
if (matchedCalls.size > 1) {
val mainCall = matchedCalls.first()
val args = mutableListOf(*mainCall.argumentList.expressions)
for (secondaryCall in matchedCalls.asSequence().drop(1)) {
args.addAll(secondaryCall.argumentList.expressions)
}
val newMainCall = createExpectedMethodCall(mainCall, mainCall.methodExpression.qualifiedName, *args.toTypedArray())
newMainCall.replaceQualifierFromMethodCall(mainCall)
mainCall.replace(newMainCall)
for (secondaryCall in matchedCalls.asSequence().drop(1)) {
val newQualifier = secondaryCall.qualifierExpression
outmostCallExpression = secondaryCall.replace(newQualifier).findOutmostMethodCall() ?: return
}
}
}
}
}
@@ -2,6 +2,7 @@ package de.platon42.intellij.plugins.cajon.quickfixes
import com.intellij.codeInspection.ProblemDescriptor import com.intellij.codeInspection.ProblemDescriptor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.PsiMethodCallExpression
import de.platon42.intellij.plugins.cajon.* import de.platon42.intellij.plugins.cajon.*
@@ -9,7 +10,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 +29,17 @@ 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 =
if (useNullNonNull) JavaPsiFacade.getElementFactory(project).createExpressionFromText("null", null) else 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()
@@ -41,3 +54,4 @@ class MoveOutMethodCallExpressionQuickFix(
} }
} }
} }
}
@@ -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!!
@@ -56,12 +56,10 @@ class ExtractorReferenceContributor : PsiReferenceContributor() {
private fun findAndCreateReferences(element: PsiElement, finder: (PsiLiteralExpression) -> List<Pair<TextRange, List<PsiElement>>>?): Array<PsiReference> { private fun findAndCreateReferences(element: PsiElement, finder: (PsiLiteralExpression) -> List<Pair<TextRange, List<PsiElement>>>?): Array<PsiReference> {
val literal = element as PsiLiteralExpression val literal = element as PsiLiteralExpression
val results = finder(literal) val results = finder(literal) ?: return PsiReference.EMPTY_ARRAY
if (results != null) {
return results.map { ExtractorReference(literal, it.first, it.second) }.toTypedArray() return results.map { ExtractorReference(literal, it.first, it.second) }.toTypedArray()
} }
return PsiReference.EMPTY_ARRAY
}
} }
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) { override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
@@ -73,6 +71,7 @@ class ExtractorReferenceContributor : PsiReferenceContributor() {
class ExtractorReference(literal: PsiLiteralExpression, range: TextRange, private val targets: List<PsiElement>) : class ExtractorReference(literal: PsiLiteralExpression, range: TextRange, private val targets: List<PsiElement>) :
PsiPolyVariantReferenceBase<PsiLiteralExpression>(literal, range, true) { PsiPolyVariantReferenceBase<PsiLiteralExpression>(literal, range, true) {
// Do not remove due to compatiblity issue with IDEA <= 2018.2
override fun getVariants(): Array<Any> { override fun getVariants(): Array<Any> {
return ArrayUtil.EMPTY_OBJECT_ARRAY return ArrayUtil.EMPTY_OBJECT_ARRAY
} }
@@ -88,9 +87,7 @@ class ExtractorReferenceContributor : PsiReferenceContributor() {
class PropertyOrFieldReferenceProvider : PsiReferenceProvider() { class PropertyOrFieldReferenceProvider : PsiReferenceProvider() {
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> { override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> = findAndCreateReferences(element, ::findReferences)
return findAndCreateReferences(element, ::findReferences)
}
fun findReferences(element: PsiLiteralExpression): List<Pair<TextRange, List<PsiElement>>>? { fun findReferences(element: PsiLiteralExpression): List<Pair<TextRange, List<PsiElement>>>? {
val literal = element.value as? String ?: return null val literal = element.value as? String ?: return null
@@ -112,9 +109,7 @@ class ExtractorReferenceContributor : PsiReferenceContributor() {
class IterablePropertyOrFieldReferenceProvider : PsiReferenceProvider() { class IterablePropertyOrFieldReferenceProvider : PsiReferenceProvider() {
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> { override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> = findAndCreateReferences(element, ::findReferences)
return findAndCreateReferences(element, ::findReferences)
}
fun findReferences(element: PsiLiteralExpression): List<Pair<TextRange, List<PsiElement>>>? { fun findReferences(element: PsiLiteralExpression): List<Pair<TextRange, List<PsiElement>>>? {
val literal = element.value as? String ?: return null val literal = element.value as? String ?: return null
@@ -127,9 +122,8 @@ class ExtractorReferenceContributor : PsiReferenceContributor() {
isResultOf = true isResultOf = true
} }
if (!CallMatcher.anyOf(EXTRACTING_FROM_ITERABLE, FLAT_EXTRACTING_FROM_ITERABLE).test(methodCallExpression)) { if (!CallMatcher.anyOf(EXTRACTING_FROM_ITERABLE, FLAT_EXTRACTING_FROM_ITERABLE).test(methodCallExpression)) return null
return null
}
val iterableType = findActualType(methodCallExpression) ?: return null val iterableType = findActualType(methodCallExpression) ?: return null
val innerType = iterableType.resolveGenerics().substitutor.substitute(iterableType.parameters[0]) val innerType = iterableType.resolveGenerics().substitutor.substitute(iterableType.parameters[0])
val containingClass = PsiTypesUtil.getPsiClass(innerType) ?: return null val containingClass = PsiTypesUtil.getPsiClass(innerType) ?: return null
@@ -139,16 +133,13 @@ class ExtractorReferenceContributor : PsiReferenceContributor() {
class IterableResultOfReferenceProvider : PsiReferenceProvider() { class IterableResultOfReferenceProvider : PsiReferenceProvider() {
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> { override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> = findAndCreateReferences(element, ::findReferences)
return findAndCreateReferences(element, ::findReferences)
}
fun findReferences(element: PsiLiteralExpression): List<Pair<TextRange, List<PsiElement>>>? { fun findReferences(element: PsiLiteralExpression): List<Pair<TextRange, List<PsiElement>>>? {
val literal = element.value as? String ?: return null val literal = element.value as? String ?: return null
val methodCallExpression = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression::class.java) ?: return null val methodCallExpression = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression::class.java) ?: return null
if (!EXTRACTING_RESULT_OF_FROM_ITERABLE.test(methodCallExpression)) { if (!EXTRACTING_RESULT_OF_FROM_ITERABLE.test(methodCallExpression)) return null
return null
}
val iterableType = findActualType(methodCallExpression) ?: return null val iterableType = findActualType(methodCallExpression) ?: return null
val innerType = iterableType.resolveGenerics().substitutor.substitute(iterableType.parameters[0]) val innerType = iterableType.resolveGenerics().substitutor.substitute(iterableType.parameters[0])
val containingClass = PsiTypesUtil.getPsiClass(innerType) ?: return null val containingClass = PsiTypesUtil.getPsiClass(innerType) ?: return null
+6 -5
View File
@@ -1,21 +1,20 @@
<idea-plugin> <idea-plugin>
<id>de.platon42.cajon</id> <id>de.platon42.cajon</id>
<name>Concise AssertJ Optimizing Nitpicker (Cajon)</name> <name>Concise AssertJ Optimizing Nitpicker (Cajon)</name>
<vendor email="chrisly@platon42.de" url="https://github.com/chrisly42/cajon-plugin">Platon42</vendor> <vendor email="chrisly@platon42.de" url="https://github.com/chrisly42/cajon-plugin">Chris 'platon42' Hodges</vendor>
<description><![CDATA[ <description><![CDATA[
Cajon is an IntelliJ IDEA Plugin for shortening and optimizing AssertJ assertions. Cajon is an IntelliJ IDEA Plugin for shortening and optimizing AssertJ assertions.
It adds several inspections and quick fixes to fully use the fluent assertion methods It adds several inspections and quick fixes to fully use the fluent assertion methods
and thus makes the intention clear and concise, also generating better messages on test failures. and thus makes the intention clear and concise, also generating better messages on test failures.
It can also be used to convert JUnit 4 assertions to AssertJ. It can also be used to convert JUnit 4 assertions and assumptions to AssertJ.
It supports referencing inside extracting()-methods with strings, adding refactoring safety. It supports referencing inside extracting()-methods with strings, adding refactoring safety.
<p>
<a href="https://github.com/chrisly42/cajon-plugin/blob/master/README.md">Full documentation here...</a>
]]></description> ]]></description>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="173.2696.26"/> <idea-version since-build="173.2696.26"/>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<depends>com.intellij.modules.lang</depends> <depends>com.intellij.modules.lang</depends>
<depends>com.intellij.modules.platform</depends> <depends>com.intellij.modules.platform</depends>
<depends>com.intellij.modules.java</depends> <depends>com.intellij.modules.java</depends>
@@ -49,6 +48,8 @@
<localInspection groupPath="Java" shortName="JoinAssertThatStatements" enabledByDefault="true" level="WARNING" <localInspection groupPath="Java" shortName="JoinAssertThatStatements" enabledByDefault="true" level="WARNING"
implementationClass="de.platon42.intellij.plugins.cajon.inspections.JoinAssertThatStatementsInspection"/> implementationClass="de.platon42.intellij.plugins.cajon.inspections.JoinAssertThatStatementsInspection"/>
<localInspection groupPath="Java" shortName="JoinVarArgsContains" enabledByDefault="true" level="WARNING"
implementationClass="de.platon42.intellij.plugins.cajon.inspections.JoinVarArgsContainsInspection"/>
<localInspection groupPath="Java" shortName="AssumeThatInsteadOfReturn" enabledByDefault="true" level="WARNING" <localInspection groupPath="Java" shortName="AssumeThatInsteadOfReturn" enabledByDefault="true" level="WARNING"
implementationClass="de.platon42.intellij.plugins.cajon.inspections.AssumeThatInsteadOfReturnInspection"/> implementationClass="de.platon42.intellij.plugins.cajon.inspections.AssumeThatInsteadOfReturnInspection"/>
@@ -1,8 +1,18 @@
<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().
<br>
If you are using degenerated maps in your project that may contain null values (i.e.
map.contains(key) == true AND map.get(key) == null
is valid for some entries in your map), the default behavior of the quickfix
assertThat(map.get(key)).isNull() turning into assertThat(map).doesNotContainKey(key)
is not an equivalent transformation. The settings below can change this behavior to instead transform it into
assertThat(map).containsEntry(key, null) for those cases, create both quickfix choices or simply ignore this
case altogether (if in doubt).
</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>
@@ -2,6 +2,9 @@
<body> <body>
Joins consecutive assertThat() statements with the same actual expression together. Joins consecutive assertThat() statements with the same actual expression together.
<!-- tooltip end --> <!-- tooltip end -->
<br>Retains comments during operation. If the AssertThat()-Statement contains .extracting() methods, they will not be joined. <br>If the AssertThat()-Statement contains .extracting() methods, they will not be joined.
<br>During joining multiple statements, line breaks may be added to avoid too long lines. The number of statements to join without
adding line breaks can be configured.
<br>Also retains comments during operation and forces a line break for these cases.
</body> </body>
</html> </html>
@@ -0,0 +1,11 @@
<html>
<body>
Finds assertions where multiple .contains(), .containsOnlyOnce() or .doesNotContain() are
used in a single statement that could be joined together.
<!-- tooltip end -->
Only works when variadic arguments are possible and will not be performed on more complex
statements with .extracting() or .as() to avoid changing semantics.
<br>
Note that the quickfix does not handle comments very well and might remove them during the operation.
</body>
</html>
@@ -11,7 +11,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.*; import com.intellij.testFramework.*;
import com.intellij.testFramework.fixtures.IdeaTestExecutionPolicy; import com.intellij.testFramework.fixtures.IdeaTestExecutionPolicy;
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture; import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.extension.*; import org.junit.jupiter.api.extension.*;
import org.junit.jupiter.api.extension.ExtensionContext.Namespace; import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
@@ -88,7 +88,6 @@ public class LightCodeInsightExtension implements ParameterResolver, AfterTestEx
TestLoggerFactory.onTestFinished(true); TestLoggerFactory.onTestFinished(true);
} catch (Throwable e) { } catch (Throwable e) {
TestLoggerFactory.onTestFinished(false); TestLoggerFactory.onTestFinished(false);
e.fillInStackTrace();
throwables[0] = e; throwables[0] = e;
} }
}; };
@@ -112,7 +111,7 @@ public class LightCodeInsightExtension implements ParameterResolver, AfterTestEx
} }
} }
private static class LightCodeInsightFixtureTestCaseWrapper extends LightCodeInsightFixtureTestCase { private static class LightCodeInsightFixtureTestCaseWrapper extends LightJavaCodeInsightFixtureTestCase {
private final ExtensionContext extensionContext; private final ExtensionContext extensionContext;
private LightCodeInsightFixtureTestCaseWrapper(ExtensionContext extensionContext) { private LightCodeInsightFixtureTestCaseWrapper(ExtensionContext extensionContext) {
@@ -159,7 +158,7 @@ public class LightCodeInsightExtension implements ParameterResolver, AfterTestEx
}; };
} }
protected void addJarContaining(ModifiableRootModel model, Class clazz) { void addJarContaining(ModifiableRootModel model, Class clazz) {
try { try {
Path jarPath = Paths.get(clazz.getProtectionDomain().getCodeSource().getLocation().toURI()); Path jarPath = Paths.get(clazz.getProtectionDomain().getCodeSource().getLocation().toURI());
@@ -1,5 +1,6 @@
package de.platon42.intellij.plugins.cajon package de.platon42.intellij.plugins.cajon
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.pom.java.LanguageLevel import com.intellij.pom.java.LanguageLevel
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
import de.platon42.intellij.jupiter.AddLocalJarToModule import de.platon42.intellij.jupiter.AddLocalJarToModule
@@ -21,9 +22,20 @@ import java.lang.reflect.Method
abstract class AbstractCajonTest { abstract class AbstractCajonTest {
protected fun executeQuickFixes(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int) { protected fun executeQuickFixes(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int) {
val quickfixes = getQuickFixes(myFixture, regex, expectedFixes)
assertThat(quickfixes.groupBy { it.familyName }).hasSize(1)
quickfixes.forEach(myFixture::launchAction)
}
protected fun executeQuickFixesNoFamilyNameCheck(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int) {
val quickfixes = getQuickFixes(myFixture, regex, expectedFixes)
quickfixes.forEach(myFixture::launchAction)
}
protected fun getQuickFixes(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int): List<IntentionAction> {
val quickfixes = myFixture.getAllQuickFixes().filter { it.text.matches(regex) } val quickfixes = myFixture.getAllQuickFixes().filter { it.text.matches(regex) }
assertThat(quickfixes).`as`("Fixes matched by $regex: ${myFixture.getAllQuickFixes().map { it.text }}").hasSize(expectedFixes) assertThat(quickfixes).`as`("Fixes matched by $regex: ${myFixture.getAllQuickFixes().map { it.text }}").hasSize(expectedFixes)
quickfixes.forEach(myFixture::launchAction) return quickfixes
} }
class CutOffFixtureDisplayNameGenerator : DisplayNameGenerator.ReplaceUnderscores() { class CutOffFixtureDisplayNameGenerator : DisplayNameGenerator.ReplaceUnderscores() {
@@ -4,12 +4,13 @@ import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
import de.platon42.intellij.jupiter.MyFixture import de.platon42.intellij.jupiter.MyFixture
import de.platon42.intellij.jupiter.TestDataSubPath import de.platon42.intellij.jupiter.TestDataSubPath
import de.platon42.intellij.plugins.cajon.AbstractCajonTest import de.platon42.intellij.plugins.cajon.AbstractCajonTest
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@TestDataSubPath("inspections/CollectionMapExpression")
internal class AssertThatCollectionOrMapExpressionInspectionTest : AbstractCajonTest() { internal class AssertThatCollectionOrMapExpressionInspectionTest : AbstractCajonTest() {
@Test @Test
@TestDataSubPath("inspections/CollectionMapExpression")
internal fun assertThat_with_certain_Collection_and_Map_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) { internal fun assertThat_with_certain_Collection_and_Map_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.enableInspections(AssertThatCollectionOrMapExpressionInspection::class.java) myFixture.enableInspections(AssertThatCollectionOrMapExpressionInspection::class.java)
myFixture.configureByFile("CollectionMapExpressionBefore.java") myFixture.configureByFile("CollectionMapExpressionBefore.java")
@@ -22,6 +23,82 @@ 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")
} }
@Test
internal fun assertThat_with_certain_Collection_and_Map_methods_with_Null_values(@MyFixture myFixture: JavaCodeInsightTestFixture) {
val inspection = AssertThatCollectionOrMapExpressionInspection()
inspection.behaviorForMapValueEqualsNull = 3
myFixture.enableInspections(inspection)
myFixture.configureByFile("CollectionMapExpressionBefore.java")
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 4)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsAll() of actual expression and use assertThat().containsAll() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().containsKey() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().containsValue() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 5)
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 containsValue() of actual expression and use assertThat().doesNotContainValue() instead"), 2)
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsEntry() instead"), 6)
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)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
myFixture.checkResultByFile("CollectionMapExpressionWithNullValuesAfter.java")
}
@Test
internal fun assertThat_with_certain_Collection_and_Map_methods_with_no_quickfixes_for_get_equals_null(@MyFixture myFixture: JavaCodeInsightTestFixture) {
val inspection = AssertThatCollectionOrMapExpressionInspection()
inspection.behaviorForMapValueEqualsNull = 0
myFixture.enableInspections(inspection)
myFixture.configureByFile("CollectionMapExpressionBefore.java")
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsEntry() instead"), 2)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainEntry() instead"), 2)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsKey() instead"), 4)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
}
@Test
internal fun assertThat_with_certain_Collection_and_Map_methods_with_only_warnings_for_get_equals_null(@MyFixture myFixture: JavaCodeInsightTestFixture) {
val inspection = AssertThatCollectionOrMapExpressionInspection()
inspection.behaviorForMapValueEqualsNull = 1
myFixture.enableInspections(inspection)
myFixture.configureByFile("CollectionMapExpressionBefore.java")
val highlights = myFixture.doHighlighting()
.asSequence()
.filter { it.description == "Moving get() expression out of assertThat() would be more concise" }
.filter {
it.quickFixActionRanges?.any { innerit -> innerit.first.action.text.contains("Inspection 'Asserting a collection or map specific expression") } ?: true
}
.toList()
assertThat(highlights).hasSize(4)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsEntry() instead"), 2)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainEntry() instead"), 2)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsKey() instead"), 4)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
}
@Test
internal fun assertThat_with_certain_Collection_and_Map_methods_with_both_quickfixes_for_get_equals_null(@MyFixture myFixture: JavaCodeInsightTestFixture) {
val inspection = AssertThatCollectionOrMapExpressionInspection()
inspection.behaviorForMapValueEqualsNull = 4
myFixture.enableInspections(inspection)
myFixture.configureByFile("CollectionMapExpressionBefore.java")
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsEntry() instead"), 2)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead (regular map)"), 4)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsEntry(key, null) instead (degenerated map)"), 4)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainEntry() instead"), 2)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsKey() instead"), 4)
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
}
} }
@@ -31,8 +31,8 @@ internal class AssertThatGuavaOptionalInspectionTest : AbstractCajonTest() {
internal fun adds_missing_Guava_import_any_order(@MyFixture myFixture: JavaCodeInsightTestFixture) { internal fun adds_missing_Guava_import_any_order(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java) myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
myFixture.configureByFile("WithoutPriorGuavaImportBefore.java") myFixture.configureByFile("WithoutPriorGuavaImportBefore.java")
executeQuickFixes(myFixture, Regex(".*eplace .* with .*"), 4) executeQuickFixesNoFamilyNameCheck(myFixture, Regex(".*eplace .* with .*"), 4)
executeQuickFixes(myFixture, Regex("Remove .*"), 3) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Remove .*"), 3)
myFixture.checkResultByFile("WithoutPriorGuavaImportAfter.java") myFixture.checkResultByFile("WithoutPriorGuavaImportAfter.java")
} }
@@ -41,8 +41,8 @@ internal class AssertThatGuavaOptionalInspectionTest : AbstractCajonTest() {
myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java) myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
myFixture.configureByFile("WithoutPriorGuavaImportBefore.java") myFixture.configureByFile("WithoutPriorGuavaImportBefore.java")
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with Guava assertThat().isAbsent()"), 1) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with Guava assertThat().isAbsent()"), 1)
executeQuickFixes(myFixture, Regex(".*eplace .* with .*"), 3) executeQuickFixesNoFamilyNameCheck(myFixture, Regex(".*eplace .* with .*"), 3)
executeQuickFixes(myFixture, Regex("Remove .*"), 3) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Remove .*"), 3)
myFixture.checkResultByFile("WithoutPriorGuavaImportAfter.java") myFixture.checkResultByFile("WithoutPriorGuavaImportAfter.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()"), 15)
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSize()"), 8) executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSize()"), 15)
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()"), 17)
myFixture.checkResultByFile("SizeAfter.java") myFixture.checkResultByFile("SizeAfter.java")
} }
} }
@@ -16,9 +16,9 @@ internal class ImplicitAssertionInspectionTest : AbstractCajonTest() {
internal fun implicit_assertions_can_be_removed(@MyFixture myFixture: JavaCodeInsightTestFixture) { internal fun implicit_assertions_can_be_removed(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.enableInspections(ImplicitAssertionInspection::class.java) myFixture.enableInspections(ImplicitAssertionInspection::class.java)
myFixture.configureByFile("ImplicitAssertionBefore.java") myFixture.configureByFile("ImplicitAssertionBefore.java")
executeQuickFixes(myFixture, Regex("Delete implicit isNotNull\\(\\) covered by .*"), 101) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Delete implicit isNotNull\\(\\) covered by .*"), 101)
executeQuickFixes(myFixture, Regex("Delete implicit isNotEmpty\\(\\) covered by .*"), 17) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Delete implicit isNotEmpty\\(\\) covered by .*"), 17)
executeQuickFixes(myFixture, Regex("Delete implicit isPresent\\(\\) covered by .*"), 8) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Delete implicit isPresent\\(\\) covered by .*"), 8)
myFixture.checkResultByFile("ImplicitAssertionAfter.java") myFixture.checkResultByFile("ImplicitAssertionAfter.java")
} }
} }
@@ -17,8 +17,8 @@ internal class JUnitAssertToAssertJInspectionTest : AbstractCajonTest() {
internal fun junit_Assertions_can_be_converted_into_AssertJ(@MyFixture myFixture: JavaCodeInsightTestFixture) { internal fun junit_Assertions_can_be_converted_into_AssertJ(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.enableInspections(JUnitAssertToAssertJInspection::class.java) myFixture.enableInspections(JUnitAssertToAssertJInspection::class.java)
myFixture.configureByFile("JUnitAssertToAssertJInspectionBefore.java") myFixture.configureByFile("JUnitAssertToAssertJInspectionBefore.java")
executeQuickFixes(myFixture, Regex("Convert assert.*\\(\\) to assertThat\\(\\).*"), 48) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Convert assert.*\\(\\) to assertThat\\(\\).*"), 48)
executeQuickFixes(myFixture, Regex("Convert assume.*\\(\\) to assumeThat\\(\\).*"), 7) executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Convert assume.*\\(\\) to assumeThat\\(\\).*"), 7)
myFixture.checkResultByFile("JUnitAssertToAssertJInspectionAfter.java") myFixture.checkResultByFile("JUnitAssertToAssertJInspectionAfter.java")
} }
} }
@@ -0,0 +1,19 @@
package de.platon42.intellij.plugins.cajon.inspections
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
import de.platon42.intellij.jupiter.MyFixture
import de.platon42.intellij.jupiter.TestDataSubPath
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
import org.junit.jupiter.api.Test
internal class JoinVarArgsContainsInspectionTest : AbstractCajonTest() {
@Test
@TestDataSubPath("inspections/JoinVarArgsContains")
internal fun join_contains_and_doesNotContain_together_where_possible(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.enableInspections(JoinVarArgsContainsInspection::class.java)
myFixture.configureByFile("JoinVarArgsContainsBefore.java")
executeQuickFixes(myFixture, Regex.fromLiteral("Join multiple arguments to variadic argument method calls"), 3)
myFixture.checkResultByFile("JoinVarArgsContainsAfter.java")
}
}
@@ -5,6 +5,7 @@ import de.platon42.intellij.jupiter.MyFixture
import de.platon42.intellij.jupiter.TestDataSubPath import de.platon42.intellij.jupiter.TestDataSubPath
import de.platon42.intellij.plugins.cajon.AbstractCajonTest import de.platon42.intellij.plugins.cajon.AbstractCajonTest
import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatThrownBy
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@@ -70,4 +71,10 @@ internal class ExtractorReferenceContributorTest : AbstractCajonTest() {
myFixture.configureByFiles("FindReference10.java", "Address.java", "Contact.java") myFixture.configureByFiles("FindReference10.java", "Address.java", "Contact.java")
assertThat(myFixture.elementAtCaret.text).startsWith("public String getStreetName()") assertThat(myFixture.elementAtCaret.text).startsWith("public String getStreetName()")
} }
@Test
internal fun extractor_is_unable_to_find_reference(@MyFixture myFixture: JavaCodeInsightTestFixture) {
myFixture.configureByFiles("FindReference11.java", "Address.java", "Contact.java")
assertThatThrownBy { myFixture.elementAtCaret.text }.isInstanceOf(AssertionError::class.java)
}
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class BinaryExpression { public class BinaryExpression {
@@ -195,5 +196,8 @@ public class BinaryExpression {
assertThat(primAct == primExp).isFalse().as("doh!").isEqualTo(true); assertThat(primAct == primExp).isFalse().as("doh!").isEqualTo(true);
assertThat(numberObjAct.equals(numberObjExp)).as("doh!").isTrue().isEqualTo(true); assertThat(numberObjAct.equals(numberObjExp)).as("doh!").isTrue().isEqualTo(true);
org.junit.Assert.assertThat(stringAct, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class BinaryExpression { public class BinaryExpression {
@@ -195,5 +196,8 @@ public class BinaryExpression {
assertThat(primAct == primExp).isFalse().as("doh!").isEqualTo(true); assertThat(primAct == primExp).isFalse().as("doh!").isEqualTo(true);
assertThat(numberObjAct.equals(numberObjExp)).as("doh!").isTrue().isEqualTo(true); assertThat(numberObjAct.equals(numberObjExp)).as("doh!").isTrue().isEqualTo(true);
org.junit.Assert.assertThat(stringAct, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class BooleanCondition { public class BooleanCondition {
@@ -30,5 +31,9 @@ public class BooleanCondition {
assertThat("").isEqualTo(Boolean.TRUE); assertThat("").isEqualTo(Boolean.TRUE);
assertThat(primitive).isTrue().as("foo").isTrue().as("bar").isTrue().isFalse(); assertThat(primitive).isTrue().as("foo").isTrue().as("bar").isTrue().isFalse();
assertThat(object).isEqualTo(Boolean.TYPE);
org.junit.Assert.assertThat(object, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class BooleanCondition { public class BooleanCondition {
@@ -30,5 +31,9 @@ public class BooleanCondition {
assertThat("").isEqualTo(Boolean.TRUE); assertThat("").isEqualTo(Boolean.TRUE);
assertThat(primitive).isEqualTo(Boolean.TRUE).as("foo").isEqualTo(true).as("bar").isTrue().isFalse(); assertThat(primitive).isEqualTo(Boolean.TRUE).as("foo").isEqualTo(true).as("bar").isTrue().isFalse();
assertThat(object).isEqualTo(Boolean.TYPE);
org.junit.Assert.assertThat(object, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
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 java.util.*; import java.util.*;
@@ -37,8 +38,26 @@ 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();
org.junit.Assert.assertThat(stringList, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
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 java.util.*; import java.util.*;
@@ -37,8 +38,26 @@ 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();
org.junit.Assert.assertThat(stringList, null);
fail("oh no!");
} }
} }
@@ -0,0 +1,63 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import java.util.*;
public class CollectionMapExpression {
private void collectionMapExpression() {
List<String> stringList = new ArrayList<>();
List<String> anotherList = new ArrayList<>();
Map<String, Integer> keyValueMap = new HashMap<>();
assertThat(stringList).as("foo").isEmpty();
assertThat(stringList).isEmpty();
assertThat(stringList).contains("foo");
assertThat(stringList).contains("foo");
assertThat(stringList).containsAll(anotherList);
assertThat(stringList).containsAll(anotherList);
assertThat(stringList).as("foo").isNotEmpty();
assertThat(stringList).isNotEmpty();
assertThat(stringList).doesNotContain("foo");
assertThat(stringList).doesNotContain("foo");
assertThat(stringList.containsAll(anotherList)).isEqualTo(false);
assertThat(stringList.containsAll(anotherList)).isFalse();
assertThat(keyValueMap).as("foo").isEmpty();
assertThat(keyValueMap).isEmpty();
assertThat(keyValueMap).containsKey("foo");
assertThat(keyValueMap).containsKey("foo");
assertThat(keyValueMap).containsValue(2);
assertThat(keyValueMap).containsValue(2);
assertThat(keyValueMap).as("foo").isNotEmpty();
assertThat(keyValueMap).isNotEmpty();
assertThat(keyValueMap).doesNotContainKey("foo");
assertThat(keyValueMap).doesNotContainKey("foo");
assertThat(keyValueMap).doesNotContainValue(2);
assertThat(keyValueMap).doesNotContainValue(2);
assertThat(keyValueMap).containsEntry("foo", 2);
assertThat(keyValueMap).doesNotContainEntry("foo", 3);
assertThat(keyValueMap).containsEntry("foo", null);
assertThat(keyValueMap).containsEntry("foo", null);
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).containsEntry("foo", null);
assertThat(stringStringMap).containsEntry("foo", null);
assertThat(stringStringMap).containsKey("foo");
assertThat(stringStringMap).containsKey("foo");
assertThat(stringList).as("foo").isNotEmpty().as("bar").isNotEmpty();
assertThat(stringList.isEmpty()).as("foo").isEqualTo(false).as("bar").isTrue();
assertThat(stringList.isEmpty()).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse();
org.junit.Assert.assertThat(stringList, null);
fail("oh no!");
}
}
@@ -1,6 +1,7 @@
import java.util.ArrayList; import java.util.ArrayList;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class EnumerableIsEmpty { public class EnumerableIsEmpty {
@@ -16,5 +17,8 @@ public class EnumerableIsEmpty {
assertThat(new Long[1]).as("etc").hasSize(1); assertThat(new Long[1]).as("etc").hasSize(1);
assertThat("string").as("foo").hasSize(0).hasSameSizeAs("foo").isEmpty(); assertThat("string").as("foo").hasSize(0).hasSameSizeAs("foo").isEmpty();
org.junit.Assert.assertThat("foo", null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import java.util.ArrayList; import java.util.ArrayList;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class EnumerableIsEmpty { public class EnumerableIsEmpty {
@@ -16,5 +17,8 @@ public class EnumerableIsEmpty {
assertThat(new Long[1]).as("etc").hasSize(1); assertThat(new Long[1]).as("etc").hasSize(1);
assertThat("string").as("foo").hasSize(0).hasSameSizeAs("foo").hasSize(0); assertThat("string").as("foo").hasSize(0).hasSameSizeAs("foo").hasSize(0);
org.junit.Assert.assertThat("foo", null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import com.google.common.base.Optional; import com.google.common.base.Optional;
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.guava.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat;
public class GuavaOptional { public class GuavaOptional {
@@ -30,8 +31,21 @@ public class GuavaOptional {
assertThat(opt).isPresent(); assertThat(opt).isPresent();
assertThat(opt).isPresent(); assertThat(opt).isPresent();
//assertThat(opt.get()).isEqualTo(opt.get()); // there's a better version than contains(opt.get())
assertThat(opt.orNull()).isEqualTo(opt.get());
//assertThat(opt.get()).isEqualTo(opt.orNull()); // there's a better version than contains(opt.orNull())
assertThat(opt).contains(opt.get());
assertThat(opt).contains(opt.orNull());
String possibleNullString = System.getProperty("username");
String notNullString = "Narf";
assertThat(opt).as("foo").contains("foo"); assertThat(opt).as("foo").contains("foo");
assertThat(opt).contains("foo"); assertThat(opt).contains("foo");
assertThat(opt).isEqualTo(Optional.fromNullable(null));
assertThat(opt).isEqualTo(Optional.fromNullable(possibleNullString));
assertThat(opt).isEqualTo(Optional.fromNullable(notNullString));
assertThat(opt).isNotEqualTo(Optional.of("foo")); assertThat(opt).isNotEqualTo(Optional.of("foo"));
assertThat(opt).isNotEqualTo(Optional.fromNullable("foo")); assertThat(opt).isNotEqualTo(Optional.fromNullable("foo"));
@@ -56,5 +70,10 @@ public class GuavaOptional {
assertThat(opt).as("foo").isPresent().as("bar").isPresent(); assertThat(opt).as("foo").isPresent().as("bar").isPresent();
assertThat(opt.isPresent()).as("foo").isEqualTo(true).as("bar").isEqualTo(Boolean.FALSE); assertThat(opt.isPresent()).as("foo").isEqualTo(true).as("bar").isEqualTo(Boolean.FALSE);
assertThat(opt.orNull()).as("foo").isEqualTo(null).isNotNull();
org.junit.Assert.assertThat(opt, null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import com.google.common.base.Optional; import com.google.common.base.Optional;
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.guava.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat;
public class GuavaOptional { public class GuavaOptional {
@@ -30,8 +31,21 @@ public class GuavaOptional {
assertThat(opt.orNull()).isNotEqualTo(null); assertThat(opt.orNull()).isNotEqualTo(null);
assertThat(opt.orNull()).isNotNull(); assertThat(opt.orNull()).isNotNull();
//assertThat(opt.get()).isEqualTo(opt.get()); // there's a better version than contains(opt.get())
assertThat(opt.orNull()).isEqualTo(opt.get());
//assertThat(opt.get()).isEqualTo(opt.orNull()); // there's a better version than contains(opt.orNull())
assertThat(opt).contains(opt.get());
assertThat(opt).contains(opt.orNull());
String possibleNullString = System.getProperty("username");
String notNullString = "Narf";
assertThat(opt).as("foo").isEqualTo(Optional.of("foo")); assertThat(opt).as("foo").isEqualTo(Optional.of("foo"));
assertThat(opt).isEqualTo(Optional.fromNullable("foo")); assertThat(opt).isEqualTo(Optional.fromNullable("foo"));
assertThat(opt).isEqualTo(Optional.fromNullable(null));
assertThat(opt).isEqualTo(Optional.fromNullable(possibleNullString));
assertThat(opt).isEqualTo(Optional.fromNullable(notNullString));
assertThat(opt).isNotEqualTo(Optional.of("foo")); assertThat(opt).isNotEqualTo(Optional.of("foo"));
assertThat(opt).isNotEqualTo(Optional.fromNullable("foo")); assertThat(opt).isNotEqualTo(Optional.fromNullable("foo"));
@@ -56,5 +70,10 @@ public class GuavaOptional {
assertThat(opt.isPresent()).as("foo").isEqualTo(true).as("bar").isEqualTo(Boolean.TRUE); assertThat(opt.isPresent()).as("foo").isEqualTo(true).as("bar").isEqualTo(Boolean.TRUE);
assertThat(opt.isPresent()).as("foo").isEqualTo(true).as("bar").isEqualTo(Boolean.FALSE); assertThat(opt.isPresent()).as("foo").isEqualTo(true).as("bar").isEqualTo(Boolean.FALSE);
assertThat(opt.orNull()).as("foo").isEqualTo(null).isNotNull();
org.junit.Assert.assertThat(opt, null);
fail("oh no!");
} }
} }
@@ -6,6 +6,7 @@ import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
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.guava.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat;
public class ImplicitAssertion { public class ImplicitAssertion {
@@ -284,5 +285,8 @@ public class ImplicitAssertion {
assertThat(guavaOptional).contains("foo"); assertThat(guavaOptional).contains("foo");
assertThat(guavaOptional).extractingValue().isEqualTo("foo"); assertThat(guavaOptional).extractingValue().isEqualTo("foo");
assertThat(guavaOptional).extractingCharSequence().isEqualTo("foo"); assertThat(guavaOptional).extractingCharSequence().isEqualTo("foo");
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -6,6 +6,7 @@ import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
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.guava.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.assertThat;
public class ImplicitAssertion { public class ImplicitAssertion {
@@ -284,5 +285,8 @@ public class ImplicitAssertion {
assertThat(guavaOptional).isPresent().contains("foo"); assertThat(guavaOptional).isPresent().contains("foo");
assertThat(guavaOptional).isPresent().extractingValue().isEqualTo("foo"); assertThat(guavaOptional).isPresent().extractingValue().isEqualTo("foo");
assertThat(guavaOptional).isPresent().extractingCharSequence().isEqualTo("foo"); assertThat(guavaOptional).isPresent().extractingCharSequence().isEqualTo("foo");
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class InstanceOf { public class InstanceOf {
@@ -21,5 +22,8 @@ public class InstanceOf {
assertThat(object).as("foo").isInstanceOf(Boolean.class).as("bar").isInstanceOf(Boolean.class); assertThat(object).as("foo").isInstanceOf(Boolean.class).as("bar").isInstanceOf(Boolean.class);
assertThat(object instanceof Boolean).as("foo").isEqualTo(Boolean.TRUE).as("bar").isEqualTo(false); assertThat(object instanceof Boolean).as("foo").isEqualTo(Boolean.TRUE).as("bar").isEqualTo(false);
org.junit.Assert.assertThat(object, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class InstanceOf { public class InstanceOf {
@@ -21,5 +22,8 @@ public class InstanceOf {
assertThat(object instanceof Boolean).as("foo").isEqualTo(Boolean.TRUE).as("bar").isEqualTo(true); assertThat(object instanceof Boolean).as("foo").isEqualTo(Boolean.TRUE).as("bar").isEqualTo(true);
assertThat(object instanceof Boolean).as("foo").isEqualTo(Boolean.TRUE).as("bar").isEqualTo(false); assertThat(object instanceof Boolean).as("foo").isEqualTo(Boolean.TRUE).as("bar").isEqualTo(false);
org.junit.Assert.assertThat(object, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class InvertedBooleanCondition { public class InvertedBooleanCondition {
@@ -35,5 +36,8 @@ public class InvertedBooleanCondition {
assertThat(primitive).as("foo").isFalse().as("bar").isFalse(); assertThat(primitive).as("foo").isFalse().as("bar").isFalse();
assertThat(primitive).as("foo").isFalse().as("bar").isTrue(); assertThat(primitive).as("foo").isFalse().as("bar").isTrue();
org.junit.Assert.assertThat(object, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class InvertedBooleanCondition { public class InvertedBooleanCondition {
@@ -35,5 +36,8 @@ public class InvertedBooleanCondition {
assertThat(!primitive).as("foo").isEqualTo(Boolean.TRUE).as("bar").isNotEqualTo(false); assertThat(!primitive).as("foo").isEqualTo(Boolean.TRUE).as("bar").isNotEqualTo(false);
assertThat(!primitive).as("foo").isEqualTo(Boolean.TRUE).as("bar").isNotEqualTo(true); assertThat(!primitive).as("foo").isEqualTo(Boolean.TRUE).as("bar").isNotEqualTo(true);
org.junit.Assert.assertThat(object, null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import java.util.Optional; import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class Java8Optional { public class Java8Optional {
@@ -29,8 +30,21 @@ public class Java8Optional {
assertThat(opt).isPresent(); assertThat(opt).isPresent();
assertThat(opt).isPresent(); assertThat(opt).isPresent();
//assertThat(opt.get()).isEqualTo(opt.get()); // there's a better version than contains(opt.get())
assertThat(opt.orElse(null)).isEqualTo(opt.get());
//assertThat(opt.get()).isEqualTo(opt.orElse(null)); // there's a better version than contains(opt.orElse(null))
assertThat(opt).contains(opt.get());
assertThat(opt).contains(opt.orElse(null));
String possibleNullString = System.getProperty("username");
String notNullString = "Narf";
assertThat(opt).as("foo").contains("foo"); assertThat(opt).as("foo").contains("foo");
assertThat(opt).contains("foo"); assertThat(opt).contains("foo");
assertThat(opt).isEqualTo(Optional.ofNullable(null));
assertThat(opt).isEqualTo(Optional.ofNullable(possibleNullString));
assertThat(opt).isEqualTo(Optional.ofNullable(notNullString));
assertThat(opt).isNotEqualTo(Optional.of("foo")); assertThat(opt).isNotEqualTo(Optional.of("foo"));
assertThat(opt).isNotEqualTo(Optional.ofNullable("foo")); assertThat(opt).isNotEqualTo(Optional.ofNullable("foo"));
@@ -43,5 +57,10 @@ public class Java8Optional {
assertThat(opt.get()).isEqualTo("foo").isSameAs("foo").isNotEqualTo("foo").isNotSameAs("foo"); assertThat(opt.get()).isEqualTo("foo").isSameAs("foo").isNotEqualTo("foo").isNotSameAs("foo");
assertThat(opt.orElse("foo")).as("foo").isEqualTo(null); assertThat(opt.orElse("foo")).as("foo").isEqualTo(null);
assertThat(opt.orElse(null)).as("foo").isEqualTo(null).isNotNull();
org.junit.Assert.assertThat(opt, null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import java.util.Optional; import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class Java8Optional { public class Java8Optional {
@@ -29,8 +30,21 @@ public class Java8Optional {
assertThat(opt.orElse(null)).isNotEqualTo(null); assertThat(opt.orElse(null)).isNotEqualTo(null);
assertThat(opt.orElse(null)).isNotNull(); assertThat(opt.orElse(null)).isNotNull();
//assertThat(opt.get()).isEqualTo(opt.get()); // there's a better version than contains(opt.get())
assertThat(opt.orElse(null)).isEqualTo(opt.get());
//assertThat(opt.get()).isEqualTo(opt.orElse(null)); // there's a better version than contains(opt.orElse(null))
assertThat(opt).contains(opt.get());
assertThat(opt).contains(opt.orElse(null));
String possibleNullString = System.getProperty("username");
String notNullString = "Narf";
assertThat(opt).as("foo").isEqualTo(Optional.of("foo")); assertThat(opt).as("foo").isEqualTo(Optional.of("foo"));
assertThat(opt).isEqualTo(Optional.ofNullable("foo")); assertThat(opt).isEqualTo(Optional.ofNullable("foo"));
assertThat(opt).isEqualTo(Optional.ofNullable(null));
assertThat(opt).isEqualTo(Optional.ofNullable(possibleNullString));
assertThat(opt).isEqualTo(Optional.ofNullable(notNullString));
assertThat(opt).isNotEqualTo(Optional.of("foo")); assertThat(opt).isNotEqualTo(Optional.of("foo"));
assertThat(opt).isNotEqualTo(Optional.ofNullable("foo")); assertThat(opt).isNotEqualTo(Optional.ofNullable("foo"));
@@ -43,5 +57,10 @@ public class Java8Optional {
assertThat(opt.get()).isEqualTo("foo").isSameAs("foo").isNotEqualTo("foo").isNotSameAs("foo"); assertThat(opt.get()).isEqualTo("foo").isSameAs("foo").isNotEqualTo("foo").isNotSameAs("foo");
assertThat(opt.orElse("foo")).as("foo").isEqualTo(null); assertThat(opt.orElse("foo")).as("foo").isEqualTo(null);
assertThat(opt.orElse(null)).as("foo").isEqualTo(null).isNotNull();
org.junit.Assert.assertThat(opt, null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import java.util.*; import java.util.*;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class JoinStatements { public class JoinStatements {
@@ -24,21 +25,28 @@ public class JoinStatements {
.doesNotContain("foobar"); .doesNotContain("foobar");
assertThat("narf").isNotEqualTo("puit"); assertThat("narf").isNotEqualTo("puit");
assertThat(list).as("bar").contains("barbar").as("foo").hasSize(2); assertThat(list).as("bar").contains("barbar")
.as("foo").hasSize(2);
assertThat(list).as("evil").extracting(String::length).contains(2); assertThat(list).as("evil").extracting(String::length).contains(2);
assertThat(list).as("bar").contains("barbar"); assertThat(list).as("bar").contains("barbar");
assertThat(otherList).contains("puit"); assertThat(otherList).contains("puit");
assertThat(list).as("foo").hasSize(2); assertThat(list).as("foo").hasSize(2);
if (true) { if (true) {
assertThat(list).doesNotContain("narf").as("bar").contains("barbar"); assertThat(list).doesNotContain("narf")
.as("bar").contains("barbar");
} }
assertThat(list.get(0)).isNotEmpty().hasSize(3).isEqualTo("bar"); assertThat(list.get(0)).isNotEmpty()
.hasSize(3)
.isEqualTo("bar");
assertThat(otherList.get(0)).isNotEmpty(); assertThat(otherList.get(0)).isNotEmpty();
assertThat(list.get(0)).hasSize(3); assertThat(list.get(0)).hasSize(3);
assertThat(list.get(0) + "foo").isEqualTo("bar").doesNotStartWith("foo"); assertThat(list.get(0) + "foo").isNotNull()
// hey, a comment mixed with line breaks due to too many joins
.isEqualTo("bar")
.doesNotStartWith("foo");
assertThat(otherList.get(0) + "foo").isEqualTo("bar"); assertThat(otherList.get(0) + "foo").isEqualTo("bar");
assertThat(list.get(0) + "foo").doesNotStartWith("foo"); assertThat(list.get(0) + "foo").doesNotStartWith("foo");
@@ -57,5 +65,8 @@ public class JoinStatements {
assertThat(list.get(i++).toLowerCase()).isEqualTo("foo"); assertThat(list.get(i++).toLowerCase()).isEqualTo("foo");
assertThat(list.get(--i)).isEqualTo("foo"); assertThat(list.get(--i)).isEqualTo("foo");
assertThat(list.get(--i)).isEqualTo("foo"); assertThat(list.get(--i)).isEqualTo("foo");
org.junit.Assert.assertThat(list, null);
fail("oh no!");
} }
} }
@@ -1,6 +1,7 @@
import java.util.*; import java.util.*;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class JoinStatements { public class JoinStatements {
@@ -39,6 +40,8 @@ public class JoinStatements {
assertThat(otherList.get(0)).isNotEmpty(); assertThat(otherList.get(0)).isNotEmpty();
assertThat(list.get(0)).hasSize(3); assertThat(list.get(0)).hasSize(3);
assertThat(list.get(0) + "foo").isNotNull();
// hey, a comment mixed with line breaks due to too many joins
assertThat(list.get(0) + "foo").isEqualTo("bar"); assertThat(list.get(0) + "foo").isEqualTo("bar");
assertThat(list.get(0) + "foo").doesNotStartWith("foo"); assertThat(list.get(0) + "foo").doesNotStartWith("foo");
@@ -59,5 +62,8 @@ public class JoinStatements {
assertThat(list.get(i++).toLowerCase()).isEqualTo("foo"); assertThat(list.get(i++).toLowerCase()).isEqualTo("foo");
assertThat(list.get(--i)).isEqualTo("foo"); assertThat(list.get(--i)).isEqualTo("foo");
assertThat(list.get(--i)).isEqualTo("foo"); assertThat(list.get(--i)).isEqualTo("foo");
org.junit.Assert.assertThat(list, null);
fail("oh no!");
} }
} }
@@ -0,0 +1,22 @@
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class JoinVarArgsContains {
private void joinVarArgsContains() {
List<String> list = new ArrayList<>();
assertThat(list).contains("foo", "bar", "etc").hasSize(2);
assertThat(list).contains("foo").as("narf").contains("bar");
assertThat(list).doesNotContain("foo", "bar");
assertThat(list).containsOnlyOnce("foo", "etc") // will we lose this comment?
.hasSize(2).contains("bar", "narf", "1", "2", "3").doesNotContain("puit", "Jens Stoltenberg is a war-monger", "and an atomic playboy") /* inline */; // the final comment
assertThat(list).contains("foo").doesNotContain("bar").containsOnlyOnce("narf");
org.junit.Assert.assertThat(list, null);
fail("oh no!");
}
}
@@ -0,0 +1,28 @@
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class JoinVarArgsContains {
private void joinVarArgsContains() {
List<String> list = new ArrayList<>();
assertThat(list).contains("foo").contains(/* foo */ "bar" /* bar */).hasSize(2).contains("etc");
assertThat(list).contains("foo").as("narf").contains("bar");
assertThat(list).doesNotContain("foo").doesNotContain("bar");
assertThat(list).containsOnlyOnce()
.containsOnlyOnce("foo") // will we lose this comment?
.hasSize(2) // this is part of the contains("bar")
.contains("bar").containsOnlyOnce("etc") /* where does this go? */
.contains("narf") // what about this one?
.doesNotContain("puit", "Jens Stoltenberg is a war-monger")
.doesNotContain("and an atomic playboy")
.contains("1", "2", "3") /* inline */; // the final comment
assertThat(list).contains("foo").doesNotContain("bar").containsOnlyOnce("narf");
org.junit.Assert.assertThat(list, null);
fail("oh no!");
}
}
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class ObjectExpression { public class ObjectExpression {
@@ -23,5 +24,8 @@ public class ObjectExpression {
assertThat(object.equals(otherObject)).isEqualTo(foo); assertThat(object.equals(otherObject)).isEqualTo(foo);
assertThat(object).as("doh!").isEqualTo(otherObject).isEqualTo(otherObject); assertThat(object).as("doh!").isEqualTo(otherObject).isEqualTo(otherObject);
org.junit.Assert.assertThat(foo, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class ObjectExpression { public class ObjectExpression {
@@ -23,5 +24,8 @@ public class ObjectExpression {
assertThat(object.equals(otherObject)).isEqualTo(foo); assertThat(object.equals(otherObject)).isEqualTo(foo);
assertThat(object.equals(otherObject)).as("doh!").isTrue().isEqualTo(true); assertThat(object.equals(otherObject)).as("doh!").isTrue().isEqualTo(true);
org.junit.Assert.assertThat(foo, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class ObjectIsNull { public class ObjectIsNull {
@@ -13,5 +14,8 @@ public class ObjectIsNull {
assertThat(new Object()).as("foo").isNotNull().as("bar").isEqualTo(new Object()).as("etc").isNull(); assertThat(new Object()).as("foo").isNotNull().as("bar").isEqualTo(new Object()).as("etc").isNull();
assertThat(new Object()).as("foo").isEqualTo(null).as("bar").isEqualTo(new Object()).as("etc").isNotNull(); assertThat(new Object()).as("foo").isEqualTo(null).as("bar").isEqualTo(new Object()).as("etc").isNotNull();
org.junit.Assert.assertThat("foo", null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class ObjectIsNull { public class ObjectIsNull {
@@ -13,5 +14,8 @@ public class ObjectIsNull {
assertThat(new Object()).as("foo").isNotEqualTo(null).as("bar").isEqualTo(new Object()).as("etc").isEqualTo(null); assertThat(new Object()).as("foo").isNotEqualTo(null).as("bar").isEqualTo(new Object()).as("etc").isEqualTo(null);
assertThat(new Object()).as("foo").isEqualTo(null).as("bar").isEqualTo(new Object()).as("etc").isNotEqualTo(null); assertThat(new Object()).as("foo").isEqualTo(null).as("bar").isEqualTo(new Object()).as("etc").isNotEqualTo(null);
org.junit.Assert.assertThat("foo", null);
fail("oh no!");
} }
} }
@@ -1,6 +1,9 @@
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;
public class Size { public class Size {
@@ -11,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();
@@ -21,8 +26,9 @@ public class Size {
assertThat(list).isEmpty(); assertThat(list).isEmpty();
assertThat(list).hasSameSizeAs(otherList); assertThat(list).hasSameSizeAs(otherList);
assertThat(list).hasSameSizeAs(array); assertThat(list).hasSameSizeAs(array);
assertThat(list).hasSize(string.length()); assertThat(list).hasSize(string.length()); // does currently not support hasSameSizeAs() in assertj
assertThat(list).hasSize(stringBuilder.length()); assertThat(list).hasSize(stringBuilder.length()); // does currently not support hasSameSizeAs() in assertj
assertThat(list).hasSize(map.size()); // does currently not support hasSameSizeAs() in assertj
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);
@@ -30,8 +36,9 @@ public class Size {
assertThat(list).hasSizeLessThanOrEqualTo(otherList.size() * 2); assertThat(list).hasSizeLessThanOrEqualTo(otherList.size() * 2);
assertThat(list).hasSameSizeAs(otherList); assertThat(list).hasSameSizeAs(otherList);
assertThat(list).hasSameSizeAs(array); assertThat(list).hasSameSizeAs(array);
assertThat(list).hasSize(string.length()); assertThat(list).hasSize(string.length()); // currently unsupported in assertj
assertThat(list).hasSize(stringBuilder.length()); assertThat(list).hasSize(stringBuilder.length()); // currently unsupported in assertj
assertThat(list).hasSize(map.size()); // currently unsupported in assertj
assertThat(array).isEmpty(); assertThat(array).isEmpty();
assertThat(array).isEmpty(); assertThat(array).isEmpty();
@@ -42,8 +49,9 @@ public class Size {
assertThat(array).isEmpty(); assertThat(array).isEmpty();
assertThat(array).hasSameSizeAs(list); assertThat(array).hasSameSizeAs(list);
assertThat(array).hasSameSizeAs(otherArray); assertThat(array).hasSameSizeAs(otherArray);
assertThat(array).hasSize(string.length()); assertThat(array).hasSize(string.length()); // does currently not support hasSameSizeAs() in assertj
assertThat(array).hasSize(stringBuilder.length()); assertThat(array).hasSize(stringBuilder.length()); // does currently not support hasSameSizeAs() in assertj
assertThat(array).hasSize(map.size()); // does currently not support hasSameSizeAs() in assertj
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);
@@ -51,8 +59,9 @@ public class Size {
assertThat(array).hasSizeLessThanOrEqualTo(1 - otherArray.length); assertThat(array).hasSizeLessThanOrEqualTo(1 - otherArray.length);
assertThat(array).hasSameSizeAs(list); assertThat(array).hasSameSizeAs(list);
assertThat(array).hasSameSizeAs(otherArray); assertThat(array).hasSameSizeAs(otherArray);
assertThat(array).hasSize(string.length()); assertThat(array).hasSize(string.length()); // currently unsupported in assertj
assertThat(array).hasSize(stringBuilder.length()); assertThat(array).hasSize(stringBuilder.length()); // currently unsupported in assertj
assertThat(array).hasSize(map.size()); // currently unsupported in assertj
assertThat(string).isEmpty(); assertThat(string).isEmpty();
assertThat(string).isEmpty(); assertThat(string).isEmpty();
@@ -62,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).hasSize(map.size()); // currently unsupported in assertj
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).hasSize(map.size()); // currently unsupported in assertj
assertThat(stringBuilder).isEmpty(); assertThat(stringBuilder).isEmpty();
assertThat(stringBuilder).isEmpty(); assertThat(stringBuilder).isEmpty();
@@ -83,21 +94,53 @@ 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).hasSize(map.size()); // does currently not support hasSameSizeAs() in assertj
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).hasSize(map.size()); // currently unsupported in assertj
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()); // does currently not support hasSameSizeAs() in assertj
assertThat(map).hasSize(stringBuilder.length()); // does currently not support hasSameSizeAs() in assertj
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()); // currently unsupported in assertj
assertThat(map).hasSize(stringBuilder.length()); // currently unsupported in assertj
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);
assertThat(stringBuilder).as("foo").isNotEmpty().hasSize(2).as("bar").hasSameSizeAs(otherList).hasSameSizeAs(array); assertThat(stringBuilder).as("foo").isNotEmpty().hasSize(2).as("bar").hasSameSizeAs(otherList).hasSameSizeAs(array);
int foo = 1;
assertThat(foo).isEqualTo(0);
assertThat(string.length()).isPositive();
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -1,6 +1,9 @@
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;
public class Size { public class Size {
@@ -11,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();
@@ -21,8 +26,9 @@ public class Size {
assertThat(list.size()).isLessThanOrEqualTo(0); assertThat(list.size()).isLessThanOrEqualTo(0);
assertThat(list.size()).isEqualTo(otherList.size()); assertThat(list.size()).isEqualTo(otherList.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()); // does currently not support hasSameSizeAs() in assertj
assertThat(list.size()).isEqualTo(stringBuilder.length()); assertThat(list.size()).isEqualTo(stringBuilder.length()); // does currently not support hasSameSizeAs() in assertj
assertThat(list.size()).isEqualTo(map.size()); // does currently not support hasSameSizeAs() in assertj
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);
@@ -30,8 +36,9 @@ public class Size {
assertThat(list.size()).isLessThanOrEqualTo(otherList.size() * 2); assertThat(list.size()).isLessThanOrEqualTo(otherList.size() * 2);
assertThat(list).hasSize(otherList.size()); assertThat(list).hasSize(otherList.size());
assertThat(list).hasSize(array.length); assertThat(list).hasSize(array.length);
assertThat(list).hasSize(string.length()); assertThat(list).hasSize(string.length()); // currently unsupported in assertj
assertThat(list).hasSize(stringBuilder.length()); assertThat(list).hasSize(stringBuilder.length()); // currently unsupported in assertj
assertThat(list).hasSize(map.size()); // currently unsupported in assertj
assertThat(array.length).isEqualTo(0); assertThat(array.length).isEqualTo(0);
assertThat(array.length).isZero(); assertThat(array.length).isZero();
@@ -42,8 +49,9 @@ public class Size {
assertThat(array.length).isLessThanOrEqualTo(0); assertThat(array.length).isLessThanOrEqualTo(0);
assertThat(array.length).isEqualTo(list.size()); assertThat(array.length).isEqualTo(list.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()); // does currently not support hasSameSizeAs() in assertj
assertThat(array.length).isEqualTo(stringBuilder.length()); assertThat(array.length).isEqualTo(stringBuilder.length()); // does currently not support hasSameSizeAs() in assertj
assertThat(array.length).isEqualTo(map.size()); // does currently not support hasSameSizeAs() in assertj
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);
@@ -51,8 +59,9 @@ public class Size {
assertThat(array.length).isLessThanOrEqualTo(1 - otherArray.length); assertThat(array.length).isLessThanOrEqualTo(1 - otherArray.length);
assertThat(array).hasSize(list.size()); assertThat(array).hasSize(list.size());
assertThat(array).hasSize(otherArray.length); assertThat(array).hasSize(otherArray.length);
assertThat(array).hasSize(string.length()); assertThat(array).hasSize(string.length()); // currently unsupported in assertj
assertThat(array).hasSize(stringBuilder.length()); assertThat(array).hasSize(stringBuilder.length()); // currently unsupported in assertj
assertThat(array).hasSize(map.size()); // currently unsupported in assertj
assertThat(string.length()).isEqualTo(0); assertThat(string.length()).isEqualTo(0);
assertThat(string.length()).isZero(); assertThat(string.length()).isZero();
@@ -62,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()); // currently unsupported in assertj
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()); // currently unsupported in assertj
assertThat(stringBuilder.length()).isEqualTo(0); assertThat(stringBuilder.length()).isEqualTo(0);
assertThat(stringBuilder.length()).isZero(); assertThat(stringBuilder.length()).isZero();
@@ -83,21 +94,53 @@ 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()); // does currently not support hasSameSizeAs() in assertj
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()); // currently unsupported in assertj
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()); // does currently not support hasSameSizeAs() in assertj
assertThat(map.size()).isEqualTo(stringBuilder.length()); // does currently not support hasSameSizeAs() in assertj
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()); // currently unsupported in assertj
assertThat(map).hasSize(stringBuilder.length()); // currently unsupported in assertj
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);
assertThat(stringBuilder).as("foo").isNotEmpty().hasSize(2).as("bar").hasSize(otherList.size()).hasSize(array.length); assertThat(stringBuilder).as("foo").isNotEmpty().hasSize(2).as("bar").hasSize(otherList.size()).hasSize(array.length);
int foo = 1;
assertThat(foo).isEqualTo(0);
assertThat(string.length()).isPositive();
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class StringExpression { public class StringExpression {
@@ -49,5 +50,8 @@ public class StringExpression {
assertThat(string).as("foo").doesNotEndWith("foo").as("bar").doesNotEndWith("foo"); assertThat(string).as("foo").doesNotEndWith("foo").as("bar").doesNotEndWith("foo");
assertThat(string.endsWith("foo")).as("foo").isEqualTo(false).as("bar").isTrue(); assertThat(string.endsWith("foo")).as("foo").isEqualTo(false).as("bar").isTrue();
assertThat(string.endsWith("foo")).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse(); assertThat(string.endsWith("foo")).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse();
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class StringExpression { public class StringExpression {
@@ -49,5 +50,8 @@ public class StringExpression {
assertThat(string.endsWith("foo")).as("foo").isEqualTo(false).as("bar").isFalse(); assertThat(string.endsWith("foo")).as("foo").isEqualTo(false).as("bar").isFalse();
assertThat(string.endsWith("foo")).as("foo").isEqualTo(false).as("bar").isTrue(); assertThat(string.endsWith("foo")).as("foo").isEqualTo(false).as("bar").isTrue();
assertThat(string.endsWith("foo")).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse(); assertThat(string.endsWith("foo")).as("foo").satisfies(it -> it.booleanValue()).as("bar").isFalse();
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class StringIsEmpty { public class StringIsEmpty {
@@ -18,5 +19,8 @@ public class StringIsEmpty {
assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").isEmpty(); assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").isEmpty();
assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").isEmpty(); assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").isEmpty();
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -1,4 +1,5 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class StringIsEmpty { public class StringIsEmpty {
@@ -18,5 +19,8 @@ public class StringIsEmpty {
assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").isEqualTo(""); assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").isEqualTo("");
assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").hasSize(0); assertThat(string).as("foo").isEqualTo("").as("bar").hasSize(0).hasSameSizeAs("foo").hasSize(0);
org.junit.Assert.assertThat(string, null);
fail("oh no!");
} }
} }
@@ -0,0 +1,15 @@
import org.assertj.core.extractor.Extractors;
import java.util.Collections;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class FindReference10 {
private void findReferences() {
List<Contact> contactList = Collections.emptyList();
assertThat(contactList).extracting("narf<caret>").isEqualTo("foo");
}
}