Initial check-in with two inspections working.
This commit is contained in:
parent
39ba01adec
commit
80104004d0
10
.idea/codeStyles/Project.xml
Normal file
10
.idea/codeStyles/Project.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<JetCodeStyleSettings>
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
</JetCodeStyleSettings>
|
||||
<codeStyleSettings language="kotlin">
|
||||
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
Normal file
@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</state>
|
||||
</component>
|
20
.idea/saveactions_settings.xml
Normal file
20
.idea/saveactions_settings.xml
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="SaveActionSettings">
|
||||
<option name="actions">
|
||||
<set>
|
||||
<option value="activate" />
|
||||
<option value="organizeImports" />
|
||||
<option value="reformat" />
|
||||
<option value="missingOverrideAnnotation" />
|
||||
<option value="unnecessaryThis" />
|
||||
<option value="finalPrivateMethod" />
|
||||
<option value="unnecessaryFinalOnLocalVariableOrParameter" />
|
||||
<option value="explicitTypeCanBeDiamond" />
|
||||
<option value="suppressAnnotation" />
|
||||
<option value="unnecessarySemicolon" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="configurationPath" value="" />
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
66
README.md
66
README.md
@ -1,2 +1,64 @@
|
||||
# ConciseAssertJPlugin
|
||||
IntelliJ Plugin for shortening and optimizing AssertJ assertions.
|
||||
# Cajon - Concise AssertJ Optimizing Nitpicker
|
||||
|
||||
Cajon is an IntelliJ Plugin for shortening and optimizing AssertJ assertions.
|
||||
|
||||
## Why?
|
||||
|
||||
First, code is easier to read, when is concise and reflects the intention clearly.
|
||||
AssertJ has plenty of different convenience methods that make describing the various intentions.
|
||||
Why write longer, more complex code that can be expressed in brevity?
|
||||
|
||||
Second, AssertJ is able to output more meaningful descriptions when an assertion fails.
|
||||
This makes finding bugs and fixing failed tests easier.
|
||||
|
||||
## Implemented
|
||||
|
||||
- AssertThatObjectIsNull
|
||||
> from: assertThat(object).isEqualTo(null);
|
||||
> to: assertThat(object).isNull();
|
||||
- AssertThatObjectIsNotNull
|
||||
> from: assertThat(object).isNotEqualTo(null);
|
||||
> to: assertThat(object).isNotNull();
|
||||
|
||||
## TODO
|
||||
- AssertThatBooleanIsTrueOrFalse
|
||||
> from: assertThat(booleanValue).isEqualTo(true/false/Boolean.TRUE/Boolean.FALSE);
|
||||
> to: assertThat(booleanValue).isTrue()/isFalse();
|
||||
- AssertThatStringEmpty
|
||||
> from: assertThat(string).isEqualTo("")
|
||||
> to: assertThat(string).isEmpty();
|
||||
- AssertThatArrayHasLiteralSize
|
||||
> from: assertThat(array.length).isEqualTo(literal); literal > 0
|
||||
> to: assertThat(array).hasSize(literal);
|
||||
- AssertThatArrayHasEqualSize
|
||||
> from: assertThat(array.length).isEqualTo(anotherArray.length);
|
||||
> to: assertThat(array).hasSameSizeAs(anotherArray);
|
||||
> from: assertThat(array.length).isEqualTo(iterable.size());
|
||||
> to: assertThat(array).hasSameSizeAs(iterable);
|
||||
- AssertThatArrayIsEmpty
|
||||
> from: assertThat(array.length).isEqualTo(0);
|
||||
> from: assertThat(array.length).isLessThanOrEqualTo(0);
|
||||
> from: assertThat(array.length).isLessThan(1);
|
||||
> from: assertThat(array).hasSize(0);
|
||||
> to: assertThat(array).isEmpty();
|
||||
- AssertThatArrayIsNotEmpty
|
||||
> from: assertThat(array.length).isGreaterThan(0);
|
||||
> to: assertThat(array).isNotEmpty();
|
||||
- AssertThatIterableHasLiteralSize
|
||||
> from: assertThat(iterable.size()).isEqualTo(literal); literal > 0
|
||||
> to: assertThat(iterable).hasSize(literal);
|
||||
- AssertThatIterableHasEqualSize
|
||||
> from: assertThat(iterable.size()).isEqualTo(anotherArray.length);
|
||||
> to: assertThat(iterable).hasSameSizeAs(anotherArray);
|
||||
> from: assertThat(iterable.size()).isEqualTo(iterable.size());
|
||||
> to: assertThat(iterable).hasSameSizeAs(iterable);
|
||||
- AssertThatIterableIsNotEmpty
|
||||
> from: assertThat(array.length).isGreaterThan(0);
|
||||
> from: assertThat(array.length).isGreaterThanOrEqualTo(1);
|
||||
> to: assertThat(array).isNotEmpty();
|
||||
- AssertThatIterableIsEmpty
|
||||
> from: assertThat(iterable.size()).isEqualTo(0);
|
||||
> from: assertThat(iterable.size()).isLessThanOrEqualTo(0);
|
||||
> from: assertThat(iterable.size()).isLessThan(1);
|
||||
> from: assertThat(iterable).hasSize(0);
|
||||
> to: assertThat(iterable).isEmpty();
|
||||
|
55
build.gradle
Normal file
55
build.gradle
Normal file
@ -0,0 +1,55 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'org.jetbrains.intellij' version '0.4.3'
|
||||
id 'org.jetbrains.kotlin.jvm' version '1.3.21'
|
||||
}
|
||||
|
||||
group 'de.platon42'
|
||||
version '1.0-SNAPSHOT'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
/*
|
||||
To run tests in IntelliJ use these VM Options for run configuration
|
||||
-ea -Didea.system.path=build/idea-sandbox/system-test -Didea.config.path=build/idea-sandbox/config-test -Didea.plugins.path=build/idea-sandbox/plugins-test
|
||||
*/
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
|
||||
testCompile "org.assertj:assertj-core:3.11.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'
|
||||
testImplementation "org.jetbrains.kotlin:kotlin-test"
|
||||
testImplementation "org.jetbrains.kotlin:kotlin-test-junit"
|
||||
}
|
||||
|
||||
compileKotlin {
|
||||
kotlinOptions.jvmTarget = "1.8"
|
||||
}
|
||||
compileTestKotlin {
|
||||
kotlinOptions.jvmTarget = "1.8"
|
||||
}
|
||||
intellij {
|
||||
version '2018.3.4'
|
||||
// pluginName 'Concise AssertJ Optimizing Nitpicker (Cajon)'
|
||||
updateSinceUntilBuild false
|
||||
}
|
||||
|
||||
patchPluginXml {
|
||||
changeNotes """
|
||||
<h2>V0.1 (10-Mar-2019)
|
||||
<ul>
|
||||
<li>Initial release.
|
||||
</ul>
|
||||
"""
|
||||
}
|
||||
|
||||
test {
|
||||
useJUnitPlatform()
|
||||
// testLogging {
|
||||
// events "passed", "skipped", "failed"
|
||||
// }
|
||||
}
|
2
gradle.properties
Normal file
2
gradle.properties
Normal file
@ -0,0 +1,2 @@
|
||||
kotlin.code.style=official
|
||||
kotlin.incremental=true
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
#Thu Feb 21 17:35:51 CET 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
|
172
gradlew
vendored
Executable file
172
gradlew
vendored
Executable file
@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
84
gradlew.bat
vendored
Normal file
84
gradlew.bat
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
2
settings.gradle
Normal file
2
settings.gradle
Normal file
@ -0,0 +1,2 @@
|
||||
rootProject.name = 'cajon-plugin'
|
||||
|
@ -0,0 +1,23 @@
|
||||
package de.platon42.intellij.plugins.cajon.inspections
|
||||
|
||||
import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool
|
||||
import com.intellij.psi.CommonClassNames
|
||||
import com.siyeh.ig.callMatcher.CallMatcher
|
||||
|
||||
open class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool() {
|
||||
|
||||
companion object {
|
||||
private const val ABSTRACT_ASSERT_CLASSNAME = "org.assertj.core.api.AbstractAssert"
|
||||
private const val IS_EQUAL_TO = "isEqualTo"
|
||||
private const val IS_NOT_EQUAL_TO = "isNotEqualTo"
|
||||
|
||||
val IS_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ABSTRACT_ASSERT_CLASSNAME, IS_EQUAL_TO)
|
||||
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
|
||||
val IS_NOT_EQUAL_TO_OBJECT = CallMatcher.instanceCall(ABSTRACT_ASSERT_CLASSNAME, IS_NOT_EQUAL_TO)
|
||||
.parameterTypes(CommonClassNames.JAVA_LANG_OBJECT)!!
|
||||
}
|
||||
|
||||
override fun getGroupDisplayName(): String {
|
||||
return "AssertJ"
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package de.platon42.intellij.plugins.cajon.inspections
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix
|
||||
import com.intellij.codeInspection.ProblemDescriptor
|
||||
import com.intellij.codeInspection.ProblemHighlightType
|
||||
import com.intellij.codeInspection.ProblemsHolder
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.annotations.NonNls
|
||||
|
||||
class AssertThatObjectIsNotNullInspection : AbstractAssertJInspection() {
|
||||
|
||||
companion object {
|
||||
@NonNls
|
||||
private val DISPLAY_NAME = "Comparing to non-null"
|
||||
|
||||
@NonNls
|
||||
private val INSPECTION_MESSAGE = "isNotEqualTo(null) can be simplified to isNotNull()"
|
||||
|
||||
@NonNls
|
||||
private val QUICKFIX_DESCRIPTION = "Replace isNotEqualTo(null) with isNotNull()"
|
||||
}
|
||||
|
||||
override fun getDisplayName() = DISPLAY_NAME
|
||||
|
||||
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
|
||||
return object : JavaElementVisitor() {
|
||||
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
|
||||
super.visitMethodCallExpression(expression)
|
||||
if (!IS_NOT_EQUAL_TO_OBJECT.test(expression)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (expression.argumentList.expressions[0].type == PsiType.NULL) {
|
||||
holder.registerProblem(
|
||||
expression,
|
||||
INSPECTION_MESSAGE,
|
||||
ProblemHighlightType.INFORMATION,
|
||||
null as TextRange?,
|
||||
ReplaceWithIsNotNullQuickFix()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ReplaceWithIsNotNullQuickFix : LocalQuickFix {
|
||||
override fun getFamilyName() = QUICKFIX_DESCRIPTION
|
||||
|
||||
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
|
||||
val element = descriptor.startElement
|
||||
val factory = JavaPsiFacade.getElementFactory(element.project)
|
||||
val methodCallExpression = element as? PsiMethodCallExpression ?: return
|
||||
val oldQualifier = methodCallExpression.methodExpression.qualifierExpression ?: return
|
||||
val isNotNullExpression =
|
||||
factory.createExpressionFromText("a.isNotNull()", null) as PsiMethodCallExpression
|
||||
isNotNullExpression.methodExpression.qualifierExpression!!.replace(oldQualifier)
|
||||
element.replace(isNotNullExpression)
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package de.platon42.intellij.plugins.cajon.inspections
|
||||
|
||||
import com.intellij.codeInspection.LocalQuickFix
|
||||
import com.intellij.codeInspection.ProblemDescriptor
|
||||
import com.intellij.codeInspection.ProblemHighlightType
|
||||
import com.intellij.codeInspection.ProblemsHolder
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.annotations.NonNls
|
||||
|
||||
class AssertThatObjectIsNullInspection : AbstractAssertJInspection() {
|
||||
|
||||
companion object {
|
||||
@NonNls
|
||||
private val DISPLAY_NAME = "Comparing to null"
|
||||
|
||||
@NonNls
|
||||
private val INSPECTION_MESSAGE = "isEqualTo(null) can be simplified to isNull()"
|
||||
|
||||
@NonNls
|
||||
private val QUICKFIX_DESCRIPTION = "Replace isEqualTo(null) with isNull()"
|
||||
}
|
||||
|
||||
override fun getDisplayName() = DISPLAY_NAME
|
||||
|
||||
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
|
||||
return object : JavaElementVisitor() {
|
||||
override fun visitMethodCallExpression(expression: PsiMethodCallExpression) {
|
||||
super.visitMethodCallExpression(expression)
|
||||
if (!IS_EQUAL_TO_OBJECT.test(expression)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (expression.argumentList.expressions[0].type == PsiType.NULL) {
|
||||
holder.registerProblem(
|
||||
expression,
|
||||
INSPECTION_MESSAGE,
|
||||
ProblemHighlightType.INFORMATION,
|
||||
null as TextRange?,
|
||||
ReplaceWithIsNullQuickFix()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ReplaceWithIsNullQuickFix : LocalQuickFix {
|
||||
override fun getFamilyName() = QUICKFIX_DESCRIPTION
|
||||
|
||||
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
|
||||
val element = descriptor.startElement
|
||||
val factory = JavaPsiFacade.getElementFactory(element.project)
|
||||
val methodCallExpression = element as? PsiMethodCallExpression ?: return
|
||||
val oldQualifier = methodCallExpression.methodExpression.qualifierExpression ?: return
|
||||
val isNullExpression =
|
||||
factory.createExpressionFromText("a.isNull()", null) as PsiMethodCallExpression
|
||||
isNullExpression.methodExpression.qualifierExpression!!.replace(oldQualifier)
|
||||
element.replace(isNullExpression)
|
||||
}
|
||||
}
|
||||
}
|
29
src/main/resources/META-INF/plugin.xml
Normal file
29
src/main/resources/META-INF/plugin.xml
Normal file
@ -0,0 +1,29 @@
|
||||
<idea-plugin>
|
||||
<id>de.platon42.cajon</id>
|
||||
<name>Concise AssertJ Optimizing Nitpicker (Cajon)</name>
|
||||
<vendor email="chrisly@platon42.de" url="http://platon42.de">Platon Computer Products</vendor>
|
||||
|
||||
<description><![CDATA[
|
||||
This plugin will add inspections and quick fixes to fully make use of the AssertJ methods
|
||||
to make the intention clear and concise.
|
||||
]]></description>
|
||||
|
||||
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
|
||||
<idea-version since-build="182.0"/>
|
||||
|
||||
<!-- 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.platform</depends>
|
||||
<depends>com.intellij.modules.java</depends>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<localInspection groupPath="Java" shortName="AssertThatObjectIsNull" enabledByDefault="true" level="WARNING"
|
||||
implementationClass="de.platon42.intellij.plugins.cajon.inspections.AssertThatObjectIsNullInspection"/>
|
||||
<localInspection groupPath="Java" shortName="AssertThatObjectIsNotNull" enabledByDefault="true" level="WARNING"
|
||||
implementationClass="de.platon42.intellij.plugins.cajon.inspections.AssertThatObjectIsNotNullInspection"/>
|
||||
</extensions>
|
||||
|
||||
<actions>
|
||||
</actions>
|
||||
</idea-plugin>
|
@ -0,0 +1,6 @@
|
||||
<html>
|
||||
<body>
|
||||
Turns assertThat(object).isNotEqualTo(null) into assertThat(object).isNotNull().
|
||||
<!-- tooltip end -->
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,6 @@
|
||||
<html>
|
||||
<body>
|
||||
Turns assertThat(object).isEqualTo(null) into assertThat(object).isNull().
|
||||
<!-- tooltip end -->
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,10 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Inherited
|
||||
public @interface AddLocalJarToModule {
|
||||
Class[] value();
|
||||
}
|
@ -0,0 +1,170 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl;
|
||||
import com.intellij.openapi.roots.ContentEntry;
|
||||
import com.intellij.openapi.roots.ModifiableRootModel;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.testFramework.LightProjectDescriptor;
|
||||
import com.intellij.testFramework.PsiTestUtil;
|
||||
import com.intellij.testFramework.UsefulTestCase;
|
||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture;
|
||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.junit.jupiter.api.extension.*;
|
||||
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
|
||||
import org.junit.jupiter.api.extension.ExtensionContext.Store;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Parameter;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public class LightCodeInsightExtension implements ParameterResolver, AfterTestExecutionCallback {
|
||||
|
||||
private static final Logger LOG = Logger.getLogger(LightCodeInsightExtension.class.getName());
|
||||
|
||||
@Override
|
||||
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
|
||||
Parameter parameter = parameterContext.getParameter();
|
||||
return parameter.isAnnotationPresent(MyFixture.class)
|
||||
|| parameter.isAnnotationPresent(MyTestCase.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
|
||||
LightCodeInsightFixtureTestCaseWrapper testCase = getWrapper(extensionContext);
|
||||
Parameter parameter = parameterContext.getParameter();
|
||||
if (parameter.isAnnotationPresent(MyFixture.class)) {
|
||||
return testCase.getMyFixture();
|
||||
} else if (parameter.isAnnotationPresent(MyTestCase.class)) {
|
||||
return testCase;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private LightCodeInsightFixtureTestCaseWrapper getWrapper(ExtensionContext extensionContext) {
|
||||
Store store = getStore(extensionContext);
|
||||
return (LightCodeInsightFixtureTestCaseWrapper) store.getOrComputeIfAbsent("testCase",
|
||||
key -> {
|
||||
LightCodeInsightFixtureTestCaseWrapper wrapper = new LightCodeInsightFixtureTestCaseWrapper(extensionContext);
|
||||
try {
|
||||
wrapper.setUp();
|
||||
} catch (Exception e) {
|
||||
LOG.severe("Exception during setUp(): " + e);
|
||||
throw new IllegalStateException("Exception during setUp()", e);
|
||||
}
|
||||
return wrapper;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTestExecution(ExtensionContext context) throws Exception {
|
||||
Store store = getStore(context);
|
||||
LightCodeInsightFixtureTestCaseWrapper testCase = (LightCodeInsightFixtureTestCaseWrapper) store.get("testCase");
|
||||
if (testCase != null) {
|
||||
testCase.tearDown();
|
||||
}
|
||||
}
|
||||
|
||||
private static Store getStore(ExtensionContext context) {
|
||||
return context.getStore(Namespace.create(LightCodeInsightExtension.class, context.getRequiredTestMethod()));
|
||||
}
|
||||
|
||||
private static class LightCodeInsightFixtureTestCaseWrapper extends LightCodeInsightFixtureTestCase {
|
||||
private final ExtensionContext extensionContext;
|
||||
|
||||
private LightCodeInsightFixtureTestCaseWrapper(ExtensionContext extensionContext) {
|
||||
this.extensionContext = extensionContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tearDown() throws Exception {
|
||||
super.tearDown();
|
||||
UsefulTestCase.clearFields(this);
|
||||
if (myFixture != null && getProject() != null && !getProject().isDisposed()) {
|
||||
Disposer.dispose(getProject());
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected LightProjectDescriptor getProjectDescriptor() {
|
||||
TestJdk testJdk = getMethodOrClassAnnotation(TestJdk.class);
|
||||
if (testJdk == null) {
|
||||
return super.getProjectDescriptor();
|
||||
}
|
||||
return new ProjectDescriptor(testJdk.value(), testJdk.annotations()) {
|
||||
@Override
|
||||
public Sdk getSdk() {
|
||||
return testJdk.useInternal()
|
||||
? JavaAwareProjectJdkTableImpl.getInstanceEx().getInternalJdk()
|
||||
: super.getSdk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ContentEntry contentEntry) {
|
||||
super.configureModule(module, model, contentEntry);
|
||||
AddLocalJarToModule methodOrClassAnnotation = getMethodOrClassAnnotation(AddLocalJarToModule.class);
|
||||
if (methodOrClassAnnotation != null) {
|
||||
Stream.of(methodOrClassAnnotation.value()).forEach(it -> addJarContaining(model, it));
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected void addJarContaining(ModifiableRootModel model, Class clazz) {
|
||||
try {
|
||||
Path jarPath = Paths.get(clazz.getProtectionDomain().getCodeSource().getLocation().toURI());
|
||||
|
||||
VirtualFile jarFile = LocalFileSystem.getInstance().findFileByIoFile(jarPath.toFile());
|
||||
myFixture.allowTreeAccessForFile(jarFile);
|
||||
PsiTestUtil.addLibrary(
|
||||
myFixture.getModule(),
|
||||
model,
|
||||
jarPath.getFileName().toString().replace(".jar", ""),
|
||||
jarPath.getParent().toString(),
|
||||
jarPath.getFileName().toString()
|
||||
);
|
||||
} catch (URISyntaxException e) {
|
||||
throw new IllegalArgumentException("Class URL malformed", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTestDataPath() {
|
||||
TestDataPath testDataPath = getMethodOrClassAnnotation(TestDataPath.class);
|
||||
if (testDataPath == null) {
|
||||
return super.getTestDataPath();
|
||||
}
|
||||
TestDataSubPath testDataSubPath = getMethodOrClassAnnotation(TestDataSubPath.class);
|
||||
if (testDataSubPath == null) {
|
||||
return testDataPath.value();
|
||||
}
|
||||
return Paths.get(testDataPath.value(), testDataSubPath.value()).toString();
|
||||
}
|
||||
|
||||
public JavaCodeInsightTestFixture getMyFixture() {
|
||||
return myFixture;
|
||||
}
|
||||
|
||||
private <T extends Annotation> T getMethodOrClassAnnotation(Class<T> clazz) {
|
||||
T annotation = extensionContext.getRequiredTestMethod().getAnnotation(clazz);
|
||||
if (annotation == null) {
|
||||
annotation = extensionContext.getRequiredTestClass().getAnnotation(clazz);
|
||||
}
|
||||
return annotation;
|
||||
}
|
||||
}
|
||||
}
|
11
src/test/java/de/platon42/intellij/jupiter/MyFixture.java
Normal file
11
src/test/java/de/platon42/intellij/jupiter/MyFixture.java
Normal file
@ -0,0 +1,11 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.PARAMETER)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface MyFixture {
|
||||
}
|
11
src/test/java/de/platon42/intellij/jupiter/MyTestCase.java
Normal file
11
src/test/java/de/platon42/intellij/jupiter/MyTestCase.java
Normal file
@ -0,0 +1,11 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.PARAMETER)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface MyTestCase {
|
||||
}
|
10
src/test/java/de/platon42/intellij/jupiter/TestDataPath.java
Normal file
10
src/test/java/de/platon42/intellij/jupiter/TestDataPath.java
Normal file
@ -0,0 +1,10 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Inherited
|
||||
public @interface TestDataPath {
|
||||
String value();
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Inherited
|
||||
public @interface TestDataSubPath {
|
||||
String value();
|
||||
}
|
16
src/test/java/de/platon42/intellij/jupiter/TestJdk.java
Normal file
16
src/test/java/de/platon42/intellij/jupiter/TestJdk.java
Normal file
@ -0,0 +1,16 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import com.intellij.pom.java.LanguageLevel;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Inherited
|
||||
public @interface TestJdk {
|
||||
LanguageLevel value();
|
||||
|
||||
boolean annotations() default false;
|
||||
|
||||
boolean useInternal() default false;
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package de.platon42.intellij.jupiter;
|
||||
|
||||
import com.intellij.testFramework.EdtTestUtilKt;
|
||||
import com.intellij.testFramework.TestLoggerFactory;
|
||||
import com.intellij.testFramework.fixtures.IdeaTestExecutionPolicy;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
// See https://github.com/junit-team/junit5/issues/157
|
||||
public class WorkaroundUntilJupiterGetsExecutorProvider {
|
||||
|
||||
protected static void runTest(Runnable test) throws Throwable {
|
||||
Throwable[] throwables = new Throwable[1];
|
||||
|
||||
Runnable runnable = () -> {
|
||||
try {
|
||||
TestLoggerFactory.onTestStarted();
|
||||
test.run();
|
||||
TestLoggerFactory.onTestFinished(true);
|
||||
} catch (Throwable e) {
|
||||
TestLoggerFactory.onTestFinished(false);
|
||||
e.fillInStackTrace();
|
||||
throwables[0] = e;
|
||||
}
|
||||
};
|
||||
|
||||
invokeTestRunnable(runnable);
|
||||
|
||||
if (throwables[0] != null) {
|
||||
throw throwables[0];
|
||||
}
|
||||
}
|
||||
|
||||
private static void invokeTestRunnable(@NotNull Runnable runnable) {
|
||||
IdeaTestExecutionPolicy policy = IdeaTestExecutionPolicy.current();
|
||||
if (policy != null && !policy.runInDispatchThread()) {
|
||||
runnable.run();
|
||||
} else {
|
||||
EdtTestUtilKt.runInEdtAndWait(() -> {
|
||||
runnable.run();
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package de.platon42.intellij.playground;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class Playground {
|
||||
|
||||
private void sizeOfList() {
|
||||
assertThat(new ArrayList<>().size()).isEqualTo(1);
|
||||
}
|
||||
|
||||
private void sizeOfArray() {
|
||||
assertThat(new String[1].length).isLessThanOrEqualTo(1);
|
||||
assertThat(new String[1]).hasSameSizeAs(new Object());
|
||||
assertThat("").isEqualTo(null);
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
package de.platon42.intellij.plugins.cajon
|
||||
|
||||
import com.intellij.pom.java.LanguageLevel
|
||||
import com.intellij.testFramework.TestLoggerFactory
|
||||
import com.intellij.testFramework.fixtures.IdeaTestExecutionPolicy
|
||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||
import com.intellij.testFramework.runInEdtAndWait
|
||||
import de.platon42.intellij.jupiter.AddLocalJarToModule
|
||||
import de.platon42.intellij.jupiter.LightCodeInsightExtension
|
||||
import de.platon42.intellij.jupiter.TestDataPath
|
||||
import de.platon42.intellij.jupiter.TestJdk
|
||||
import org.assertj.core.api.Assertions
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.extension.ExtendWith
|
||||
import java.lang.reflect.InvocationTargetException
|
||||
|
||||
@ExtendWith(LightCodeInsightExtension::class)
|
||||
@TestDataPath("src/test/resources")
|
||||
@TestJdk(LanguageLevel.JDK_1_8, annotations = true, useInternal = true)
|
||||
@AddLocalJarToModule(Assertions::class)
|
||||
abstract class AbstractCajonTest {
|
||||
|
||||
// See https://github.com/junit-team/junit5/issues/157
|
||||
protected fun runTest(body: () -> Unit) {
|
||||
val throwables = arrayOfNulls<Throwable>(1)
|
||||
|
||||
invokeTestRunnable {
|
||||
try {
|
||||
TestLoggerFactory.onTestStarted()
|
||||
body()
|
||||
TestLoggerFactory.onTestFinished(true)
|
||||
} catch (e: InvocationTargetException) {
|
||||
TestLoggerFactory.onTestFinished(false)
|
||||
e.fillInStackTrace()
|
||||
throwables[0] = e.targetException
|
||||
} catch (e: IllegalAccessException) {
|
||||
TestLoggerFactory.onTestFinished(false)
|
||||
e.fillInStackTrace()
|
||||
throwables[0] = e
|
||||
} catch (e: Throwable) {
|
||||
TestLoggerFactory.onTestFinished(false)
|
||||
throwables[0] = e
|
||||
}
|
||||
}
|
||||
|
||||
if (throwables[0] != null) {
|
||||
throw throwables[0]!!
|
||||
}
|
||||
}
|
||||
|
||||
private fun invokeTestRunnable(runnable: () -> Unit) {
|
||||
val policy = IdeaTestExecutionPolicy.current()
|
||||
if (policy != null && !policy.runInDispatchThread()) {
|
||||
runnable()
|
||||
} else {
|
||||
runInEdtAndWait {
|
||||
runnable()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected fun executeQuickFixes(myFixture: JavaCodeInsightTestFixture, expectedFixes: Int) {
|
||||
val quickfixes = myFixture.getAllQuickFixes()
|
||||
assertThat(quickfixes).hasSize(expectedFixes)
|
||||
quickfixes.forEach(myFixture::launchAction)
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
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 AssertThatObjectIsNotNullInspectionTest : AbstractCajonTest() {
|
||||
|
||||
@Test
|
||||
@TestDataSubPath("inspections/ObjectIsNotNull")
|
||||
internal fun assertThat_with_isNotEqualTo_null_can_use_isNotNull(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||
runTest {
|
||||
myFixture.enableInspections(AssertThatObjectIsNotNullInspection::class.java)
|
||||
myFixture.configureByFile("ObjectIsNotNullBefore.java")
|
||||
executeQuickFixes(myFixture, 3)
|
||||
myFixture.checkResultByFile("ObjectIsNotNullAfter.java")
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
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 AssertThatObjectIsNullInspectionTest : AbstractCajonTest() {
|
||||
|
||||
@Test
|
||||
@TestDataSubPath("inspections/ObjectIsNull")
|
||||
internal fun assertThat_with_isEqualTo_null_can_use_isNull(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||
runTest {
|
||||
myFixture.enableInspections(AssertThatObjectIsNullInspection::class.java)
|
||||
myFixture.configureByFile("ObjectIsNullBefore.java")
|
||||
executeQuickFixes(myFixture, 3)
|
||||
myFixture.checkResultByFile("ObjectIsNullAfter.java")
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class ObjectIsNotNull {
|
||||
|
||||
private void objectIsNotNull() {
|
||||
assertThat("").isNotNull();
|
||||
assertThat("").as("nah").isNotNull();
|
||||
assertThat(new Object).isNotNull();
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class ObjectIsNotNull {
|
||||
|
||||
private void objectIsNotNull() {
|
||||
assertThat("").isNotEqualTo(null);
|
||||
assertThat("").as("nah").isNotEqualTo(null);
|
||||
assertThat(new Object).isNotEqualTo(null);
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class ObjectIsNull {
|
||||
|
||||
private void objectIsNull() {
|
||||
assertThat("").isNull();
|
||||
assertThat("").as("nah").isNull();
|
||||
assertThat(new Object).isNull();
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
public class ObjectIsNull {
|
||||
|
||||
private void objectIsNull() {
|
||||
assertThat("").isEqualTo(null);
|
||||
assertThat("").as("nah").isEqualTo(null);
|
||||
assertThat(new Object).isEqualTo(null);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user