diff --git a/README.md b/README.md
index 74d7a6e..f938c5b 100644
--- a/README.md
+++ b/README.md
@@ -77,6 +77,22 @@ The plugin also supports the conversion of the most common JUnit 4 assertions to
to: assertThat(array).hasSameSizeAs(anotherArray);
```
+ with AssertJ 13.2.0 or higher
+
+ ```
+ from: assertThat(array.length).isLessThanOrEqualTo(expression);
+ to: assertThat(array).hasSizeLessThanOrEqualTo(expression);
+
+ from: assertThat(array.length).isLessThan(expression);
+ to: assertThat(array).hasSizeLessThan(expression);
+
+ from: assertThat(array.length).isGreaterThan(expression);
+ to: assertThat(array).hasSizeGreaterThan(expression);
+
+ from: assertThat(array.length).isGreaterThanOrEqualTo(expression);
+ to: assertThat(array).hasSizeGreaterThanOrEqualTo(expression);
+ ```
+
and analogously for collections...
- JUnitAssertToAssertJ
@@ -107,6 +123,64 @@ The plugin also supports the conversion of the most common JUnit 4 assertions to
assertArrayEquals(message, expectedDoubleOrFloatArray, actualDoubleOrFloatArray, delta);
```
+## Development notice
+
+Cajon is probably the only plugin that uses JUnit 5 Jupiter for unit testing so far (or at least the only one that I'm aware of ;) ).
+The IntelliJ framework actually uses the JUnit 3 TestCase for plugin testing and I took me quite a while to make it work with JUnit 5.
+Feel free to use the code (in package de.platon42.intellij.jupiter) for your projects (with attribution).
+
## TODO
+- AssertThatBinaryExpressionIsTrueOrFalse
+ ```
+ from: assertThat(actual == expected).isTrue();
+ to: assertThat(actual).isEqualTo(expected); (for primitive types)
+ to: assertThat(actual).isSameAs(expected); (for objects)
+
+ from: assertThat(actual != expected).isFalse();
+ to: assertThat(actual).isNotEqualTo(expected); (for primitive types)
+ to: assertThat(actual).isNotSameAs(expected); (for objects)
+ ```
+- AssertThatJava8OptionalContains
+ ```
+ from: assertThat(Optional.of("foo").get()).isEqualTo("foo");
+ to: assertThat(Optional.of("foo")).contains("foo");
+ ```
+- AssertThatJava8OptionalIsPresentOrAbsent
+ ```
+ from: assertThat(Optional.of("foo").isPresent()).isEqualTo(true);
+ from: assertThat(!Optional.of("foo").isPresent()).isEqualTo(false);
+ from: assertThat(Optional.of("foo").isPresent()).isTrue();
+ from: assertThat(!Optional.of("foo").isPresent()).isFalse();
+ to: assertThat(Optional.of("foo")).isPresent();
+
+ from: assertThat(Optional.of("foo").isPresent()).isEqualTo(false);
+ from: assertThat(!Optional.of("foo").isPresent()).isEqualTo(true);
+ from: assertThat(Optional.of("foo").isPresent()).isFalse();
+ from: assertThat(!Optional.of("foo").isPresent()).isTrue();
+ to: assertThat(Optional.of("foo")).isNotPresent();
+ ```
- AssertThatGuavaOptionalContains
-- extraction with property names to lambda with Java 8
\ No newline at end of file
+ ```
+ from: assertThat(Optional.of("foo").get()).isEqualTo("foo");
+ to: assertThat(Optional.of("foo")).contains("foo");
+ ```
+- AssertThatGuavaOptionalIsPresentOrAbsent
+ ```
+ from: assertThat(Optional.of("foo").isPresent()).isEqualTo(true);
+ from: assertThat(!Optional.of("foo").isPresent()).isEqualTo(false);
+ from: assertThat(Optional.of("foo").isPresent()).isTrue();
+ from: assertThat(!Optional.of("foo").isPresent()).isFalse();
+ to: assertThat(Optional.of("foo")).isPresent();
+
+ from: assertThat(Optional.of("foo").isPresent()).isEqualTo(false);
+ from: assertThat(!Optional.of("foo").isPresent()).isEqualTo(true);
+ from: assertThat(Optional.of("foo").isPresent()).isFalse();
+ from: assertThat(!Optional.of("foo").isPresent()).isTrue();
+ to: assertThat(Optional.of("foo")).isAbsent();
+ ```
+- Referencing string properties inside extracting()
+- Extraction with property names to lambda with Java 8
+ ```
+ from: assertThat(object).extracting("propOne", "propNoGetter", "propTwo.innerProp")...
+ to: assertThat(object).extracting(type::getPropOne, it -> it.propNoGetter, it -> it.getPropTwo().getInnerProp())...
+ ```
diff --git a/build.gradle b/build.gradle
index 034885a..650a3b0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ plugins {
}
group 'de.platon42'
-version '0.2'
+version '0.3'
repositories {
mavenCentral()
@@ -18,7 +18,8 @@ repositories {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
- testCompile "org.assertj:assertj-core:3.11.1"
+ testCompile "org.assertj:assertj-core:3.12.2"
+ testCompile "org.assertj:assertj-guava:3.2.1"
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.0'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.4.0'
@@ -33,13 +34,19 @@ compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
intellij {
- version '2018.3.4'
+ version '2019.1'
// pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)'
updateSinceUntilBuild false
}
patchPluginXml {
changeNotes """
+
V0.3 (xx-Apr-19)
+
+ - Internally: Upgraded to AssertJ 13.2.2.
+
- Support for hasSizeLessThan(), hasSizeLessThanOrEqualTo(), hasSizeGreaterThanOrEqualTo(), and hasSizeGreaterThan() for AssertThatSizeInspection (with AssertJ >=13.2.0).
+
- Really fixed highlighting for JUnit conversion. Sorry.
+
V0.2 (01-Apr-19)
- Fixed descriptions and quick fix texts.
diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt
index e36f59d..7d561c7 100644
--- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt
+++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AbstractAssertJInspection.kt
@@ -2,10 +2,7 @@ package de.platon42.intellij.plugins.cajon.inspections
import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool
import com.intellij.codeInspection.ProblemsHolder
-import com.intellij.psi.CommonClassNames
-import com.intellij.psi.JavaPsiFacade
-import com.intellij.psi.PsiCapturedWildcardType
-import com.intellij.psi.PsiMethodCallExpression
+import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiTypesUtil
import com.siyeh.ig.callMatcher.CallMatcher
@@ -133,4 +130,12 @@ open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
val constantEvaluationHelper = JavaPsiFacade.getInstance(expression.project).constantEvaluationHelper
return constantEvaluationHelper.computeConstantExpression(valueExpression)
}
+
+ protected fun hasAssertJMethod(element: PsiElement, classAndMethod: String): Boolean {
+ val classname = "org.assertj.core.api.${classAndMethod.substringBeforeLast(".")}"
+ val findClass =
+ JavaPsiFacade.getInstance(element.project).findClass(classname, GlobalSearchScope.allScope(element.project))
+ ?: return false
+ return findClass.findMethodsByName(classAndMethod.substringAfterLast(".")).isNotEmpty()
+ }
}
\ No newline at end of file
diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt
index fd858dc..ae0e333 100644
--- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt
+++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspection.kt
@@ -53,6 +53,19 @@ class AssertThatSizeInspection : AbstractAssertJInspection() {
registerSizeMethod(holder, expression, expectedCallExpression, "isNotEmpty()", noExpectedExpression = true)
return
}
+ // new stuff in AssertJ 13.2.0
+ if (hasAssertJMethod(expression, "AbstractIterableAssert.hasSizeLessThan")) {
+ val matchedMethod = listOf(
+ Pair(IS_GREATER_THAN_INT, "hasSizeGreaterThan()"),
+ Pair(IS_GREATER_THAN_OR_EQUAL_TO_INT, "hasSizeGreaterThanOrEqualTo()"),
+ Pair(IS_LESS_THAN_OR_EQUAL_TO_INT, "hasSizeLessThanOrEqualTo()"),
+ Pair(IS_LESS_THAN_INT, "hasSizeLessThan()")
+ ).find { it.first.test(expectedCallExpression) }?.second
+ if (matchedMethod != null) {
+ registerSizeMethod(holder, expression, expectedCallExpression, matchedMethod)
+ return
+ }
+ }
}
}
}
diff --git a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt
index b3bbcb9..78c49cb 100644
--- a/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt
+++ b/src/main/java/de/platon42/intellij/plugins/cajon/inspections/JUnitAssertToAssertJInspection.kt
@@ -1,8 +1,6 @@
package de.platon42.intellij.plugins.cajon.inspections
-import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder
-import com.intellij.openapi.util.TextRange
import com.intellij.psi.CommonClassNames
import com.intellij.psi.JavaElementVisitor
import com.intellij.psi.PsiElementVisitor
@@ -147,8 +145,6 @@ class JUnitAssertToAssertJInspection : AbstractJUnitAssertInspection() {
holder.registerProblem(
expression,
message,
- ProblemHighlightType.INFORMATION,
- null as TextRange?,
ReplaceJUnitAssertMethodCallQuickFix(description, hasExpected, replacementMethod)
)
}
@@ -164,8 +160,6 @@ class JUnitAssertToAssertJInspection : AbstractJUnitAssertInspection() {
holder.registerProblem(
expression,
message,
- ProblemHighlightType.INFORMATION,
- null as TextRange?,
ReplaceJUnitDeltaAssertMethodCallQuickFix(description, replacementMethod)
)
}
diff --git a/src/test/java/de/platon42/intellij/jupiter/LightCodeInsightExtension.java b/src/test/java/de/platon42/intellij/jupiter/LightCodeInsightExtension.java
index 9ef2dcb..66a67f6 100644
--- a/src/test/java/de/platon42/intellij/jupiter/LightCodeInsightExtension.java
+++ b/src/test/java/de/platon42/intellij/jupiter/LightCodeInsightExtension.java
@@ -131,7 +131,6 @@ public class LightCodeInsightExtension implements ParameterResolver, AfterTestEx
VirtualFile jarFile = LocalFileSystem.getInstance().findFileByIoFile(jarPath.toFile());
myFixture.allowTreeAccessForFile(jarFile);
PsiTestUtil.addLibrary(
- myFixture.getModule(),
model,
jarPath.getFileName().toString().replace(".jar", ""),
jarPath.getParent().toString(),
diff --git a/src/test/java/de/platon42/intellij/playground/Playground.java b/src/test/java/de/platon42/intellij/playground/Playground.java
index c93ab5a..fc5fcac 100644
--- a/src/test/java/de/platon42/intellij/playground/Playground.java
+++ b/src/test/java/de/platon42/intellij/playground/Playground.java
@@ -4,9 +4,11 @@ import org.assertj.core.api.ListAssert;
import org.assertj.core.data.Offset;
import java.util.ArrayList;
+import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.Offset.offset;
+import static org.assertj.guava.api.Assertions.assertThat;
import static org.junit.Assert.*;
public class Playground {
@@ -27,6 +29,7 @@ public class Playground {
assertThat(new ArrayList().size()).isEqualTo(1);
assertThat(new ArrayList().size()).isGreaterThanOrEqualTo(1);
assertThat(new ArrayList().size()).isZero();
+ assertThat(new ArrayList()).hasSizeGreaterThan(1);
assertThat(new ArrayList()).hasSameSizeAs(new ArrayList<>());
assertThat(new Long[1]).as("etc").hasSameSizeAs(new Long[2]);
}
@@ -75,6 +78,30 @@ public class Playground {
assertThat(foo).hasSize(0);
}
+ private void java8Optional() {
+ Optional foo = Optional.empty();
+ assertThat(foo.get()).isEqualTo("bla");
+ assertThat(foo).contains("bla");
+ assertThat(foo.isPresent()).isTrue();
+ assertThat(!foo.isPresent()).isFalse();
+ assertThat(foo).isPresent();
+ assertThat(foo.isPresent()).isFalse();
+ assertThat(!foo.isPresent()).isTrue();
+ assertThat(foo).isNotPresent();
+ }
+
+ private void guavaOptional() {
+ com.google.common.base.Optional foo = com.google.common.base.Optional.absent();
+ assertThat(foo.get()).isEqualTo("bla");
+ assertThat(foo).contains("bla");
+ assertThat(foo.isPresent()).isTrue();
+ assertThat(!foo.isPresent()).isFalse();
+ assertThat(foo).isPresent();
+ assertThat(foo.isPresent()).isFalse();
+ assertThat(!foo.isPresent()).isTrue();
+ assertThat(foo).isAbsent();
+ }
+
private void junitAssertions() {
assertTrue(true);
assertTrue("message", true);
@@ -183,6 +210,8 @@ public class Playground {
assertThat(new double[1]).as("array equals").containsExactly(new double[2], offset(1.0));
assertThat(new float[1]).containsExactly(new float[2], offset(1.0f));
assertThat(new float[1]).as("array equals").containsExactly(new float[2], offset(1.0f));
+
+ assertThat(new Object()).extracting(Object::toString, Object::hashCode);
}
}
diff --git a/src/test/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspectionTest.kt b/src/test/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspectionTest.kt
index bb0b2a6..bf894dc 100644
--- a/src/test/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspectionTest.kt
+++ b/src/test/java/de/platon42/intellij/plugins/cajon/inspections/AssertThatSizeInspectionTest.kt
@@ -14,7 +14,7 @@ internal class AssertThatSizeInspectionTest : AbstractCajonTest() {
runTest {
myFixture.enableInspections(AssertThatSizeInspection::class.java)
myFixture.configureByFile("AssertThatSizeBefore.java")
- executeQuickFixes(myFixture, Regex("Replace .*"), 20)
+ executeQuickFixes(myFixture, Regex("Replace .*"), 28)
myFixture.checkResultByFile("AssertThatSizeAfter.java")
}
}
diff --git a/src/test/resources/inspections/AssertThatSize/AssertThatSizeAfter.java b/src/test/resources/inspections/AssertThatSize/AssertThatSizeAfter.java
index e262639..ddabb49 100644
--- a/src/test/resources/inspections/AssertThatSize/AssertThatSizeAfter.java
+++ b/src/test/resources/inspections/AssertThatSize/AssertThatSizeAfter.java
@@ -2,7 +2,7 @@ import java.util.ArrayList;
import static org.assertj.core.api.Assertions.assertThat;
-public class assertThatSize {
+public class AssertThatSize {
private void assertThatSize() {
ArrayList list = new ArrayList<>();
@@ -20,6 +20,10 @@ public class assertThatSize {
assertThat(list).hasSameSizeAs(otherList);
assertThat(list).hasSameSizeAs(array);
assertThat(list).hasSize(1);
+ assertThat(list).hasSizeGreaterThan(list.size() * 2);
+ assertThat(list).hasSizeGreaterThanOrEqualTo(list.size() * 2);
+ assertThat(list).hasSizeLessThan(list.size() * 2);
+ assertThat(list).hasSizeLessThanOrEqualTo(list.size() * 2);
assertThat(array).isEmpty();
assertThat(array).isEmpty();
@@ -31,5 +35,9 @@ public class assertThatSize {
assertThat(array).hasSameSizeAs(list);
assertThat(array).hasSameSizeAs(otherArray);
assertThat(array).hasSize(1);
+ assertThat(array).hasSizeGreaterThan(otherArray.length - 1);
+ assertThat(array).hasSizeGreaterThanOrEqualTo(otherArray.length + 1);
+ assertThat(array).hasSizeLessThan(otherArray.length - 3);
+ assertThat(array).hasSizeLessThanOrEqualTo(1 - otherArray.length);
}
}
diff --git a/src/test/resources/inspections/AssertThatSize/AssertThatSizeBefore.java b/src/test/resources/inspections/AssertThatSize/AssertThatSizeBefore.java
index f38046b..808169a 100644
--- a/src/test/resources/inspections/AssertThatSize/AssertThatSizeBefore.java
+++ b/src/test/resources/inspections/AssertThatSize/AssertThatSizeBefore.java
@@ -2,7 +2,7 @@ import java.util.ArrayList;
import static org.assertj.core.api.Assertions.assertThat;
-public class assertThatSize {
+public class AssertThatSize {
private void assertThatSize() {
ArrayList list = new ArrayList<>();
@@ -20,6 +20,10 @@ public class assertThatSize {
assertThat(list.size()).isEqualTo(otherList.size());
assertThat(list.size()).isEqualTo(array.length);
assertThat(list.size()).isEqualTo(1);
+ assertThat(list.size()).isGreaterThan(list.size() * 2);
+ assertThat(list.size()).isGreaterThanOrEqualTo(list.size() * 2);
+ assertThat(list.size()).isLessThan(list.size() * 2);
+ assertThat(list.size()).isLessThanOrEqualTo(list.size() * 2);
assertThat(array.length).isEqualTo(0);
assertThat(array.length).isZero();
@@ -31,5 +35,9 @@ public class assertThatSize {
assertThat(array.length).isEqualTo(list.size());
assertThat(array.length).isEqualTo(otherArray.length);
assertThat(array.length).isEqualTo(1);
+ assertThat(array.length).isGreaterThan(otherArray.length - 1);
+ assertThat(array.length).isGreaterThanOrEqualTo(otherArray.length + 1);
+ assertThat(array.length).isLessThan(otherArray.length - 3);
+ assertThat(array.length).isLessThanOrEqualTo(1 - otherArray.length);
}
}