Compare commits
No commits in common. "a71253142bb3f5d088fa3a34420696d7694cad2b" and "06b17d32ac55d34d76a9713e3a3f7d3b0ead04de" have entirely different histories.
a71253142b
...
06b17d32ac
@ -1,4 +1,4 @@
|
|||||||
Copyright 2019-2024 Chris Hodges <chrisly@platon42.de>
|
Copyright 2019-2022 Chris Hodges <chrisly@platon42.de>
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -10,4 +10,4 @@ Unless required by applicable law or agreed to in writing, software
|
|||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
139
README.md
139
README.md
@ -1,5 +1,4 @@
|
|||||||
# Cajon - Concise AssertJ Optimizing Nitpicker
|
# Cajon - Concise AssertJ Optimizing Nitpicker [![Build Status](https://app.travis-ci.com/chrisly42/cajon-plugin.svg?branch=master)](https://app.travis-ci.com/chrisly42/cajon-plugin) [![Coverage Status](https://coveralls.io/repos/github/chrisly42/cajon-plugin/badge.svg?branch=master)](https://coveralls.io/github/chrisly42/cajon-plugin?branch=master)
|
||||||
|
|
||||||
Cajon is an IntelliJ IDEA Plugin for shortening and optimizing [AssertJ](https://assertj.github.io/doc/) assertions.
|
Cajon is an IntelliJ IDEA Plugin for shortening and optimizing [AssertJ](https://assertj.github.io/doc/) assertions.
|
||||||
|
|
||||||
## Purpose
|
## Purpose
|
||||||
@ -40,15 +39,14 @@ Cajon also warns about bogus or incorrect uses of AssertJ.
|
|||||||
|
|
||||||
## Lookup and refactoring of string-based extracting()
|
## Lookup and refactoring of string-based extracting()
|
||||||
|
|
||||||
AssertJ
|
AssertJ allows [extracting POJO fields/properties on iterables/arrays](http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#extracted-properties-assertion).
|
||||||
allows [extracting POJO fields/properties on iterables/arrays](http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#extracted-properties-assertion).
|
|
||||||
|
|
||||||
Using strings is not safe for refactoring (and before Java 8 Lambdas were available,
|
Using strings is not safe for refactoring (and before Java 8 Lambdas were available,
|
||||||
creating extractor functions just for testing purpose was a bit too tedious).
|
creating extractor functions just for testing purpose was a bit too tedious).
|
||||||
|
|
||||||
This plugin adds support for referencing these fields (so you can ctrl(/cmd)-click on the
|
This plugin adds support for referencing these fields (so you can ctrl(/cmd)-click on the
|
||||||
string to go to the definition) and allows safe refactoring on the
|
string to go to the definition) and allows safe refactoring on the
|
||||||
fields (refactoring a getter method without a corresponding field will not work
|
fields (refactoring a getter method without a corresponding field will not work
|
||||||
correctly right now) too.
|
correctly right now) too.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@ -63,11 +61,10 @@ The plugin will report inspections in your opened editor file as warnings.
|
|||||||
You can then quick-fix these with your quick-fix hotkey (usually Alt-Return or Opt-Return).
|
You can then quick-fix these with your quick-fix hotkey (usually Alt-Return or Opt-Return).
|
||||||
|
|
||||||
Or, you can use the "Run Inspection by Name..." action to run one inspection on a bigger scope (e.g. the whole project).
|
Or, you can use the "Run Inspection by Name..." action to run one inspection on a bigger scope (e.g. the whole project).
|
||||||
Applying a quick fix might result in further optimization possibilities, so
|
Applying a quick fix might result in further optimization possibilities, so
|
||||||
you might need to perform a couple of fixes before you get to the final result.
|
you might need to perform a couple of fixes before you get to the final result.
|
||||||
|
|
||||||
Check out this example where every line represents the result after a Cajon quickfix:
|
Check out this example where every line represents the result after a Cajon quickfix:
|
||||||
|
|
||||||
```
|
```
|
||||||
assertFalse(!(array.length == collection.size()));
|
assertFalse(!(array.length == collection.size()));
|
||||||
|
|
||||||
@ -85,7 +82,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
## Implemented inspections and quickfixes
|
## Implemented inspections and quickfixes
|
||||||
|
|
||||||
- JoinAssertThatStatements
|
- JoinAssertThatStatements
|
||||||
|
|
||||||
Joins multiple ```assertThat()``` statements with same actual expression together.
|
Joins multiple ```assertThat()``` statements with same actual expression together.
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -100,16 +97,16 @@ 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
|
The behavior regarding the insertion of line breaks between the expressions can be configured in the
|
||||||
inspection settings.
|
inspection settings.
|
||||||
|
|
||||||
- JoinVarArgsContains
|
- JoinVarArgsContains
|
||||||
|
|
||||||
Looks for ```.contains()```, ```.doesNotContain()```, and .```containsOnlyOnce()``` calls for iterables
|
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
|
within the same statement. The available quickfix can join the arguments to variadic version of the call
|
||||||
and remove the surplus one.
|
and remove the surplus one.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(expected).contains("foo").doesNotContain("bar").contains("etc").doesNotContain("huh");
|
from: assertThat(expected).contains("foo").doesNotContain("bar").contains("etc").doesNotContain("huh");
|
||||||
to: assertThat(expected).contains("foo", "etc").doesNotContain("bar", "huh");
|
to: assertThat(expected).contains("foo", "etc").doesNotContain("bar", "huh");
|
||||||
@ -118,7 +115,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
changing semantics or losing descriptions.
|
changing semantics or losing descriptions.
|
||||||
|
|
||||||
Note that the quickfix does not handle comments very well and might remove them during the operation.
|
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.
|
You may need to perform some manual reformatting, if the line gets too long after applying the fix.
|
||||||
|
|
||||||
- AssertThatObjectIsNullOrNotNull
|
- AssertThatObjectIsNullOrNotNull
|
||||||
@ -146,7 +143,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
|
|
||||||
Inverts the boolean condition in either ```assertThat()``` or ```isEqualTo()```/```isNotEqualTo()```
|
Inverts the boolean condition in either ```assertThat()``` or ```isEqualTo()```/```isNotEqualTo()```
|
||||||
to make it more readable.
|
to make it more readable.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(!booleanValue).isEqualTo(true/false/Boolean.TRUE/Boolean.FALSE);
|
from: assertThat(!booleanValue).isEqualTo(true/false/Boolean.TRUE/Boolean.FALSE);
|
||||||
from: assertThat(!booleanValue).isTrue()/isFalse();
|
from: assertThat(!booleanValue).isTrue()/isFalse();
|
||||||
@ -203,9 +200,9 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
The ```assertThat(string.length()).isEqualTo(0);``` case is handled in the AssertThatSize inspection.
|
The ```assertThat(string.length()).isEqualTo(0);``` case is handled in the AssertThatSize inspection.
|
||||||
|
|
||||||
- AssertThatStringExpression
|
- AssertThatStringExpression
|
||||||
|
|
||||||
Moves string operations inside ```assertThat()``` out.
|
Moves string operations inside ```assertThat()``` out.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(stringActual.isEmpty()).isTrue();
|
from: assertThat(stringActual.isEmpty()).isTrue();
|
||||||
to: assertThat(stringActual).isEmpty();
|
to: assertThat(stringActual).isEmpty();
|
||||||
@ -230,7 +227,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
to: assertThat(stringActual).matches(stringExpected);
|
to: assertThat(stringActual).matches(stringExpected);
|
||||||
```
|
```
|
||||||
Analogously with ```isFalse()```.
|
Analogously with ```isFalse()```.
|
||||||
|
|
||||||
More funny stuff (excerpt):
|
More funny stuff (excerpt):
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -258,7 +255,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
- AssertThatObjectExpression
|
- AssertThatObjectExpression
|
||||||
|
|
||||||
Handles ```equals()```, ```toString()``` and ```hashCode()``` inside an expected expression.
|
Handles ```equals()```, ```toString()``` and ```hashCode()``` inside an expected expression.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(objActual.equals(objExpected)).isTrue();
|
from: assertThat(objActual.equals(objExpected)).isTrue();
|
||||||
to: assertThat(objActual).isEqualTo(objExpected);
|
to: assertThat(objActual).isEqualTo(objExpected);
|
||||||
@ -273,7 +270,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
- AssertThatComparableExpression
|
- AssertThatComparableExpression
|
||||||
|
|
||||||
Handles ```compareTo()``` inside an expected expression.
|
Handles ```compareTo()``` inside an expected expression.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(obj1.compareTo(obj2)).isEqualTo(0);
|
from: assertThat(obj1.compareTo(obj2)).isEqualTo(0);
|
||||||
to: assertThat(obj1).isEqualByComparingTo(obj2);
|
to: assertThat(obj1).isEqualByComparingTo(obj2);
|
||||||
@ -339,7 +336,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
from: assertThat(map.get(key)).isNull();
|
from: assertThat(map.get(key)).isNull();
|
||||||
to: assertThat(map).doesNotContainKey(key);
|
to: assertThat(map).doesNotContainKey(key);
|
||||||
```
|
```
|
||||||
|
|
||||||
The last transformation is the default, but may not be 100% equivalent depending upon the map
|
The last transformation is the default, but may not be 100% equivalent depending upon the map
|
||||||
being a degenerated case with ```null``` values, where ```map.get(key)``` returns ```null```,
|
being a degenerated case with ```null``` values, where ```map.get(key)``` returns ```null```,
|
||||||
but ```containsKey(key)``` is ```true```.
|
but ```containsKey(key)``` is ```true```.
|
||||||
@ -443,10 +440,10 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
|
|
||||||
Uses ```isEmpty()``` for ```hasSize(0)```, ```hasSizeLessThanOrEqualTo(0)```, and
|
Uses ```isEmpty()``` for ```hasSize(0)```, ```hasSizeLessThanOrEqualTo(0)```, and
|
||||||
```hasSizeLessThan(1)``` iterable (enumerable) assertions instead.
|
```hasSizeLessThan(1)``` iterable (enumerable) assertions instead.
|
||||||
|
|
||||||
Also suggests ```isNotEmpty()``` for ```hasSizeGreaterThan(0)``` and
|
Also suggests ```isNotEmpty()``` for ```hasSizeGreaterThan(0)``` and
|
||||||
```hasSizeGreaterThanOrEqualTo(1)```.
|
```hasSizeGreaterThanOrEqualTo(1)```.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(enumerable).hasSize(0);
|
from: assertThat(enumerable).hasSize(0);
|
||||||
from: assertThat(enumerable).hasSizeLessThanOrEqualTo(0);
|
from: assertThat(enumerable).hasSizeLessThanOrEqualTo(0);
|
||||||
@ -534,7 +531,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
|
|
||||||
Examines the actual expression for common mistakes such as mixing expected and actual expression.
|
Examines the actual expression for common mistakes such as mixing expected and actual expression.
|
||||||
For simple cases, a quick fix is offered to swap them. Otherwise, only a warning is issued.
|
For simple cases, a quick fix is offered to swap them. Otherwise, only a warning is issued.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(5).isEqualTo(variable);
|
from: assertThat(5).isEqualTo(variable);
|
||||||
to: assertThat(variable).isEqualTo(5);
|
to: assertThat(variable).isEqualTo(5);
|
||||||
@ -544,13 +541,13 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
```
|
```
|
||||||
|
|
||||||
There are, of course, more variations of the theme.
|
There are, of course, more variations of the theme.
|
||||||
|
|
||||||
If both sides of an assertion are constant expressions, the problem will only appear as
|
If both sides of an assertion are constant expressions, the problem will only appear as
|
||||||
a weak warning without a quick fix.
|
a weak warning without a quick fix.
|
||||||
|
|
||||||
Constants used on the actual side of ```.matches()``` and ```doesNotMatch()``` will not be
|
Constants used on the actual side of ```.matches()``` and ```doesNotMatch()``` will not be
|
||||||
reported for regular expression testing.
|
reported for regular expression testing.
|
||||||
|
|
||||||
Neither will a ```Class``` type be considered a constant in the classic sense, so
|
Neither will a ```Class``` type be considered a constant in the classic sense, so
|
||||||
```assertThat(SomeClass.class).isAssignableFrom(SomeOtherClass.class)``` will not be reported.
|
```assertThat(SomeClass.class).isAssignableFrom(SomeOtherClass.class)``` will not be reported.
|
||||||
|
|
||||||
@ -629,9 +626,9 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
- AssertThatJava8Optional
|
- AssertThatJava8Optional
|
||||||
|
|
||||||
Examines the statement for Java 8 ```Optional``` type and whether the statement
|
Examines the statement for Java 8 ```Optional``` type and whether the statement
|
||||||
effectively tries to assert the presence, absence or content and then
|
effectively tries to assert the presence, absence or content and then
|
||||||
replaces the statement by better assertions.
|
replaces the statement by better assertions.
|
||||||
|
|
||||||
```
|
```
|
||||||
from: assertThat(opt.isPresent()).isEqualTo(true);
|
from: assertThat(opt.isPresent()).isEqualTo(true);
|
||||||
from: assertThat(opt.isPresent()).isNotEqualTo(false);
|
from: assertThat(opt.isPresent()).isNotEqualTo(false);
|
||||||
@ -669,7 +666,7 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
- AssertThatGuavaOptional
|
- AssertThatGuavaOptional
|
||||||
|
|
||||||
Examines the statement for Google Guava ```Optional``` type and whether the statement
|
Examines the statement for Google Guava ```Optional``` type and whether the statement
|
||||||
effectively tries to assert the presence, absence or content and then
|
effectively tries to assert the presence, absence or content and then
|
||||||
replaces the statement by better assertions.
|
replaces the statement by better assertions.
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -708,26 +705,26 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
- AssumeThatInsteadOfReturn
|
- AssumeThatInsteadOfReturn
|
||||||
|
|
||||||
Tries to detect bogus uses of return statements in test methods and replaces them by ```assumeThat()``` calls.
|
Tries to detect bogus uses of return statements in test methods and replaces them by ```assumeThat()``` calls.
|
||||||
|
|
||||||
Novices will use these to skip test execution by bailing out early on some preconditions not met.
|
Novices will use these to skip test execution by bailing out early on some preconditions not met.
|
||||||
However, this suggests that the test has actually been run and passed instead of showing the test
|
However, this suggests that the test has actually been run and passed instead of showing the test
|
||||||
as being skipped.
|
as being skipped.
|
||||||
|
|
||||||
Return statements in ```if``` statements in main test methods (must be annotated with JUnit 4 or
|
Return statements in ```if``` statements in main test methods (must be annotated with JUnit 4 or
|
||||||
Jupiter ```@Test``` annotations) will be verified to have at least one ```assertThat()``` statement in the code flow.
|
Jupiter ```@Test``` annotations) will be verified to have at least one ```assertThat()``` statement in the code flow.
|
||||||
Method calls within the same class will be examined for ```assertThat()``` statements, too.
|
Method calls within the same class will be examined for ```assertThat()``` statements, too.
|
||||||
However, at most 50 statements and down to five recursions will be tolerated before giving up.
|
However, at most 50 statements and down to five recursions will be tolerated before giving up.
|
||||||
|
|
||||||
Currently, the quickfix may lose some comments during operation. The other branch of the ```if``` statement
|
Currently, the quickfix may lose some comments during operation. The other branch of the ```if``` statement
|
||||||
will be inlined (blocks with declarations will remain a code block due to variable scope).
|
will be inlined (blocks with declarations will remain a code block due to variable scope).
|
||||||
The quickfix will only work with AssertJ >= 2.9.0 (for 2.x releases) or >= 3.9.0 (for 3.x releases).
|
The quickfix will only work with AssertJ >= 2.9.0 (for 2.x releases) or >= 3.9.0 (for 3.x releases).
|
||||||
|
|
||||||
The generated ```assumeThat()``` statement could be optimized further (similar to ```assertThat()```), but
|
The generated ```assumeThat()``` statement could be optimized further (similar to ```assertThat()```), but
|
||||||
there is currently no support in Cajon for this (you could rename the method to ```assertThat()``` optimize it
|
there is currently no support in Cajon for this (you could rename the method to ```assertThat()``` optimize it
|
||||||
and turn it back into ```assumeThat()``` in the end).
|
and turn it back into ```assumeThat()``` in the end).
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
```
|
```
|
||||||
@Test
|
@Test
|
||||||
public void check_fuel_emission() {
|
public void check_fuel_emission() {
|
||||||
@ -751,14 +748,14 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
- JUnitAssertToAssertJ
|
- JUnitAssertToAssertJ
|
||||||
|
|
||||||
Tries to convert most of the JUnit 4 assertions and assumptions to AssertJ format.
|
Tries to convert most of the JUnit 4 assertions and assumptions to AssertJ format.
|
||||||
Sometimes the expected and actual expressions are specified in wrong order --
|
Sometimes the expected and actual expressions are specified in wrong order --
|
||||||
Cajon tries to swap these when it detects the supposed actual expression to be a
|
Cajon tries to swap these when it detects the supposed actual expression to be a
|
||||||
constant while the expected one is not.
|
constant while the expected one is not.
|
||||||
|
|
||||||
Does not support Hamcrest-Matchers.
|
Does not support Hamcrest-Matchers.
|
||||||
If you need that kind of conversion, you might want to check out the
|
If you need that kind of conversion, you might want to check out the
|
||||||
[Assertions2AssertJ plugin](https://plugins.jetbrains.com/plugin/10345-assertions2assertj) by Ric Emery.
|
[Assertions2AssertJ plugin](https://plugins.jetbrains.com/plugin/10345-assertions2assertj) by Ric Emery.
|
||||||
|
|
||||||
```
|
```
|
||||||
assertTrue(condition);
|
assertTrue(condition);
|
||||||
assertTrue(message, condition);
|
assertTrue(message, condition);
|
||||||
@ -796,9 +793,8 @@ You can toggle the various inspections in the Settings/Editor/Inspections in the
|
|||||||
|
|
||||||
### Implemented referencing
|
### Implemented referencing
|
||||||
|
|
||||||
You can ctrl-click on references inside .extracting() method parameters to go the
|
You can ctrl-click on references inside .extracting() method parameters to go the
|
||||||
referencing method definition.
|
referencing method definition.
|
||||||
|
|
||||||
```
|
```
|
||||||
.extracting("field")
|
.extracting("field")
|
||||||
.extracting("outerField.fieldInsideObjectTypeOfOuterField.andSoOn")
|
.extracting("outerField.fieldInsideObjectTypeOfOuterField.andSoOn")
|
||||||
@ -812,10 +808,9 @@ referencing method definition.
|
|||||||
.flatExtracting(Extractors.byName("fieldOrPropertyOrBareMethod.orAPathLikeAbove")
|
.flatExtracting(Extractors.byName("fieldOrPropertyOrBareMethod.orAPathLikeAbove")
|
||||||
.flatExtracting(Extractors.resultOf("bareMethod")
|
.flatExtracting(Extractors.resultOf("bareMethod")
|
||||||
```
|
```
|
||||||
|
This works on both POJOs and ```Iterable```s/```Array```s.
|
||||||
This works on both POJOs and ```Iterable```s/```Array```s.
|
Implementation is very basic though and does not work with fancy cascaded ```.extracting()``` sequences.
|
||||||
Implementation is very basic though and does not work with fancy cascaded ```.extracting()``` sequences.
|
If there's demand, I could add it.
|
||||||
If there's demand, I could add it.
|
|
||||||
|
|
||||||
## Development notice
|
## Development notice
|
||||||
|
|
||||||
@ -826,7 +821,6 @@ The IntelliJ framework actually uses the JUnit 3 TestCase for plugin testing, an
|
|||||||
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
|
||||||
|
|
||||||
- More Optional fixes such as ```opt1.get() == opt2.get()``` etc.
|
- More Optional fixes such as ```opt1.get() == opt2.get()``` etc.
|
||||||
- More moving out of methods for LocalDate/Time etc.
|
- More moving out of methods for LocalDate/Time etc.
|
||||||
- assertThat(foo.toLowerCase()/toUpperCase()).isEqualTo("foo") -> assertThat(foo).isEqualToIgnoringCase()
|
- assertThat(foo.toLowerCase()/toUpperCase()).isEqualTo("foo") -> assertThat(foo).isEqualToIgnoringCase()
|
||||||
@ -840,18 +834,9 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
### V1.14 (19-Feb-24)
|
|
||||||
|
|
||||||
- Now requires minimum version 2022.2.
|
|
||||||
- Maintenance. Updated various dependencies (Kotlin 1.9.22) and AssertJ 3.25.3 and AssertJ-Guava 3.25.3.
|
|
||||||
- Reworked JUnit 5 test framework to work again. However, all the tests are broken.
|
|
||||||
I spent several days trying to figure out what is going on, but I'm giving up on this pile of crap called IntelliJ.
|
|
||||||
Jetbrains keeps breaking the APIs and implementations every year and I just cannot be bothered anymore.
|
|
||||||
- This is very likely the last version.
|
|
||||||
|
|
||||||
### V1.13 (18-Aug-22)
|
### V1.13 (18-Aug-22)
|
||||||
|
|
||||||
- API change in IntelliJ platforms now requires minimum version 2019.3.1. Sorry, giving up to maintain compatibility after four attempts.
|
- API change in IntelliJ platforms now requires minimum version 2019.3.1. Sorry, giving up to maintain compatibilty after four attempts.
|
||||||
- Maintenance. Updated various dependencies (Kotlin 1.7.10) and AssertJ 3.23.1 and AssertJ-Guava 3.5.0.
|
- Maintenance. Updated various dependencies (Kotlin 1.7.10) and AssertJ 3.23.1 and AssertJ-Guava 3.5.0.
|
||||||
- Tried to fix unreproducible issue #9.
|
- Tried to fix unreproducible issue #9.
|
||||||
- Added AssertThatIsZeroOne inspection demanded by issue #5.
|
- Added AssertThatIsZeroOne inspection demanded by issue #5.
|
||||||
@ -874,12 +859,10 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
inspection.
|
inspection.
|
||||||
|
|
||||||
#### V1.10 (31-Jul-20) Friday the 31st Edition
|
#### V1.10 (31-Jul-20) Friday the 31st Edition
|
||||||
|
|
||||||
- Updated libraries to the latest versions (including AssertJ 3.16.1 and Kotlin 1.40-rc).
|
- Updated libraries to the latest versions (including AssertJ 3.16.1 and Kotlin 1.40-rc).
|
||||||
- Fixed two possible index out-of-bounds exceptions in ExtractorReferenceContributor and BogusAssertionInspection.
|
- Fixed two possible index out-of-bounds exceptions in ExtractorReferenceContributor and BogusAssertionInspection.
|
||||||
|
|
||||||
#### V1.9 (25-Feb-20) Mardi Gras Edition
|
#### V1.9 (25-Feb-20) Mardi Gras Edition
|
||||||
|
|
||||||
- TwistedAssertion inspection will no longer warn for ```.matches()``` and ```doesNotMatch()``` for regular expressions.
|
- TwistedAssertion inspection will no longer warn for ```.matches()``` and ```doesNotMatch()``` for regular expressions.
|
||||||
Apparently, ```assertThat("somestring").matches(regex)``` is a valid test if the regex is what needs to be tested.
|
Apparently, ```assertThat("somestring").matches(regex)``` is a valid test if the regex is what needs to be tested.
|
||||||
If the actual expression is of ```Class``` type, this will no longer be reported.
|
If the actual expression is of ```Class``` type, this will no longer be reported.
|
||||||
@ -890,14 +873,12 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
the warning will be reduced to information level as the assertion may be testing ```equals()``` or ```hashCode()``` for validity.
|
the warning will be reduced to information level as the assertion may be testing ```equals()``` or ```hashCode()``` for validity.
|
||||||
|
|
||||||
#### V1.8 (14-Feb-20) Valentine Edition
|
#### V1.8 (14-Feb-20) Valentine Edition
|
||||||
|
|
||||||
- Maintenance. Removed experimental API use. Updated dependencies. Fixed testing problems introduced with IntelliJ IDEA 2019.3
|
- Maintenance. Removed experimental API use. Updated dependencies. Fixed testing problems introduced with IntelliJ IDEA 2019.3
|
||||||
- Added new TwistedAssertion inspection that will warn about assertions with the actual expression being a constant indicating
|
- Added new TwistedAssertion inspection that will warn about assertions with the actual expression being a constant indicating
|
||||||
swapped use of actual and expected expressions.
|
swapped use of actual and expected expressions.
|
||||||
- Added new BogusAssertion inspection that showing typical copy and paste errors where actual and expected expressions are the same.
|
- Added new BogusAssertion inspection that showing typical copy and paste errors where actual and expected expressions are the same.
|
||||||
|
|
||||||
#### V1.7 (19-Nov-19)
|
#### V1.7 (19-Nov-19)
|
||||||
|
|
||||||
- Fixed a lapsuus in AssertThatFileExpression also transforming ```.listFiles()``` with a filter argument.
|
- Fixed a lapsuus in AssertThatFileExpression also transforming ```.listFiles()``` with a filter argument.
|
||||||
- Added first version of AssertThatPathExpression for a limited number transformations (more stuff is possible,
|
- Added first version of AssertThatPathExpression for a limited number transformations (more stuff is possible,
|
||||||
but requires detection and transformation of static ```Files```-methods).
|
but requires detection and transformation of static ```Files```-methods).
|
||||||
@ -905,7 +886,6 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
- Added ```hasSize(), isEmpty()``` and ```isNotEmpty()``` for AssertThatFileExpression when using AssertJ >= 3.14.0.
|
- Added ```hasSize(), isEmpty()``` and ```isNotEmpty()``` for AssertThatFileExpression when using AssertJ >= 3.14.0.
|
||||||
|
|
||||||
#### V1.6 (30-Sep-19)
|
#### V1.6 (30-Sep-19)
|
||||||
|
|
||||||
- Really fixed AssertThatGuavaOptional inspections to avoid conversions from ```.get()``` to ```.contains()```
|
- Really fixed AssertThatGuavaOptional inspections to avoid conversions from ```.get()``` to ```.contains()```
|
||||||
for array types. Sigh. Shouldn't be working >12h a day and then do some more stuff at home.
|
for array types. Sigh. Shouldn't be working >12h a day and then do some more stuff at home.
|
||||||
- Fixed a bug in AssertThatBinaryExpression inspection for ```assertThat(null != expression)``` and related
|
- Fixed a bug in AssertThatBinaryExpression inspection for ```assertThat(null != expression)``` and related
|
||||||
@ -916,7 +896,6 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
Specifically, uses of ```matches()```, ```compareToIgnoreCase()```, ```indexOf()```, and ```trim()```.
|
Specifically, uses of ```matches()```, ```compareToIgnoreCase()```, ```indexOf()```, and ```trim()```.
|
||||||
|
|
||||||
#### V1.5 (24-Sep-19)
|
#### V1.5 (24-Sep-19)
|
||||||
|
|
||||||
- Fix for AssertThatCollectionOrMap inspection sometimes causing an index out-of-bounds exception.
|
- Fix for AssertThatCollectionOrMap inspection sometimes causing an index out-of-bounds exception.
|
||||||
- AssertThatGuavaOptional inspections will now avoid conversions from ```.get()``` to ```.contains()```
|
- AssertThatGuavaOptional inspections will now avoid conversions from ```.get()``` to ```.contains()```
|
||||||
for array types (currently not correctly supported by ```contains()``` in AssertJ-Guava).
|
for array types (currently not correctly supported by ```contains()``` in AssertJ-Guava).
|
||||||
@ -927,27 +906,23 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
combinations for ```.hasSameSizeAs()``` are supported.
|
combinations for ```.hasSameSizeAs()``` are supported.
|
||||||
|
|
||||||
#### V1.4 (25-Aug-19)
|
#### V1.4 (25-Aug-19)
|
||||||
|
|
||||||
- Minor fix for highlighting of JoinVarArgsContains inspection.
|
- Minor fix for highlighting of JoinVarArgsContains inspection.
|
||||||
- Extended AssertThatSize inspection to Maps, too.
|
- Extended AssertThatSize inspection to Maps, too.
|
||||||
- Extended AssertThatCollectionOrMap inspection for several ```assertThat(map.get())``` cases as suggested by Georgij G.
|
- Extended AssertThatCollectionOrMap inspection for several ```assertThat(map.get())``` cases as suggested by Georgij G.
|
||||||
|
|
||||||
#### V1.3 (03-Aug-19)
|
#### V1.3 (03-Aug-19)
|
||||||
|
|
||||||
- New JoinVarArgsContains inspection that will detect multiple ```.contains()```, ```.doesNotContain()```,
|
- New JoinVarArgsContains inspection that will detect multiple ```.contains()```, ```.doesNotContain()```,
|
||||||
and ```.containsOnlyOnce()``` calls within the same statement that could be joined together using variadic arguments.
|
and ```.containsOnlyOnce()``` calls within the same statement that could be joined together using variadic arguments.
|
||||||
- AssertJ 3.13.0 broke some inspections due to new ```AbstractStringAssert::isEqualTo()``` method.
|
- AssertJ 3.13.0 broke some inspections due to new ```AbstractStringAssert::isEqualTo()``` method.
|
||||||
- AssertThatJava8Optional and AssertThatGuavaOptional inspections do not longer try to fix
|
- AssertThatJava8Optional and AssertThatGuavaOptional inspections do not longer try to fix
|
||||||
```assertThat(optional).isEqualTo(Optional.fromNullable(expression))``` to ```contains()```
|
```assertThat(optional).isEqualTo(Optional.fromNullable(expression))``` to ```contains()```
|
||||||
when ```expression``` is not a non-null constant expression.
|
when ```expression``` is not a non-null constant expression.
|
||||||
|
|
||||||
#### V1.2 (23-Jun-19)
|
#### V1.2 (23-Jun-19)
|
||||||
|
|
||||||
- Due to popular demand the JoinAssertThatStatements inspection will now add line breaks on joining statements.
|
- 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).
|
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.
|
||||||
- Added Java 8 Optional ```opt.orElse(null) == null``` case, too.
|
- Added Java 8 Optional ```opt.orElse(null) == null``` case, too.
|
||||||
@ -958,18 +933,14 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
- Added new AssertThatObjectExpression inspection for ```toString()``` and ```hashCode()``` and moved ```equals()``` from AssertThatBinaryExpression there.
|
- Added new AssertThatObjectExpression inspection for ```toString()``` and ```hashCode()``` and moved ```equals()``` from AssertThatBinaryExpression there.
|
||||||
|
|
||||||
#### V1.0 (06-May-19)
|
#### V1.0 (06-May-19)
|
||||||
|
|
||||||
- First release to be considered stable enough for production use.
|
- First release to be considered stable enough for production use.
|
||||||
- Fixed a NPE in AssumeThatInsteadOfReturn inspection quickfix for empty else branches.
|
- Fixed a NPE in AssumeThatInsteadOfReturn inspection quickfix for empty else branches.
|
||||||
- Fixed missing description for AssumeThatInsteadOfReturn inspection.
|
- Fixed missing description for AssumeThatInsteadOfReturn inspection.
|
||||||
- Added new AssertThatCollectionOrMapExpression inspection that tries to pull out methods such as ```isEmpty()``` or ```contains()``` out of an actual ```assertThat()```
|
- Added new AssertThatCollectionOrMapExpression inspection that tries to pull out methods such as ```isEmpty()``` or ```contains()``` out of an actual ```assertThat()``` expression.
|
||||||
expression.
|
|
||||||
|
|
||||||
#### V0.8 (05-May-19)
|
#### V0.8 (05-May-19)
|
||||||
|
|
||||||
- Fixed missing description for JoinAssertThatStatements and detection of equivalent expressions (sorry, released it too hastily).
|
- Fixed missing description for JoinAssertThatStatements and detection of equivalent expressions (sorry, released it too hastily).
|
||||||
- Fixed ```isEmpty()``` for enumerables and strings and ```isNull()``` for object conversions to be applied only if it is the terminal method call as ```isEmpty()```
|
- Fixed ```isEmpty()``` for enumerables and strings and ```isNull()``` for object conversions to be applied only if it is the terminal method call as ```isEmpty()``` and ```isNull()``` return void.
|
||||||
and ```isNull()``` return void.
|
|
||||||
- Heavily reworked inspections for edge cases, such as multiple ```isEqualTo()``` calls inside a single statement.
|
- Heavily reworked inspections for edge cases, such as multiple ```isEqualTo()``` calls inside a single statement.
|
||||||
- Some inspections could generate bogus code for weird situations, this has been made more fool-proof.
|
- Some inspections could generate bogus code for weird situations, this has been made more fool-proof.
|
||||||
- Corrected highlighting for many inspections.
|
- Corrected highlighting for many inspections.
|
||||||
@ -978,7 +949,6 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
- Added a first version of a new inspection that tries to detect bogus uses of return statements in test methods and replaces them by ```assumeThat()``` calls.
|
- Added a first version of a new inspection that tries to detect bogus uses of return statements in test methods and replaces them by ```assumeThat()``` calls.
|
||||||
|
|
||||||
#### V0.7 (28-Apr-19)
|
#### V0.7 (28-Apr-19)
|
||||||
|
|
||||||
- Another fix for AssertThatGuavaOptional inspection regarding using the same family name for slightly different quick fix executions
|
- Another fix for AssertThatGuavaOptional inspection regarding using the same family name for slightly different quick fix executions
|
||||||
(really, Jetbrains, this sucks for no reason).
|
(really, Jetbrains, this sucks for no reason).
|
||||||
- Extended AssertThatSize inspection to transform ```hasSize()``` into ```hasSameSizeAs()```, if possible.
|
- Extended AssertThatSize inspection to transform ```hasSize()``` into ```hasSameSizeAs()```, if possible.
|
||||||
@ -986,7 +956,6 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
actual object together, preserving comments.
|
actual object together, preserving comments.
|
||||||
|
|
||||||
#### V0.6 (22-Apr-19)
|
#### V0.6 (22-Apr-19)
|
||||||
|
|
||||||
- New AssertThatStringExpression inspection that will move ```isEmpty()```, ```equals()```, ```equalsIgnoreCase()```, ```contains()```,
|
- New AssertThatStringExpression inspection that will move ```isEmpty()```, ```equals()```, ```equalsIgnoreCase()```, ```contains()```,
|
||||||
```startsWith()```, and ```endsWith()``` out of actual expression.
|
```startsWith()```, and ```endsWith()``` out of actual expression.
|
||||||
- Extended AssertThatSize inspection to take ```String```s and ```CharSequences``` into account, too.
|
- Extended AssertThatSize inspection to take ```String```s and ```CharSequences``` into account, too.
|
||||||
@ -995,36 +964,28 @@ Feel free to use the code (in package ```de.platon42.intellij.jupiter```) for yo
|
|||||||
- New AssertThatInstanceOf inspection that moves instanceof expressions out of ```assertThat()```.
|
- New AssertThatInstanceOf inspection that moves instanceof expressions out of ```assertThat()```.
|
||||||
|
|
||||||
#### V0.5 (18-Apr-19)
|
#### V0.5 (18-Apr-19)
|
||||||
|
|
||||||
- Fixed incompatibility with IDEA versions < 2018.2 (affected AssertThatSizeInspection). Minimal version is now 2017.3.
|
- Fixed incompatibility with IDEA versions < 2018.2 (affected AssertThatSizeInspection). Minimal version is now 2017.3.
|
||||||
- Fixed missing Guava imports (if not already present) for AssertThatGuavaInspection. This was a major PITA to get right.
|
- Fixed missing Guava imports (if not already present) for AssertThatGuavaInspection. This was a major PITA to get right.
|
||||||
- Added support for referencing and refactoring inside ```.extracting()``` methods with fields, properties and methods (though
|
- Added support for referencing and refactoring inside ```.extracting()``` methods with fields, properties and methods (though
|
||||||
getter renaming does not work that perfect, but I'm giving up for now as the IntelliJ SDK docs are seriously lacking).
|
getter renaming does not work that perfect, but I'm giving up for now as the IntelliJ SDK docs are seriously lacking).
|
||||||
- Fixed an exception in batch mode if the description string was the same but for different fixes.
|
- Fixed an exception in batch mode if the description string was the same but for different fixes.
|
||||||
Now descriptions are different for quick fixes triggered by AssertThatJava8OptionalInspection and AssertThatGuavaOptionalInspection.
|
Now descriptions are different for quick fixes triggered by AssertThatJava8OptionalInspection and AssertThatGuavaOptionalInspection.
|
||||||
|
|
||||||
#### V0.4 (11-Apr-19)
|
#### V0.4 (11-Apr-19)
|
||||||
|
|
||||||
- Reduced minimal supported IDEA version from 2018.2 to 2017.2.
|
- Reduced minimal supported IDEA version from 2018.2 to 2017.2.
|
||||||
- New inspection AssertThatJava8Optional that operates on Java 8 ```Optional``` objects and tries to use ```contains()```, ```containsSame()```, ```isPresent()```,
|
- New inspection AssertThatJava8Optional that operates on Java 8 ```Optional``` objects and tries to use ```contains()```, ```containsSame()```, ```isPresent()```, and ```isNotPresent()``` instead.
|
||||||
and ```isNotPresent()``` instead.
|
|
||||||
- New inspection AssertThatGuavaOptional that operates on Guava ```Optional``` objects and tries to use ```contains()```, ```isPresent()```, and ```isAbsent()``` instead.
|
- New inspection AssertThatGuavaOptional that operates on Guava ```Optional``` objects and tries to use ```contains()```, ```isPresent()```, and ```isAbsent()``` instead.
|
||||||
- Added support in AssertThatBinaryExpressionIsTrueOrFalse for ```is(Not)EqualTo(Boolean.TRUE/FALSE)```.
|
- Added support in AssertThatBinaryExpressionIsTrueOrFalse for ```is(Not)EqualTo(Boolean.TRUE/FALSE)```.
|
||||||
|
|
||||||
#### 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
|
- Support for ```hasSizeLessThan()```, ```hasSizeLessThanOrEqualTo()```, ```hasSizeGreaterThanOrEqualTo()```, and ```hasSizeGreaterThan()``` for AssertThatSizeInspection (with AssertJ >=3.12.0).
|
||||||
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)
|
||||||
|
|
||||||
- Fixed descriptions and quick fix texts.
|
- Fixed descriptions and quick fix texts.
|
||||||
- Fixed highlighting of found problems and 'Run inspection by Name' returning nothing, too.
|
- Fixed highlighting of found problems and 'Run inspection by Name' returning nothing, too.
|
||||||
|
|
||||||
#### V0.1 (31-Mar-19)
|
#### V0.1 (31-Mar-19)
|
||||||
|
- Initial release.
|
||||||
- Initial release.
|
|
93
build.gradle
Normal file
93
build.gradle
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
plugins {
|
||||||
|
id 'java'
|
||||||
|
id 'org.jetbrains.intellij' version '1.8.0'
|
||||||
|
id 'org.jetbrains.kotlin.jvm' version '1.7.10'
|
||||||
|
id 'jacoco'
|
||||||
|
id 'com.github.kt3k.coveralls' version '2.12.0'
|
||||||
|
}
|
||||||
|
|
||||||
|
group 'de.platon42'
|
||||||
|
version '1.13'
|
||||||
|
sourceCompatibility = "1.8"
|
||||||
|
targetCompatibility = "1.8"
|
||||||
|
|
||||||
|
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"
|
||||||
|
testImplementation "org.assertj:assertj-core:3.23.1"
|
||||||
|
testImplementation "org.assertj:assertj-guava:3.5.0"
|
||||||
|
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
|
||||||
|
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
|
||||||
|
testImplementation "org.jetbrains.kotlin:kotlin-test"
|
||||||
|
testImplementation "org.jetbrains.kotlin:kotlin-reflect"
|
||||||
|
testImplementation 'org.junit.platform:junit-platform-launcher:1.9.0'
|
||||||
|
// testImplementation "org.jetbrains.kotlin:kotlin-test-junit"
|
||||||
|
}
|
||||||
|
|
||||||
|
compileKotlin {
|
||||||
|
kotlinOptions.jvmTarget = "1.8"
|
||||||
|
}
|
||||||
|
|
||||||
|
compileTestKotlin {
|
||||||
|
kotlinOptions.jvmTarget = "1.8"
|
||||||
|
}
|
||||||
|
|
||||||
|
intellij {
|
||||||
|
setVersion("2022.2") // LATEST-EAP-SNAPSHOT
|
||||||
|
//pluginName.set(provider { 'Concise AssertJ Optimizing Nitpicker (Cajon)' })
|
||||||
|
setUpdateSinceUntilBuild(false)
|
||||||
|
setPlugins(["com.intellij.java"])
|
||||||
|
}
|
||||||
|
|
||||||
|
runPluginVerifier {
|
||||||
|
ideVersions = ["IC-193.5662.53", "IC-222.3345.118"] // 2019.3.1 - 2022.2
|
||||||
|
downloadDir = System.getProperty("user.home") + "/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/verifier"
|
||||||
|
}
|
||||||
|
|
||||||
|
patchPluginXml {
|
||||||
|
setChangeNotes("""
|
||||||
|
<h4>V1.13 (18-Aug-22)</h4>
|
||||||
|
<ul>
|
||||||
|
<li>API change in IntelliJ platforms now requires minimum version 2019.3.1. Sorry, giving up to maintain compatibilty after four attempts.
|
||||||
|
<li>Maintenance. Updated various dependencies (Kotlin 1.7.10) and AssertJ 3.23.1 and AssertJ-Guava 3.5.0.
|
||||||
|
<li>Tried to fix unreproducible issue #9.
|
||||||
|
<li>Added AssertThatIsZeroOne inspection demanded by issue #5.
|
||||||
|
<li>Fix for wrongly joining statements that cannot be trivially joined (e.g. with filteredOn). Fixes issue #6.
|
||||||
|
</ul>
|
||||||
|
<p>Full changelog available at <a href="https://github.com/chrisly42/cajon-plugin#changelog">Github project site</a>.</p>
|
||||||
|
""")
|
||||||
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
testLogging {
|
||||||
|
events "passed", "skipped", "failed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.coveralls {
|
||||||
|
dependsOn jacocoTestReport
|
||||||
|
}
|
||||||
|
|
||||||
|
jacoco {
|
||||||
|
toolVersion = '0.8.8'
|
||||||
|
}
|
||||||
|
|
||||||
|
jacocoTestReport {
|
||||||
|
reports {
|
||||||
|
xml.required.set(true)
|
||||||
|
csv.required.set(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
publishPlugin {
|
||||||
|
setToken(intellijPublishToken)
|
||||||
|
}
|
131
build.gradle.kts
131
build.gradle.kts
@ -1,131 +0,0 @@
|
|||||||
plugins {
|
|
||||||
id("java")
|
|
||||||
id("org.jetbrains.intellij") version "1.17.1"
|
|
||||||
id("org.jetbrains.kotlin.jvm") version "1.9.22"
|
|
||||||
id("jacoco")
|
|
||||||
id("com.github.kt3k.coveralls") version "2.12.2"
|
|
||||||
}
|
|
||||||
|
|
||||||
group = "de.platon42"
|
|
||||||
version = "1.14"
|
|
||||||
|
|
||||||
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"
|
|
||||||
testImplementation("org.assertj:assertj-core:3.25.3")
|
|
||||||
testImplementation("org.assertj:assertj-guava:3.25.3")
|
|
||||||
testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.2")
|
|
||||||
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.2")
|
|
||||||
testImplementation("org.jetbrains.kotlin:kotlin-test")
|
|
||||||
testImplementation("org.jetbrains.kotlin:kotlin-reflect")
|
|
||||||
testImplementation("org.junit.platform:junit-platform-launcher:1.10.2")
|
|
||||||
// testImplementation "org.jetbrains.kotlin:kotlin-test-junit"
|
|
||||||
}
|
|
||||||
|
|
||||||
intellij {
|
|
||||||
version.set("2022.2") // LATEST-EAP-SNAPSHOT
|
|
||||||
//pluginName.set(provider { 'Concise AssertJ Optimizing Nitpicker (Cajon)' })
|
|
||||||
updateSinceUntilBuild.set(false)
|
|
||||||
plugins.set(listOf("com.intellij.java"))
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks {
|
|
||||||
withType<JavaCompile> {
|
|
||||||
sourceCompatibility = "11"
|
|
||||||
targetCompatibility = "11"
|
|
||||||
}
|
|
||||||
withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
|
|
||||||
kotlinOptions.jvmTarget = "11"
|
|
||||||
}
|
|
||||||
|
|
||||||
test {
|
|
||||||
useJUnitPlatform()
|
|
||||||
testLogging {
|
|
||||||
events("passed", "skipped", "failed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
prepareSandbox {
|
|
||||||
enabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
verifyPlugin {
|
|
||||||
enabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
verifyPluginConfiguration {
|
|
||||||
enabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
patchPluginXml {
|
|
||||||
enabled = true
|
|
||||||
sinceBuild.set("222")
|
|
||||||
changeNotes.set(
|
|
||||||
"""
|
|
||||||
<h4>V1.14 (19-Feb-24)</h4>
|
|
||||||
<ul>
|
|
||||||
<li>Now requires minimum version 2022.2.
|
|
||||||
<li>Maintenance. Updated various dependencies (Kotlin 1.9.22) and AssertJ 3.25.3 and AssertJ-Guava 3.25.3.
|
|
||||||
<li>Reworked JUnit 5 test framework to work again. However, all the tests are broken.
|
|
||||||
I spent several days trying to figure out what is going on, but I'm giving up on this pile of crap called IntelliJ.
|
|
||||||
Jetbrains keeps breaking the APIs and implementations every year and I just cannot be bothered anymore.
|
|
||||||
<li>This is very likely the last version.
|
|
||||||
</ul>
|
|
||||||
<h4>V1.13 (18-Aug-22)</h4>
|
|
||||||
<ul>
|
|
||||||
<li>API change in IntelliJ platforms now requires minimum version 2019.3.1. Sorry, giving up to maintain compatibility after four attempts.
|
|
||||||
<li>Maintenance. Updated various dependencies (Kotlin 1.7.10) and AssertJ 3.23.1 and AssertJ-Guava 3.5.0.
|
|
||||||
<li>Tried to fix unreproducible issue #9.
|
|
||||||
<li>Added AssertThatIsZeroOne inspection demanded by issue #5.
|
|
||||||
<li>Fix for wrongly joining statements that cannot be trivially joined (e.g. with filteredOn). Fixes issue #6.
|
|
||||||
</ul>
|
|
||||||
<p>Full changelog available at <a href="https://git.platon42.de/chrisly42/cajon-plugin#changelog">Gitea project site</a>.</p>
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
publishPlugin {
|
|
||||||
token.set(System.getProperty("org.gradle.project.intellijPublishToken"))
|
|
||||||
}
|
|
||||||
|
|
||||||
runIde {
|
|
||||||
enabled = true
|
|
||||||
if (project.hasProperty("ideDir")) {
|
|
||||||
ideDir.set(file(project.property("ideDir")!!))
|
|
||||||
jbrVersion.set(project.property("ideJBR")!! as String)
|
|
||||||
}
|
|
||||||
autoReloadPlugins.set(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
runPluginVerifier {
|
|
||||||
ideVersions.set(listOf("IC-222.4167.29", "IC-233.14015.106")) // 2022.2.2 - 2023.3.3
|
|
||||||
downloadDir.set(System.getenv("user.home") + "/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/verifier")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//tasks.coveralls {
|
|
||||||
// dependsOn(jacocoTestReport)
|
|
||||||
//}
|
|
||||||
|
|
||||||
//jacoco {
|
|
||||||
// toolVersion = '0.8.8'
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//jacocoTestReport {
|
|
||||||
// reports {
|
|
||||||
// xml.required.set(true)
|
|
||||||
// csv.required.set(false)
|
|
||||||
// }
|
|
||||||
//}
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -109,4 +109,4 @@ class AssertJClassNames {
|
|||||||
@NonNls
|
@NonNls
|
||||||
const val GUAVA_OPTIONAL_ASSERTIONS_CLASSNAME = "org.assertj.guava.api.OptionalAssert"
|
const val GUAVA_OPTIONAL_ASSERTIONS_CLASSNAME = "org.assertj.guava.api.OptionalAssert"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -180,4 +180,4 @@ fun PsiExpression.getAllTheSameNullNotNullConstants(): Boolean? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return lockedResult
|
return lockedResult
|
||||||
}
|
}
|
@ -307,4 +307,4 @@ abstract class AbstractAssertJInspection : AbstractBaseJavaLocalInspectionTool()
|
|||||||
) {
|
) {
|
||||||
registerConciseMethod(REMOVE_EXPECTED_OUTMOST_DESCRIPTION_TEMPLATE, holder, expression, oldExpectedCallExpression, replacementMethod, quickFixSupplier)
|
registerConciseMethod(REMOVE_EXPECTED_OUTMOST_DESCRIPTION_TEMPLATE, holder, expression, oldExpectedCallExpression, replacementMethod, quickFixSupplier)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -76,4 +76,4 @@ class AssertThatJava8OptionalInspection : AbstractAssertJInspection() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -32,4 +32,4 @@ class AssertThatObjectIsNullOrNotNullInspection : AbstractAssertJInspection() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
<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://git.platon42.de/chrisly42/cajon-plugin">Chris 'platon42' Hodges</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.
|
||||||
@ -14,6 +14,8 @@
|
|||||||
<a href="https://github.com/chrisly42/cajon-plugin/blob/master/README.md">Full documentation here...</a>
|
<a href="https://github.com/chrisly42/cajon-plugin/blob/master/README.md">Full documentation here...</a>
|
||||||
]]></description>
|
]]></description>
|
||||||
|
|
||||||
|
<idea-version since-build="193.5662.53"/>
|
||||||
|
|
||||||
<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>
|
||||||
@ -79,4 +81,4 @@
|
|||||||
|
|
||||||
<actions>
|
<actions>
|
||||||
</actions>
|
</actions>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
@ -1,151 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import com.intellij.jarRepository.JarRepositoryManager
|
|
||||||
import com.intellij.jarRepository.RemoteRepositoryDescription
|
|
||||||
import com.intellij.openapi.module.Module
|
|
||||||
import com.intellij.openapi.roots.ContentEntry
|
|
||||||
import com.intellij.openapi.roots.DependencyScope
|
|
||||||
import com.intellij.openapi.roots.ModifiableRootModel
|
|
||||||
import com.intellij.openapi.vfs.LocalFileSystem
|
|
||||||
import com.intellij.testFramework.IdeaTestUtil
|
|
||||||
import com.intellij.testFramework.LightProjectDescriptor
|
|
||||||
import com.intellij.testFramework.PlatformTestUtil
|
|
||||||
import com.intellij.testFramework.PsiTestUtil
|
|
||||||
import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor
|
|
||||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
|
||||||
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase
|
|
||||||
import com.intellij.testFramework.rules.TestNameExtension
|
|
||||||
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties
|
|
||||||
import org.junit.jupiter.api.extension.AfterEachCallback
|
|
||||||
import org.junit.jupiter.api.extension.BeforeEachCallback
|
|
||||||
import org.junit.jupiter.api.extension.ExtensionContext
|
|
||||||
import org.junit.jupiter.api.extension.RegisterExtension
|
|
||||||
import java.nio.file.Paths
|
|
||||||
import java.util.*
|
|
||||||
import java.util.function.Consumer
|
|
||||||
import java.util.stream.Collectors
|
|
||||||
import java.util.stream.Stream
|
|
||||||
|
|
||||||
|
|
||||||
abstract class AbstractJUnit5TestCase {
|
|
||||||
|
|
||||||
@RegisterExtension
|
|
||||||
protected val testNameRule = TestNameExtension()
|
|
||||||
|
|
||||||
@RegisterExtension
|
|
||||||
protected val edtInterceptorExtension = EdtInterceptorExtension()
|
|
||||||
|
|
||||||
protected fun getTestName(lowercaseFirstLetter: Boolean): String {
|
|
||||||
return PlatformTestUtil.getTestName(testNameRule.methodName, lowercaseFirstLetter)
|
|
||||||
}
|
|
||||||
|
|
||||||
@RegisterExtension
|
|
||||||
private val testCase = object : LightJavaCodeInsightFixtureTestCase(), BeforeEachCallback, AfterEachCallback {
|
|
||||||
|
|
||||||
lateinit var extensionContext: ExtensionContext
|
|
||||||
|
|
||||||
override fun getProjectDescriptor(): LightProjectDescriptor {
|
|
||||||
val testJdk = getMethodOrClassAnnotation(TestJdk::class.java) ?: return super.getProjectDescriptor()
|
|
||||||
val projectDescriptor: DefaultLightProjectDescriptor = object : DefaultLightProjectDescriptor({ IdeaTestUtil.getMockJdk(testJdk.value.toJavaVersion()) }) {
|
|
||||||
override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) {
|
|
||||||
super.configureModule(module, model, contentEntry)
|
|
||||||
val localJars = getMethodOrClassAnnotation(AddLocalJarToModule::class.java)
|
|
||||||
if (localJars != null) {
|
|
||||||
localJars.value.forEach {
|
|
||||||
addJarContaining(
|
|
||||||
model,
|
|
||||||
it.java
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val mavenDependencies = getMethodOrClassAnnotations(AddMavenDependencyToModule::class.java)
|
|
||||||
mavenDependencies.forEach(Consumer { it: AddMavenDependencyToModule ->
|
|
||||||
addFromMaven(
|
|
||||||
model,
|
|
||||||
it.value,
|
|
||||||
it.includeTransitiveDependencies,
|
|
||||||
it.scope
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return projectDescriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addJarContaining(model: ModifiableRootModel?, clazz: Class<*>) {
|
|
||||||
val filename = clazz.getResource(clazz.simpleName + ".class").file
|
|
||||||
val jarName = filename.substring(0, filename.indexOf(".jar") + 4).removePrefix("file:")
|
|
||||||
val jarPath = Paths.get(jarName)
|
|
||||||
|
|
||||||
val jarFile = LocalFileSystem.getInstance().refreshAndFindFileByPath(jarName)
|
|
||||||
myFixture.allowTreeAccessForFile(jarFile!!)
|
|
||||||
PsiTestUtil.addLibrary(
|
|
||||||
model!!,
|
|
||||||
jarPath.fileName.toString().replace(".jar", ""),
|
|
||||||
jarPath.parent.toString(),
|
|
||||||
jarPath.fileName.toString()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addFromMaven(
|
|
||||||
model: ModifiableRootModel, mavenCoordinates: String,
|
|
||||||
includeTransitiveDependencies: Boolean, dependencyScope: DependencyScope?
|
|
||||||
) {
|
|
||||||
val remoteRepositoryDescriptions = RemoteRepositoryDescription.DEFAULT_REPOSITORIES
|
|
||||||
val libraryProperties = RepositoryLibraryProperties(mavenCoordinates, includeTransitiveDependencies)
|
|
||||||
val roots =
|
|
||||||
JarRepositoryManager.loadDependenciesModal(model.project, libraryProperties, false, false, null, remoteRepositoryDescriptions)
|
|
||||||
val tableModel = model.moduleLibraryTable.modifiableModel
|
|
||||||
val library = tableModel.createLibrary(mavenCoordinates)
|
|
||||||
val libraryModel = library.modifiableModel
|
|
||||||
check(!roots.isEmpty()) { String.format("No roots for '%s'", mavenCoordinates) }
|
|
||||||
|
|
||||||
for (root in roots) {
|
|
||||||
libraryModel.addRoot(root.file, root.type)
|
|
||||||
}
|
|
||||||
|
|
||||||
val libraryOrderEntry = model.findLibraryOrderEntry(library) ?: throw java.lang.IllegalStateException("Unable to find registered library $mavenCoordinates")
|
|
||||||
libraryOrderEntry.scope = dependencyScope!!
|
|
||||||
|
|
||||||
libraryModel.commit()
|
|
||||||
tableModel.commit()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getTestDataPath(): String {
|
|
||||||
val testDataPath = getMethodOrClassAnnotation(TestDataPath::class.java) ?: return super.getTestDataPath()
|
|
||||||
val testDataSubPath = getMethodOrClassAnnotation(TestDataSubPath::class.java) ?: return testDataPath.value
|
|
||||||
return Paths.get(testDataPath.value, testDataSubPath.value).toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getMyFixture(): JavaCodeInsightTestFixture = myFixture
|
|
||||||
|
|
||||||
private fun <T : Annotation?> getMethodOrClassAnnotation(clazz: Class<T>): T? {
|
|
||||||
var annotation = extensionContext.requiredTestMethod.getAnnotation(clazz)
|
|
||||||
if (annotation == null) {
|
|
||||||
annotation = extensionContext.requiredTestClass.getAnnotation(clazz)
|
|
||||||
}
|
|
||||||
return annotation
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun <T : Annotation?> getMethodOrClassAnnotations(clazz: Class<T>): List<T> {
|
|
||||||
return Stream.of(
|
|
||||||
extensionContext.requiredTestMethod.getAnnotationsByType(clazz),
|
|
||||||
extensionContext.requiredTestClass.getAnnotationsByType(clazz)
|
|
||||||
)
|
|
||||||
.flatMap { array: Array<T>? -> Arrays.stream(array) }
|
|
||||||
.collect(Collectors.toList())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun beforeEach(context: ExtensionContext) {
|
|
||||||
extensionContext = context
|
|
||||||
setUp()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun afterEach(context: ExtensionContext) {
|
|
||||||
tearDown()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected val fixture: JavaCodeInsightTestFixture get() = testCase.getMyFixture()
|
|
||||||
}
|
|
@ -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();
|
||||||
|
}
|
@ -1,9 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import java.lang.annotation.Inherited
|
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
@Inherited
|
|
||||||
annotation class AddLocalJarToModule(vararg val value: KClass<*>)
|
|
@ -0,0 +1,24 @@
|
|||||||
|
package de.platon42.intellij.jupiter;
|
||||||
|
|
||||||
|
import com.intellij.openapi.roots.DependencyScope;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Inherited
|
||||||
|
@Repeatable(AddMavenDependencyToModule.List.class)
|
||||||
|
public @interface AddMavenDependencyToModule {
|
||||||
|
String value();
|
||||||
|
|
||||||
|
boolean includeTransitiveDependencies = false;
|
||||||
|
|
||||||
|
DependencyScope scope = DependencyScope.COMPILE;
|
||||||
|
|
||||||
|
@Target({ElementType.TYPE, ElementType.METHOD})
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Inherited
|
||||||
|
@interface List {
|
||||||
|
AddMavenDependencyToModule[] value();
|
||||||
|
}
|
||||||
|
}
|
@ -1,17 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import com.intellij.openapi.roots.DependencyScope
|
|
||||||
import java.lang.annotation.Inherited
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
@Inherited
|
|
||||||
@JvmRepeatable(
|
|
||||||
AddMavenDependencyToModule.List::class
|
|
||||||
)
|
|
||||||
annotation class AddMavenDependencyToModule(val value: String, val includeTransitiveDependencies: Boolean = false, val scope: DependencyScope = DependencyScope.COMPILE) {
|
|
||||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
@Inherited
|
|
||||||
annotation class List(vararg val value: AddMavenDependencyToModule)
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import com.intellij.testFramework.TestLoggerFactory
|
|
||||||
import com.intellij.testFramework.fixtures.IdeaTestExecutionPolicy
|
|
||||||
import com.intellij.testFramework.runInEdtAndWait
|
|
||||||
import org.junit.jupiter.api.extension.ExtensionContext
|
|
||||||
import org.junit.jupiter.api.extension.InvocationInterceptor
|
|
||||||
import org.junit.jupiter.api.extension.ReflectiveInvocationContext
|
|
||||||
import java.lang.reflect.Method
|
|
||||||
|
|
||||||
class EdtInterceptorExtension : InvocationInterceptor {
|
|
||||||
|
|
||||||
override fun interceptTestMethod(
|
|
||||||
invocation: InvocationInterceptor.Invocation<Void>,
|
|
||||||
invocationContext: ReflectiveInvocationContext<Method>,
|
|
||||||
extensionContext: ExtensionContext
|
|
||||||
) {
|
|
||||||
val throwables = arrayOfNulls<Throwable>(1)
|
|
||||||
|
|
||||||
val runnable = Runnable {
|
|
||||||
try {
|
|
||||||
TestLoggerFactory.onTestStarted()
|
|
||||||
invocation.proceed()
|
|
||||||
TestLoggerFactory.onTestFinished(true, extensionContext.displayName)
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
TestLoggerFactory.onTestFinished(false, extensionContext.displayName)
|
|
||||||
throwables[0] = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
invokeTestRunnable(runnable)
|
|
||||||
|
|
||||||
if (throwables[0] != null) {
|
|
||||||
throw throwables[0]!!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private fun invokeTestRunnable(runnable: Runnable) {
|
|
||||||
val policy = IdeaTestExecutionPolicy.current()
|
|
||||||
if (policy != null && !policy.runInDispatchThread()) {
|
|
||||||
runnable.run()
|
|
||||||
} else {
|
|
||||||
runInEdtAndWait {
|
|
||||||
runnable.run()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,259 @@
|
|||||||
|
package de.platon42.intellij.jupiter;
|
||||||
|
|
||||||
|
import com.intellij.jarRepository.JarRepositoryManager;
|
||||||
|
import com.intellij.jarRepository.RemoteRepositoryDescription;
|
||||||
|
import com.intellij.openapi.Disposable;
|
||||||
|
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.DependencyScope;
|
||||||
|
import com.intellij.openapi.roots.LibraryOrderEntry;
|
||||||
|
import com.intellij.openapi.roots.ModifiableRootModel;
|
||||||
|
import com.intellij.openapi.roots.libraries.Library;
|
||||||
|
import com.intellij.openapi.roots.libraries.LibraryTable;
|
||||||
|
import com.intellij.openapi.roots.libraries.ui.OrderRoot;
|
||||||
|
import com.intellij.openapi.util.Disposer;
|
||||||
|
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
|
import com.intellij.testFramework.EdtTestUtilKt;
|
||||||
|
import com.intellij.testFramework.LightProjectDescriptor;
|
||||||
|
import com.intellij.testFramework.PsiTestUtil;
|
||||||
|
import com.intellij.testFramework.TestLoggerFactory;
|
||||||
|
import com.intellij.testFramework.fixtures.IdeaTestExecutionPolicy;
|
||||||
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture;
|
||||||
|
import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryProperties;
|
||||||
|
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.Method;
|
||||||
|
import java.lang.reflect.Parameter;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class LightCodeInsightExtension implements ParameterResolver, AfterTestExecutionCallback, InvocationInterceptor {
|
||||||
|
|
||||||
|
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()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void interceptTestMethod(Invocation<Void> invocation, ReflectiveInvocationContext<Method> invocationContext, ExtensionContext extensionContext) throws Throwable {
|
||||||
|
Throwable[] throwables = new Throwable[1];
|
||||||
|
|
||||||
|
Runnable runnable = () -> {
|
||||||
|
try {
|
||||||
|
TestLoggerFactory.onTestStarted();
|
||||||
|
invocation.proceed();
|
||||||
|
TestLoggerFactory.onTestFinished(true);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
TestLoggerFactory.onTestFinished(false);
|
||||||
|
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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class LightCodeInsightFixtureTestCaseWrapper extends LightJavaCodeInsightFixtureTestCase {
|
||||||
|
private final ExtensionContext extensionContext;
|
||||||
|
|
||||||
|
private LightCodeInsightFixtureTestCaseWrapper(ExtensionContext extensionContext) {
|
||||||
|
this.extensionContext = extensionContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
Store store = getStore(extensionContext);
|
||||||
|
store.put("disposable", Disposer.newDisposable("LightCodeInsightFixtureTestCaseWrapper"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tearDown() throws Exception {
|
||||||
|
Store store = getStore(extensionContext);
|
||||||
|
Disposable disposable = (Disposable) store.get("disposable");
|
||||||
|
if (myFixture != null && disposable != null) {
|
||||||
|
Disposer.dispose(disposable);
|
||||||
|
store.remove("disposable");
|
||||||
|
}
|
||||||
|
super.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 localJars = getMethodOrClassAnnotation(AddLocalJarToModule.class);
|
||||||
|
if (localJars != null) {
|
||||||
|
Stream.of(localJars.value()).forEach(it -> addJarContaining(model, it));
|
||||||
|
}
|
||||||
|
List<AddMavenDependencyToModule> mavenDependencies = getMethodOrClassAnnotations(AddMavenDependencyToModule.class);
|
||||||
|
mavenDependencies.forEach(it -> addFromMaven(model, it.value(), it.includeTransitiveDependencies, it.scope));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
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(
|
||||||
|
model,
|
||||||
|
jarPath.getFileName().toString().replace(".jar", ""),
|
||||||
|
jarPath.getParent().toString(),
|
||||||
|
jarPath.getFileName().toString()
|
||||||
|
);
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
throw new IllegalArgumentException("Class URL malformed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addFromMaven(ModifiableRootModel model, String mavenCoordinates,
|
||||||
|
boolean includeTransitiveDependencies, DependencyScope dependencyScope) {
|
||||||
|
List<RemoteRepositoryDescription> remoteRepositoryDescriptions = RemoteRepositoryDescription.DEFAULT_REPOSITORIES;
|
||||||
|
RepositoryLibraryProperties libraryProperties = new RepositoryLibraryProperties(mavenCoordinates, includeTransitiveDependencies);
|
||||||
|
Collection<OrderRoot> roots =
|
||||||
|
JarRepositoryManager.loadDependenciesModal(model.getProject(), libraryProperties, false, false, null, remoteRepositoryDescriptions);
|
||||||
|
LibraryTable.ModifiableModel tableModel = model.getModuleLibraryTable().getModifiableModel();
|
||||||
|
Library library = tableModel.createLibrary(mavenCoordinates);
|
||||||
|
Library.ModifiableModel libraryModel = library.getModifiableModel();
|
||||||
|
if (roots.isEmpty()) {
|
||||||
|
throw new IllegalStateException(String.format("No roots for '%s'", mavenCoordinates));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (OrderRoot root : roots) {
|
||||||
|
libraryModel.addRoot(root.getFile(), root.getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
LibraryOrderEntry libraryOrderEntry = model.findLibraryOrderEntry(library);
|
||||||
|
if (libraryOrderEntry == null) {
|
||||||
|
throw new IllegalStateException("Unable to find registered library " + mavenCoordinates);
|
||||||
|
}
|
||||||
|
libraryOrderEntry.setScope(dependencyScope);
|
||||||
|
|
||||||
|
libraryModel.commit();
|
||||||
|
tableModel.commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T extends Annotation> List<T> getMethodOrClassAnnotations(Class<T> clazz) {
|
||||||
|
return Stream.of(extensionContext.getRequiredTestMethod().getAnnotationsByType(clazz),
|
||||||
|
extensionContext.getRequiredTestClass().getAnnotationsByType(clazz))
|
||||||
|
.flatMap(Arrays::stream)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
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();
|
||||||
|
}
|
@ -1,8 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import java.lang.annotation.Inherited
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
@Inherited
|
|
||||||
annotation class TestDataPath(val value: String)
|
|
@ -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();
|
||||||
|
}
|
@ -1,8 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import java.lang.annotation.Inherited
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
@Inherited
|
|
||||||
annotation class TestDataSubPath(val value: String)
|
|
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;
|
||||||
|
}
|
@ -1,9 +0,0 @@
|
|||||||
package de.platon42.intellij.jupiter
|
|
||||||
|
|
||||||
import com.intellij.pom.java.LanguageLevel
|
|
||||||
import java.lang.annotation.Inherited
|
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
|
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
|
||||||
@Inherited
|
|
||||||
annotation class TestJdk(val value: LanguageLevel)
|
|
@ -2,44 +2,45 @@ package de.platon42.intellij.plugins.cajon
|
|||||||
|
|
||||||
import com.intellij.codeInsight.intention.IntentionAction
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
import com.intellij.pom.java.LanguageLevel
|
import com.intellij.pom.java.LanguageLevel
|
||||||
import de.platon42.intellij.jupiter.AbstractJUnit5TestCase
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
import de.platon42.intellij.jupiter.AddLocalJarToModule
|
import de.platon42.intellij.jupiter.AddMavenDependencyToModule
|
||||||
|
import de.platon42.intellij.jupiter.LightCodeInsightExtension
|
||||||
import de.platon42.intellij.jupiter.TestDataPath
|
import de.platon42.intellij.jupiter.TestDataPath
|
||||||
import de.platon42.intellij.jupiter.TestJdk
|
import de.platon42.intellij.jupiter.TestJdk
|
||||||
import org.assertj.core.api.Assertions
|
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.assertj.core.api.Condition
|
import org.assertj.core.api.Condition
|
||||||
import org.junit.jupiter.api.DisplayNameGeneration
|
import org.junit.jupiter.api.DisplayNameGeneration
|
||||||
import org.junit.jupiter.api.DisplayNameGenerator
|
import org.junit.jupiter.api.DisplayNameGenerator
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
|
@ExtendWith(LightCodeInsightExtension::class)
|
||||||
@TestDataPath("src/test/resources")
|
@TestDataPath("src/test/resources")
|
||||||
@TestJdk(LanguageLevel.JDK_1_8)
|
@TestJdk(LanguageLevel.JDK_1_8, annotations = true, useInternal = true)
|
||||||
@AddLocalJarToModule(Assertions::class)
|
//@AddLocalJarToModule(Assertions::class)
|
||||||
//@AddMavenDependencyToModule("org.assertj:assertj-core:3.25.3", includeTransitiveDependencies = false, DependencyScope.COMPILE)
|
@AddMavenDependencyToModule("org.assertj:assertj-core:3.15.0")
|
||||||
@DisplayNameGeneration(AbstractCajonTest.CutOffFixtureDisplayNameGenerator::class)
|
@DisplayNameGeneration(AbstractCajonTest.CutOffFixtureDisplayNameGenerator::class)
|
||||||
abstract class AbstractCajonTest : AbstractJUnit5TestCase() {
|
abstract class AbstractCajonTest {
|
||||||
|
|
||||||
protected fun executeQuickFixes(regex: Regex, expectedFixes: Int) {
|
protected fun executeQuickFixes(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int) {
|
||||||
val quickfixes = getQuickFixes(regex, expectedFixes)
|
val quickfixes = getQuickFixes(myFixture, regex, expectedFixes)
|
||||||
assertThat(quickfixes.groupBy { it.familyName }).hasSize(1)
|
assertThat(quickfixes.groupBy { it.familyName }).hasSize(1)
|
||||||
quickfixes.forEach(fixture::launchAction)
|
quickfixes.forEach(myFixture::launchAction)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun executeQuickFixesNoFamilyNameCheck(regex: Regex, expectedFixes: Int) {
|
protected fun executeQuickFixesNoFamilyNameCheck(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int) {
|
||||||
val quickfixes = getQuickFixes(regex, expectedFixes)
|
val quickfixes = getQuickFixes(myFixture, regex, expectedFixes)
|
||||||
quickfixes.forEach(fixture::launchAction)
|
quickfixes.forEach(myFixture::launchAction)
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun getQuickFixes(regex: Regex, expectedFixes: Int): List<IntentionAction> {
|
protected fun getQuickFixes(myFixture: JavaCodeInsightTestFixture, regex: Regex, expectedFixes: Int): List<IntentionAction> {
|
||||||
val allFixes = fixture.getAllQuickFixes()
|
val quickfixes = myFixture.getAllQuickFixes().filter { it.text.matches(regex) }
|
||||||
val quickfixes = allFixes.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: ${allFixes.map { it.text }}").hasSize(expectedFixes)
|
|
||||||
return quickfixes
|
return quickfixes
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun assertHighlightings(count: Int, snippet: String) {
|
protected fun assertHighlightings(myFixture: JavaCodeInsightTestFixture, count: Int, snippet: String) {
|
||||||
assertThat(fixture.doHighlighting())
|
assertThat(myFixture.doHighlighting())
|
||||||
.areExactly(count, Condition({ it.description?.contains(snippet) ?: false }, "containing"))
|
.areExactly(count, Condition({ it.description?.contains(snippet) ?: false }, "containing"))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,4 +50,4 @@ abstract class AbstractCajonTest : AbstractJUnit5TestCase() {
|
|||||||
return nameForMethod.substringBefore("$")
|
return nameForMethod.substringBefore("$")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,19 +1,19 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
package de.platon42.intellij.plugins.cajon.inspections
|
||||||
|
|
||||||
import com.intellij.testFramework.RunsInEdt
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
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.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/BinaryExpression")
|
|
||||||
internal class AssertThatBinaryExpressionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatBinaryExpressionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@RunsInEdt
|
@TestDataSubPath("inspections/BinaryExpression")
|
||||||
internal fun assertThat_of_binary_expression_can_be_moved_out() {
|
internal fun assertThat_of_binary_expression_can_be_moved_out(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.enableInspections(AssertThatBinaryExpressionInspection::class.java)
|
myFixture.enableInspections(AssertThatBinaryExpressionInspection::class.java)
|
||||||
fixture.configureByFile("BinaryExpressionBefore.java")
|
myFixture.configureByFile("BinaryExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Split binary expression out of assertThat()"), 161)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Split binary expression out of assertThat()"), 161)
|
||||||
fixture.checkResultByFile("BinaryExpressionAfter.java")
|
myFixture.checkResultByFile("BinaryExpressionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,20 +1,22 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/BooleanCondition")
|
|
||||||
internal class AssertThatBooleanConditionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatBooleanConditionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_isEqualTo_true_or_false_can_use_isTrue_or_isFalse() {
|
@TestDataSubPath("inspections/BooleanCondition")
|
||||||
fixture.enableInspections(AssertThatBooleanConditionInspection::class.java)
|
internal fun assertThat_with_isEqualTo_true_or_false_can_use_isTrue_or_isFalse(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("BooleanConditionBefore.java")
|
myFixture.enableInspections(AssertThatBooleanConditionInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isTrue()"), 6)
|
myFixture.configureByFile("BooleanConditionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isFalse()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isTrue()"), 6)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotEqualTo() with isTrue()"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isFalse()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotEqualTo() with isFalse()"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotEqualTo() with isTrue()"), 4)
|
||||||
fixture.checkResultByFile("BooleanConditionAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotEqualTo() with isFalse()"), 4)
|
||||||
|
myFixture.checkResultByFile("BooleanConditionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.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
|
||||||
@ -9,68 +11,68 @@ import org.junit.jupiter.api.Test
|
|||||||
internal class AssertThatCollectionOrMapExpressionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatCollectionOrMapExpressionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Collection_and_Map_methods() {
|
internal fun assertThat_with_certain_Collection_and_Map_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.enableInspections(AssertThatCollectionOrMapExpressionInspection::class.java)
|
myFixture.enableInspections(AssertThatCollectionOrMapExpressionInspection::class.java)
|
||||||
fixture.configureByFile("CollectionMapExpressionBefore.java")
|
myFixture.configureByFile("CollectionMapExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove containsAll() of actual expression and use assertThat().containsAll() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsAll() of actual expression and use assertThat().containsAll() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().containsKey() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().containsKey() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().containsValue() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().containsValue() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 5)
|
||||||
executeQuickFixes(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(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(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(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().containsEntry() instead"), 2)
|
||||||
executeQuickFixes(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().doesNotContainEntry() instead"), 2)
|
||||||
executeQuickFixes(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().containsKey() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 4)
|
||||||
fixture.checkResultByFile("CollectionMapExpressionAfter.java")
|
myFixture.checkResultByFile("CollectionMapExpressionAfter.java")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Collection_and_Map_methods_with_Null_values() {
|
internal fun assertThat_with_certain_Collection_and_Map_methods_with_Null_values(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
||||||
inspection.behaviorForMapValueEqualsNull = 3
|
inspection.behaviorForMapValueEqualsNull = 3
|
||||||
fixture.enableInspections(inspection)
|
myFixture.enableInspections(inspection)
|
||||||
fixture.configureByFile("CollectionMapExpressionBefore.java")
|
myFixture.configureByFile("CollectionMapExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove containsAll() of actual expression and use assertThat().containsAll() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsAll() of actual expression and use assertThat().containsAll() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().containsKey() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsKey() of actual expression and use assertThat().containsKey() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().containsValue() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove containsValue() of actual expression and use assertThat().containsValue() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 5)
|
||||||
executeQuickFixes(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(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(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(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().containsEntry() instead"), 6)
|
||||||
executeQuickFixes(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().doesNotContainEntry() instead"), 2)
|
||||||
executeQuickFixes(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().containsKey() instead"), 4)
|
||||||
getQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
||||||
fixture.checkResultByFile("CollectionMapExpressionWithNullValuesAfter.java")
|
myFixture.checkResultByFile("CollectionMapExpressionWithNullValuesAfter.java")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Collection_and_Map_methods_with_no_quickfixes_for_get_equals_null() {
|
internal fun assertThat_with_certain_Collection_and_Map_methods_with_no_quickfixes_for_get_equals_null(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
||||||
inspection.behaviorForMapValueEqualsNull = 0
|
inspection.behaviorForMapValueEqualsNull = 0
|
||||||
|
|
||||||
fixture.enableInspections(inspection)
|
myFixture.enableInspections(inspection)
|
||||||
fixture.configureByFile("CollectionMapExpressionBefore.java")
|
myFixture.configureByFile("CollectionMapExpressionBefore.java")
|
||||||
getQuickFixes(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().containsEntry() instead"), 2)
|
||||||
getQuickFixes(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().doesNotContainEntry() instead"), 2)
|
||||||
getQuickFixes(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().containsKey() instead"), 4)
|
||||||
getQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Collection_and_Map_methods_with_only_warnings_for_get_equals_null() {
|
internal fun assertThat_with_certain_Collection_and_Map_methods_with_only_warnings_for_get_equals_null(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
||||||
inspection.behaviorForMapValueEqualsNull = 1
|
inspection.behaviorForMapValueEqualsNull = 1
|
||||||
|
|
||||||
fixture.enableInspections(inspection)
|
myFixture.enableInspections(inspection)
|
||||||
fixture.configureByFile("CollectionMapExpressionBefore.java")
|
myFixture.configureByFile("CollectionMapExpressionBefore.java")
|
||||||
val highlights = fixture.doHighlighting()
|
val highlights = myFixture.doHighlighting()
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.filter { it.description == "Moving get() expression out of assertThat() would be more concise" }
|
.filter { it.description == "Moving get() expression out of assertThat() would be more concise" }
|
||||||
.filter {
|
.filter {
|
||||||
@ -79,24 +81,24 @@ internal class AssertThatCollectionOrMapExpressionInspectionTest : AbstractCajon
|
|||||||
.toList()
|
.toList()
|
||||||
assertThat(highlights).hasSize(4)
|
assertThat(highlights).hasSize(4)
|
||||||
|
|
||||||
getQuickFixes(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().containsEntry() instead"), 2)
|
||||||
getQuickFixes(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().doesNotContainEntry() instead"), 2)
|
||||||
getQuickFixes(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().containsKey() instead"), 4)
|
||||||
getQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Collection_and_Map_methods_with_both_quickfixes_for_get_equals_null() {
|
internal fun assertThat_with_certain_Collection_and_Map_methods_with_both_quickfixes_for_get_equals_null(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
val inspection = AssertThatCollectionOrMapExpressionInspection()
|
||||||
inspection.behaviorForMapValueEqualsNull = 4
|
inspection.behaviorForMapValueEqualsNull = 4
|
||||||
|
|
||||||
fixture.enableInspections(inspection)
|
myFixture.enableInspections(inspection)
|
||||||
fixture.configureByFile("CollectionMapExpressionBefore.java")
|
myFixture.configureByFile("CollectionMapExpressionBefore.java")
|
||||||
getQuickFixes(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().containsEntry() instead"), 2)
|
||||||
getQuickFixes(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().doesNotContainKey() instead (regular map)"), 4)
|
||||||
getQuickFixes(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().containsEntry(key, null) instead (degenerated map)"), 4)
|
||||||
getQuickFixes(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().doesNotContainEntry() instead"), 2)
|
||||||
getQuickFixes(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().containsKey() instead"), 4)
|
||||||
getQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
getQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().doesNotContainKey() instead"), 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,22 +1,24 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/Comparable")
|
|
||||||
internal class AssertThatComparableInspectionTest : AbstractCajonTest() {
|
internal class AssertThatComparableInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_compareTo_method() {
|
@TestDataSubPath("inspections/Comparable")
|
||||||
fixture.enableInspections(AssertThatComparableInspection::class.java)
|
internal fun assertThat_with_compareTo_method(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("ComparableBefore.java")
|
myFixture.enableInspections(AssertThatComparableInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isEqualByComparingTo() instead"), 2)
|
myFixture.configureByFile("ComparableBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isNotEqualByComparingTo() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isEqualByComparingTo() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isGreaterThanOrEqualTo() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isNotEqualByComparingTo() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isGreaterThan() instead"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isGreaterThanOrEqualTo() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isLessThanOrEqualTo() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isGreaterThan() instead"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isLessThan() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isLessThanOrEqualTo() instead"), 4)
|
||||||
fixture.checkResultByFile("ComparableAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareTo() of actual expression and use assertThat().isLessThan() instead"), 4)
|
||||||
|
myFixture.checkResultByFile("ComparableAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,21 +1,23 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/EnumerableIsEmpty")
|
|
||||||
internal class AssertThatEnumerableIsEmptyInspectionTest : AbstractCajonTest() {
|
internal class AssertThatEnumerableIsEmptyInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_hasSize_zero_and_similar_can_use_isEmpty() {
|
@TestDataSubPath("inspections/EnumerableIsEmpty")
|
||||||
fixture.enableInspections(AssertThatEnumerableIsEmptyInspection::class.java)
|
internal fun assertThat_with_hasSize_zero_and_similar_can_use_isEmpty(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("EnumerableIsEmptyBefore.java")
|
myFixture.enableInspections(AssertThatEnumerableIsEmptyInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace hasSize() with isEmpty()"), 5)
|
myFixture.configureByFile("EnumerableIsEmptyBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace hasSizeLessThan() with isEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace hasSize() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace hasSizeLessThanOrEqualTo() with isEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace hasSizeLessThan() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace hasSizeGreaterThan() with isNotEmpty()"), 6)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace hasSizeLessThanOrEqualTo() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace hasSizeGreaterThanOrEqualTo() with isNotEmpty()"), 6)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace hasSizeGreaterThan() with isNotEmpty()"), 6)
|
||||||
fixture.checkResultByFile("EnumerableIsEmptyAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace hasSizeGreaterThanOrEqualTo() with isNotEmpty()"), 6)
|
||||||
|
myFixture.checkResultByFile("EnumerableIsEmptyAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,36 +1,38 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/FileExpression")
|
|
||||||
internal class AssertThatFileExpressionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatFileExpressionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_File_methods() {
|
@TestDataSubPath("inspections/FileExpression")
|
||||||
fixture.enableInspections(AssertThatFileExpressionInspection::class.java)
|
internal fun assertThat_with_certain_File_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("FileExpressionBefore.java")
|
myFixture.enableInspections(AssertThatFileExpressionInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove canRead() of actual expression and use assertThat().canRead() instead"), 3)
|
myFixture.configureByFile("FileExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove canWrite() of actual expression and use assertThat().canWrite() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove canRead() of actual expression and use assertThat().canRead() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove exists() of actual expression and use assertThat().exists() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove canWrite() of actual expression and use assertThat().canWrite() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove exists() of actual expression and use assertThat().doesNotExist() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove exists() of actual expression and use assertThat().exists() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isAbsolute() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove exists() of actual expression and use assertThat().doesNotExist() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isRelative() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isAbsolute() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isDirectory() of actual expression and use assertThat().isDirectory() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isRelative() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isFile() of actual expression and use assertThat().isFile() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isDirectory() of actual expression and use assertThat().isDirectory() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getName() of actual expression and use assertThat().hasName() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isFile() of actual expression and use assertThat().isFile() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasNoParent() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getName() of actual expression and use assertThat().hasName() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getParentFile() of actual expression and use assertThat().hasNoParent() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasNoParent() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasParent() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getParentFile() of actual expression and use assertThat().hasNoParent() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getParentFile() of actual expression and use assertThat().hasParent() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasParent() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove listFiles() of actual expression and use assertThat().isEmptyDirectory() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getParentFile() of actual expression and use assertThat().hasParent() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove listFiles() of actual expression and use assertThat().isNotEmptyDirectory() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove listFiles() of actual expression and use assertThat().isEmptyDirectory() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove list() of actual expression and use assertThat().isEmptyDirectory() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove listFiles() of actual expression and use assertThat().isNotEmptyDirectory() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove list() of actual expression and use assertThat().isNotEmptyDirectory() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove list() of actual expression and use assertThat().isEmptyDirectory() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove length() of actual expression and use assertThat().isEmpty() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove list() of actual expression and use assertThat().isNotEmptyDirectory() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove length() of actual expression and use assertThat().isNotEmpty() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove length() of actual expression and use assertThat().isEmpty() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove length() of actual expression and use assertThat().hasSize() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove length() of actual expression and use assertThat().isNotEmpty() instead"), 2)
|
||||||
fixture.checkResultByFile("FileExpressionAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove length() of actual expression and use assertThat().hasSize() instead"), 1)
|
||||||
|
myFixture.checkResultByFile("FileExpressionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,45 +1,48 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
package de.platon42.intellij.plugins.cajon.inspections
|
||||||
|
|
||||||
import de.platon42.intellij.jupiter.AddMavenDependencyToModule
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
import de.platon42.intellij.jupiter.AddLocalJarToModule
|
||||||
|
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
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@AddMavenDependencyToModule("org.assertj:assertj-guava:3.25.3")
|
@AddLocalJarToModule(com.google.common.base.Optional::class, org.assertj.guava.api.Assertions::class, Assertions::class)
|
||||||
@TestDataSubPath("inspections/GuavaOptional")
|
@TestDataSubPath("inspections/GuavaOptional")
|
||||||
internal class AssertThatGuavaOptionalInspectionTest : AbstractCajonTest() {
|
internal class AssertThatGuavaOptionalInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_get_or_isPresent_for_Guava_Optional_can_be_simplified() {
|
internal fun assertThat_get_or_isPresent_for_Guava_Optional_can_be_simplified(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
|
myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
|
||||||
fixture.configureByFile("GuavaOptionalBefore.java")
|
myFixture.configureByFile("GuavaOptionalBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isPresent() instead"), 6)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isPresent() instead"), 6)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isAbsent() instead"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isAbsent() instead"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove orNull() of actual expression and use assertThat().isPresent() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove orNull() of actual expression and use assertThat().isPresent() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove orNull() of actual expression and use assertThat().isAbsent() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove orNull() of actual expression and use assertThat().isAbsent() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().contains() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().contains() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Unwrap expected expression and replace isEqualTo() with contains()"), 6)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Unwrap expected expression and replace isEqualTo() with contains()"), 6)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with Guava assertThat().isAbsent()"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with Guava assertThat().isAbsent()"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotEqualTo() with Guava assertThat().isPresent()"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotEqualTo() with Guava assertThat().isPresent()"), 3)
|
||||||
fixture.checkResultByFile("GuavaOptionalAfter.java")
|
myFixture.checkResultByFile("GuavaOptionalAfter.java")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun adds_missing_Guava_import_any_order() {
|
internal fun adds_missing_Guava_import_any_order(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
|
myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
|
||||||
fixture.configureByFile("WithoutPriorGuavaImportBefore.java")
|
myFixture.configureByFile("WithoutPriorGuavaImportBefore.java")
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex(".*eplace .* with .*"), 4)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex(".*eplace .* with .*"), 4)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Remove .*"), 3)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Remove .*"), 3)
|
||||||
fixture.checkResultByFile("WithoutPriorGuavaImportAfter.java")
|
myFixture.checkResultByFile("WithoutPriorGuavaImportAfter.java")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun adds_missing_Guava_import_isAbsent_first() {
|
internal fun adds_missing_Guava_import_isAbsent_first(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
|
myFixture.enableInspections(AssertThatGuavaOptionalInspection::class.java)
|
||||||
fixture.configureByFile("WithoutPriorGuavaImportBefore.java")
|
myFixture.configureByFile("WithoutPriorGuavaImportBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with Guava assertThat().isAbsent()"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with Guava assertThat().isAbsent()"), 1)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex(".*eplace .* with .*"), 3)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex(".*eplace .* with .*"), 3)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Remove .*"), 3)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Remove .*"), 3)
|
||||||
fixture.checkResultByFile("WithoutPriorGuavaImportAfter.java")
|
myFixture.checkResultByFile("WithoutPriorGuavaImportAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,18 +1,20 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/InstanceOf")
|
|
||||||
internal class AssertThatInstanceOfInspectionTest : AbstractCajonTest() {
|
internal class AssertThatInstanceOfInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_instanceof_can_be_moved_out() {
|
@TestDataSubPath("inspections/InstanceOf")
|
||||||
fixture.enableInspections(AssertThatInstanceOfInspection::class.java)
|
internal fun assertThat_with_instanceof_can_be_moved_out(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("InstanceOfBefore.java")
|
myFixture.enableInspections(AssertThatInstanceOfInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove instanceof in actual expression and use assertThat().isInstanceOf() instead"), 6)
|
myFixture.configureByFile("InstanceOfBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove instanceof in actual expression and use assertThat().isNotInstanceOf() instead"), 6)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove instanceof in actual expression and use assertThat().isInstanceOf() instead"), 6)
|
||||||
fixture.checkResultByFile("InstanceOfAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove instanceof in actual expression and use assertThat().isNotInstanceOf() instead"), 6)
|
||||||
|
myFixture.checkResultByFile("InstanceOfAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,19 +1,21 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/InvertedBooleanCondition")
|
|
||||||
internal class AssertThatInvertedBooleanConditionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatInvertedBooleanConditionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_inverted_boolean_condition_can_be_inverted() {
|
@TestDataSubPath("inspections/InvertedBooleanCondition")
|
||||||
fixture.enableInspections(AssertThatInvertedBooleanConditionInspection::class.java)
|
internal fun assertThat_with_inverted_boolean_condition_can_be_inverted(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("InvertedBooleanConditionBefore.java")
|
myFixture.enableInspections(AssertThatInvertedBooleanConditionInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Invert condition in assertThat()"), 25)
|
myFixture.configureByFile("InvertedBooleanConditionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Invert condition in isEqualTo() and use isNotEqualTo() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Invert condition in assertThat()"), 25)
|
||||||
executeQuickFixes(Regex.fromLiteral("Invert condition in isNotEqualTo() and use isEqualTo() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Invert condition in isEqualTo() and use isNotEqualTo() instead"), 4)
|
||||||
fixture.checkResultByFile("InvertedBooleanConditionAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Invert condition in isNotEqualTo() and use isEqualTo() instead"), 2)
|
||||||
|
myFixture.checkResultByFile("InvertedBooleanConditionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,19 +1,21 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/IsZeroOne")
|
|
||||||
internal class AssertThatIsZeroOneInspectionTest : AbstractCajonTest() {
|
internal class AssertThatIsZeroOneInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_isEqualTo_zero_or_one_can_use_isZero_or_isOne_plus_isNotZero() {
|
@TestDataSubPath("inspections/IsZeroOne")
|
||||||
fixture.enableInspections(AssertThatIsZeroOneInspection::class.java)
|
internal fun assertThat_with_isEqualTo_zero_or_one_can_use_isZero_or_isOne_plus_isNotZero(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("IsZeroOneBefore.java")
|
myFixture.enableInspections(AssertThatIsZeroOneInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isZero()"), 10)
|
myFixture.configureByFile("IsZeroOneBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isOne()"), 10)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isZero()"), 10)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotEqualTo() with isNotZero()"), 10)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isOne()"), 10)
|
||||||
fixture.checkResultByFile("IsZeroOneAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotEqualTo() with isNotZero()"), 10)
|
||||||
|
myFixture.checkResultByFile("IsZeroOneAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,25 +1,27 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/Java8Optional")
|
|
||||||
internal class AssertThatJava8OptionalInspectionTest : AbstractCajonTest() {
|
internal class AssertThatJava8OptionalInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_get_or_isPresent_for_Java8_Optional_can_be_simplified() {
|
@TestDataSubPath("inspections/Java8Optional")
|
||||||
fixture.enableInspections(AssertThatJava8OptionalInspection::class.java)
|
internal fun assertThat_get_or_isPresent_for_Java8_Optional_can_be_simplified(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("Java8OptionalBefore.java")
|
myFixture.enableInspections(AssertThatJava8OptionalInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isPresent() instead"), 6)
|
myFixture.configureByFile("Java8OptionalBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isNotPresent() instead"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isPresent() instead"), 6)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove orElse() of actual expression and use assertThat().isPresent() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isPresent() of actual expression and use assertThat().isNotPresent() instead"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove orElse() of actual expression and use assertThat().isNotPresent() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove orElse() of actual expression and use assertThat().isPresent() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().contains() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove orElse() of actual expression and use assertThat().isNotPresent() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsSame() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().contains() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isNotPresent()"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove get() of actual expression and use assertThat().containsSame() instead"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotEqualTo() with isPresent()"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isNotPresent()"), 1)
|
||||||
executeQuickFixes(Regex.fromLiteral("Unwrap expected expression and replace isEqualTo() with contains()"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotEqualTo() with isPresent()"), 1)
|
||||||
fixture.checkResultByFile("Java8OptionalAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Unwrap expected expression and replace isEqualTo() with contains()"), 2)
|
||||||
|
myFixture.checkResultByFile("Java8OptionalAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,20 +1,22 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/ObjectExpression")
|
|
||||||
internal class AssertThatObjectExpressionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatObjectExpressionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Object_methods() {
|
@TestDataSubPath("inspections/ObjectExpression")
|
||||||
fixture.enableInspections(AssertThatObjectExpressionInspection::class.java)
|
internal fun assertThat_with_certain_Object_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("ObjectExpressionBefore.java")
|
myFixture.enableInspections(AssertThatObjectExpressionInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isEqualTo() instead"), 4)
|
myFixture.configureByFile("ObjectExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isNotEqualTo() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isEqualTo() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace calls to hashCode() with hasSameHashCodeAs()"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isNotEqualTo() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove toString() of actual expression and use assertThat().hasToString() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace calls to hashCode() with hasSameHashCodeAs()"), 1)
|
||||||
fixture.checkResultByFile("ObjectExpressionAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove toString() of actual expression and use assertThat().hasToString() instead"), 1)
|
||||||
|
myFixture.checkResultByFile("ObjectExpressionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,18 +1,20 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/ObjectIsNullOrNotNull")
|
|
||||||
internal class AssertThatObjectIsNullOrNotNullInspectionTest : AbstractCajonTest() {
|
internal class AssertThatObjectIsNullOrNotNullInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_isEqualTo_null_can_use_isNull() {
|
@TestDataSubPath("inspections/ObjectIsNullOrNotNull")
|
||||||
fixture.enableInspections(AssertThatObjectIsNullOrNotNullInspection::class.java)
|
internal fun assertThat_with_isEqualTo_null_can_use_isNull(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("ObjectIsNullOrNotNullBefore.java")
|
myFixture.enableInspections(AssertThatObjectIsNullOrNotNullInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isNull()"), 4)
|
myFixture.configureByFile("ObjectIsNullOrNotNullBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotEqualTo() with isNotNull()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isNull()"), 4)
|
||||||
fixture.checkResultByFile("ObjectIsNullOrNotNullAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotEqualTo() with isNotNull()"), 5)
|
||||||
|
myFixture.checkResultByFile("ObjectIsNullOrNotNullAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,22 +1,24 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/PathExpression")
|
|
||||||
internal class AssertThatPathExpressionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatPathExpressionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_Path_methods() {
|
@TestDataSubPath("inspections/PathExpression")
|
||||||
fixture.enableInspections(AssertThatPathExpressionInspection::class.java)
|
internal fun assertThat_with_certain_Path_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("PathExpressionBefore.java")
|
myFixture.enableInspections(AssertThatPathExpressionInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isAbsolute() instead"), 3)
|
myFixture.configureByFile("PathExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isRelative() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isAbsolute() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove startsWith() of actual expression and use assertThat().startsWithRaw() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isAbsolute() of actual expression and use assertThat().isRelative() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove endsWith() of actual expression and use assertThat().endsWithRaw() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove startsWith() of actual expression and use assertThat().startsWithRaw() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasNoParentRaw() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove endsWith() of actual expression and use assertThat().endsWithRaw() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasParentRaw() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasNoParentRaw() instead"), 2)
|
||||||
fixture.checkResultByFile("PathExpressionAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove getParent() of actual expression and use assertThat().hasParentRaw() instead"), 1)
|
||||||
|
myFixture.checkResultByFile("PathExpressionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,32 +1,34 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/Size")
|
|
||||||
internal class AssertThatSizeInspectionTest : AbstractCajonTest() {
|
internal class AssertThatSizeInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_size_of_array_collection_or_map_can_be_simplified() {
|
@TestDataSubPath("inspections/Size")
|
||||||
fixture.enableInspections(AssertThatSizeInspection::class.java)
|
internal fun assertThat_size_of_array_collection_or_map_can_be_simplified(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("SizeBefore.java")
|
myFixture.enableInspections(AssertThatSizeInspection::class.java)
|
||||||
assertHighlightings(1, "Try to operate on the iterable itself rather than its size")
|
myFixture.configureByFile("SizeBefore.java")
|
||||||
|
assertHighlightings(myFixture, 1, "Try to operate on the iterable itself rather than its size")
|
||||||
|
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isZero() with isEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isZero() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isNotZero() with isNotEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isNotZero() with isNotEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isGreaterThan() with isNotEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThan() with isNotEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with isNotEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with isNotEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isLessThan() with isEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThan() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isLessThanOrEqualTo() with isEmpty()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThanOrEqualTo() with isEmpty()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with hasSameSizeAs()"), 15)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSameSizeAs()"), 15)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with hasSize()"), 15)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with hasSize()"), 15)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isGreaterThan() with hasSizeGreaterThan()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThan() with hasSizeGreaterThan()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with hasSizeGreaterThanOrEqualTo()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isGreaterThanOrEqualTo() with hasSizeGreaterThanOrEqualTo()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isLessThan() with hasSizeLessThan()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThan() with hasSizeLessThan()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isLessThanOrEqualTo() with hasSizeLessThanOrEqualTo()"), 5)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isLessThanOrEqualTo() with hasSizeLessThanOrEqualTo()"), 5)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove size determination of expected expression and replace hasSize() with hasSameSizeAs()"), 17)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove size determination of expected expression and replace hasSize() with hasSameSizeAs()"), 17)
|
||||||
fixture.checkResultByFile("SizeAfter.java")
|
myFixture.checkResultByFile("SizeAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,39 +1,41 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/StringExpression")
|
|
||||||
internal class AssertThatStringExpressionInspectionTest : AbstractCajonTest() {
|
internal class AssertThatStringExpressionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_certain_String_methods() {
|
@TestDataSubPath("inspections/StringExpression")
|
||||||
fixture.enableInspections(AssertThatStringExpressionInspection::class.java)
|
internal fun assertThat_with_certain_String_methods(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("StringExpressionBefore.java")
|
myFixture.enableInspections(AssertThatStringExpressionInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 3)
|
myFixture.configureByFile("StringExpressionBefore.java")
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isEqualTo() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isEmpty() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove equalsIgnoreCase() of actual expression and use assertThat().isEqualToIgnoringCase() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isEqualTo() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove contentEquals() of actual expression and use assertThat().isEqualTo() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove equalsIgnoreCase() of actual expression and use assertThat().isEqualToIgnoringCase() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contentEquals() of actual expression and use assertThat().isEqualTo() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove startsWith() of actual expression and use assertThat().startsWith() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().contains() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove endsWith() of actual expression and use assertThat().endsWith() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove startsWith() of actual expression and use assertThat().startsWith() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove matches() of actual expression and use assertThat().matches() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove endsWith() of actual expression and use assertThat().endsWith() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove matches() of actual expression and use assertThat().doesNotMatch() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove matches() of actual expression and use assertThat().matches() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove matches() of actual expression and use assertThat().doesNotMatch() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isNotEqualTo() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove isEmpty() of actual expression and use assertThat().isNotEmpty() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove equalsIgnoreCase() of actual expression and use assertThat().isNotEqualToIgnoringCase() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove equals() of actual expression and use assertThat().isNotEqualTo() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove contentEquals() of actual expression and use assertThat().isNotEqualTo() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove equalsIgnoreCase() of actual expression and use assertThat().isNotEqualToIgnoringCase() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove contains() of actual expression and use assertThat().doesNotContain() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contentEquals() of actual expression and use assertThat().isNotEqualTo() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove startsWith() of actual expression and use assertThat().doesNotStartWith() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove contains() of actual expression and use assertThat().doesNotContain() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove endsWith() of actual expression and use assertThat().doesNotEndWith() instead"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove startsWith() of actual expression and use assertThat().doesNotStartWith() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareToIgnoreCase() of actual expression and use assertThat().isEqualToIgnoringCase() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove endsWith() of actual expression and use assertThat().doesNotEndWith() instead"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove compareToIgnoreCase() of actual expression and use assertThat().isNotEqualToIgnoringCase() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareToIgnoreCase() of actual expression and use assertThat().isEqualToIgnoringCase() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().startsWith() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove compareToIgnoreCase() of actual expression and use assertThat().isNotEqualToIgnoringCase() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().doesNotStartWith() instead"), 2)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().startsWith() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().contains() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().doesNotStartWith() instead"), 2)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().doesNotContain() instead"), 4)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().contains() instead"), 4)
|
||||||
executeQuickFixes(Regex.fromLiteral("Remove trim() of actual expression and use assertThat().isNotBlank() instead"), 1)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove indexOf() of actual expression and use assertThat().doesNotContain() instead"), 4)
|
||||||
fixture.checkResultByFile("StringExpressionAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Remove trim() of actual expression and use assertThat().isNotBlank() instead"), 1)
|
||||||
|
myFixture.checkResultByFile("StringExpressionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,25 +1,27 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.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.extrakting
|
import org.assertj.core.api.extrakting
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/StringIsEmpty")
|
|
||||||
internal class AssertThatStringIsEmptyInspectionTest : AbstractCajonTest() {
|
internal class AssertThatStringIsEmptyInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_with_isEqualTo_emptyString_can_use_isEmpty() {
|
@TestDataSubPath("inspections/StringIsEmpty")
|
||||||
fixture.enableInspections(AssertThatStringIsEmptyInspection::class.java)
|
internal fun assertThat_with_isEqualTo_emptyString_can_use_isEmpty(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("StringIsEmptyBefore.java")
|
myFixture.enableInspections(AssertThatStringIsEmptyInspection::class.java)
|
||||||
val highlights = fixture.doHighlighting()
|
myFixture.configureByFile("StringIsEmptyBefore.java")
|
||||||
|
val highlights = myFixture.doHighlighting()
|
||||||
.asSequence()
|
.asSequence()
|
||||||
.filter { it.description?.contains(" can be simplified to") ?: false }
|
.filter { it.description?.contains(" can be simplified to") ?: false }
|
||||||
.toList()
|
.toList()
|
||||||
assertThat(highlights).hasSize(6).extrakting { it.text }.doesNotContain("assertThat")
|
assertThat(highlights).hasSize(6).extrakting { it.text }.doesNotContain("assertThat")
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace isEqualTo() with isEmpty()"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace isEqualTo() with isEmpty()"), 3)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace hasSize() with isEmpty()"), 3)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace hasSize() with isEmpty()"), 3)
|
||||||
fixture.checkResultByFile("StringIsEmptyAfter.java")
|
myFixture.checkResultByFile("StringIsEmptyAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,20 +1,22 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
package de.platon42.intellij.plugins.cajon.inspections
|
||||||
|
|
||||||
import de.platon42.intellij.jupiter.AddMavenDependencyToModule
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
import de.platon42.intellij.jupiter.AddLocalJarToModule
|
||||||
|
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
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@AddMavenDependencyToModule("junit:junit:4.13.2")
|
@AddLocalJarToModule(Assertions::class, Test::class, org.junit.Test::class)
|
||||||
@AddMavenDependencyToModule("org.junit.jupiter:junit-jupiter-api:5.10.2")
|
|
||||||
@TestDataSubPath("inspections/AssumeThat")
|
|
||||||
internal class AssumeThatInsteadOfReturnInspectionTest : AbstractCajonTest() {
|
internal class AssumeThatInsteadOfReturnInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun conditional_returns_can_be_replaced_by_assumeThat() {
|
@TestDataSubPath("inspections/AssumeThat")
|
||||||
fixture.enableInspections(AssumeThatInsteadOfReturnInspection::class.java)
|
internal fun conditional_returns_can_be_replaced_by_assumeThat(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("AssumeThatBefore.java")
|
myFixture.enableInspections(AssumeThatInsteadOfReturnInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Replace if statement by assumeTrue()"), 5)
|
myFixture.configureByFile("AssumeThatBefore.java")
|
||||||
fixture.checkResultByFile("AssumeThatAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Replace if statement by assumeTrue()"), 5)
|
||||||
|
myFixture.checkResultByFile("AssumeThatAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,17 +1,19 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/BogusAssertion")
|
|
||||||
internal class BogusAssertionInspectionTest : AbstractCajonTest() {
|
internal class BogusAssertionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun reports_bogus_assertions() {
|
@TestDataSubPath("inspections/BogusAssertion")
|
||||||
fixture.enableInspections(BogusAssertionInspection::class.java)
|
internal fun reports_bogus_assertions(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("BogusAssertionBefore.java")
|
myFixture.enableInspections(BogusAssertionInspection::class.java)
|
||||||
assertHighlightings(14 * 9 + 10 + 12 + 8, "Actual expression in assertThat() is the same as expected")
|
myFixture.configureByFile("BogusAssertionBefore.java")
|
||||||
assertHighlightings(3, "Same actual and expected expression, but may be testing equals() or hashCode()")
|
assertHighlightings(myFixture, 14 * 9 + 10 + 12 + 8, "Actual expression in assertThat() is the same as expected")
|
||||||
|
assertHighlightings(myFixture, 3, "Same actual and expected expression, but may be testing equals() or hashCode()")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,21 +1,24 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
package de.platon42.intellij.plugins.cajon.inspections
|
||||||
|
|
||||||
import de.platon42.intellij.jupiter.AddMavenDependencyToModule
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
import de.platon42.intellij.jupiter.AddLocalJarToModule
|
||||||
|
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
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@AddMavenDependencyToModule("org.assertj:assertj-guava:3.25.3")
|
@AddLocalJarToModule(com.google.common.base.Optional::class, org.assertj.guava.api.Assertions::class, Assertions::class)
|
||||||
@TestDataSubPath("inspections/ImplicitAssertion")
|
|
||||||
internal class ImplicitAssertionInspectionTest : AbstractCajonTest() {
|
internal class ImplicitAssertionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun implicit_assertions_can_be_removed() {
|
@TestDataSubPath("inspections/ImplicitAssertion")
|
||||||
fixture.enableInspections(ImplicitAssertionInspection::class.java)
|
internal fun implicit_assertions_can_be_removed(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("ImplicitAssertionBefore.java")
|
myFixture.enableInspections(ImplicitAssertionInspection::class.java)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Delete implicit isNotNull\\(\\) covered by .*"), 102)
|
myFixture.configureByFile("ImplicitAssertionBefore.java")
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Delete implicit isNotEmpty\\(\\) covered by .*"), 17)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Delete implicit isNotNull\\(\\) covered by .*"), 102)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Delete implicit isPresent\\(\\) covered by .*"), 8)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Delete implicit isNotEmpty\\(\\) covered by .*"), 17)
|
||||||
fixture.checkResultByFile("ImplicitAssertionAfter.java")
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Delete implicit isPresent\\(\\) covered by .*"), 8)
|
||||||
|
myFixture.checkResultByFile("ImplicitAssertionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,20 +1,24 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
package de.platon42.intellij.plugins.cajon.inspections
|
||||||
|
|
||||||
import de.platon42.intellij.jupiter.AddMavenDependencyToModule
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
import de.platon42.intellij.jupiter.AddLocalJarToModule
|
||||||
|
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
|
||||||
|
import org.junit.Assert
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@AddMavenDependencyToModule("junit:junit:4.13.2")
|
@AddLocalJarToModule(Assert::class, Assertions::class)
|
||||||
@TestDataSubPath("inspections/JUnitAssertToAssertJ")
|
|
||||||
internal class JUnitAssertToAssertJInspectionTest : AbstractCajonTest() {
|
internal class JUnitAssertToAssertJInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun junit_Assertions_can_be_converted_into_AssertJ() {
|
@TestDataSubPath("inspections/JUnitAssertToAssertJ")
|
||||||
fixture.enableInspections(JUnitAssertToAssertJInspection::class.java)
|
internal fun junit_Assertions_can_be_converted_into_AssertJ(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("JUnitAssertToAssertJInspectionBefore.java")
|
myFixture.enableInspections(JUnitAssertToAssertJInspection::class.java)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Convert assert.*\\(\\) to assertThat\\(\\).*"), 48)
|
myFixture.configureByFile("JUnitAssertToAssertJInspectionBefore.java")
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Convert assume.*\\(\\) to assumeThat\\(\\).*"), 7)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Convert assert.*\\(\\) to assertThat\\(\\).*"), 48)
|
||||||
fixture.checkResultByFile("JUnitAssertToAssertJInspectionAfter.java")
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Convert assume.*\\(\\) to assumeThat\\(\\).*"), 7)
|
||||||
|
myFixture.checkResultByFile("JUnitAssertToAssertJInspectionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,17 +1,19 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/JoinStatements")
|
|
||||||
internal class JoinAssertThatStatementsInspectionTest : AbstractCajonTest() {
|
internal class JoinAssertThatStatementsInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun assertThat_statements_can_be_joined_together() {
|
@TestDataSubPath("inspections/JoinStatements")
|
||||||
fixture.enableInspections(JoinAssertThatStatementsInspection::class.java)
|
internal fun assertThat_statements_can_be_joined_together(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("JoinStatementsBefore.java")
|
myFixture.enableInspections(JoinAssertThatStatementsInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Join assertThat() statements"), 5)
|
myFixture.configureByFile("JoinStatementsBefore.java")
|
||||||
fixture.checkResultByFile("JoinStatementsAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Join assertThat() statements"), 5)
|
||||||
|
myFixture.checkResultByFile("JoinStatementsAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,17 +1,19 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/JoinVarArgsContains")
|
|
||||||
internal class JoinVarArgsContainsInspectionTest : AbstractCajonTest() {
|
internal class JoinVarArgsContainsInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun join_contains_and_doesNotContain_together_where_possible() {
|
@TestDataSubPath("inspections/JoinVarArgsContains")
|
||||||
fixture.enableInspections(JoinVarArgsContainsInspection::class.java)
|
internal fun join_contains_and_doesNotContain_together_where_possible(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("JoinVarArgsContainsBefore.java")
|
myFixture.enableInspections(JoinVarArgsContainsInspection::class.java)
|
||||||
executeQuickFixes(Regex.fromLiteral("Join multiple arguments to variadic argument method calls"), 3)
|
myFixture.configureByFile("JoinVarArgsContainsBefore.java")
|
||||||
fixture.checkResultByFile("JoinVarArgsContainsAfter.java")
|
executeQuickFixes(myFixture, Regex.fromLiteral("Join multiple arguments to variadic argument method calls"), 3)
|
||||||
|
myFixture.checkResultByFile("JoinVarArgsContainsAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,21 +1,23 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.inspections
|
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.jupiter.TestDataSubPath
|
||||||
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
import de.platon42.intellij.plugins.cajon.AbstractCajonTest
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@TestDataSubPath("inspections/TwistedAssertion")
|
|
||||||
internal class TwistedAssertionInspectionTest : AbstractCajonTest() {
|
internal class TwistedAssertionInspectionTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun hint_twisted_actual_and_expected_and_provide_quickfix_where_possible() {
|
@TestDataSubPath("inspections/TwistedAssertion")
|
||||||
fixture.enableInspections(TwistedAssertionInspection::class.java)
|
internal fun hint_twisted_actual_and_expected_and_provide_quickfix_where_possible(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFile("TwistedAssertionBefore.java")
|
myFixture.enableInspections(TwistedAssertionInspection::class.java)
|
||||||
assertHighlightings(9, "Actual expression in assertThat() is a constant")
|
myFixture.configureByFile("TwistedAssertionBefore.java")
|
||||||
assertHighlightings(10, "Twisted actual and expected expressions")
|
assertHighlightings(myFixture, 9, "Actual expression in assertThat() is a constant")
|
||||||
|
assertHighlightings(myFixture, 10, "Twisted actual and expected expressions")
|
||||||
|
|
||||||
executeQuickFixes(Regex.fromLiteral("Swap actual and expected expressions in assertion"), 6)
|
executeQuickFixes(myFixture, Regex.fromLiteral("Swap actual and expected expressions in assertion"), 6)
|
||||||
executeQuickFixesNoFamilyNameCheck(Regex("Replace .* by .* and swap actual and expected expressions"), 4)
|
executeQuickFixesNoFamilyNameCheck(myFixture, Regex("Replace .* by .* and swap actual and expected expressions"), 4)
|
||||||
fixture.checkResultByFile("TwistedAssertionAfter.java")
|
myFixture.checkResultByFile("TwistedAssertionAfter.java")
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package de.platon42.intellij.plugins.cajon.references
|
package de.platon42.intellij.plugins.cajon.references
|
||||||
|
|
||||||
|
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
||||||
|
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
|
||||||
@ -11,68 +13,68 @@ import org.junit.jupiter.api.Test
|
|||||||
internal class ExtractorReferenceContributorTest : AbstractCajonTest() {
|
internal class ExtractorReferenceContributorTest : AbstractCajonTest() {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_for_field_extracting() {
|
internal fun extractor_is_able_to_find_reference_for_field_extracting(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference1.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference1.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).isEqualTo("private String name;")
|
assertThat(myFixture.elementAtCaret.text).isEqualTo("private String name;")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_for_first_part_of_a_path() {
|
internal fun extractor_is_able_to_find_reference_for_first_part_of_a_path(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference2.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference2.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).isEqualTo("protected Address address;")
|
assertThat(myFixture.elementAtCaret.text).isEqualTo("protected Address address;")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_for_second_part_of_a_path_and_both_getter_and_field() {
|
internal fun extractor_is_able_to_find_reference_for_second_part_of_a_path_and_both_getter_and_field(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference3.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference3.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).startsWith("private String street;")
|
assertThat(myFixture.elementAtCaret.text).startsWith("private String street;")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_on_a_bare_method_call() {
|
internal fun extractor_is_able_to_find_reference_on_a_bare_method_call(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference4.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference4.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).startsWith("public Boolean getREALLYnoMAILINGS()")
|
assertThat(myFixture.elementAtCaret.text).startsWith("public Boolean getREALLYnoMAILINGS()")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_with_only_Getter_on_second_part() {
|
internal fun extractor_is_able_to_find_reference_with_only_Getter_on_second_part(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference5.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference5.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).startsWith("public boolean isNoMailings()")
|
assertThat(myFixture.elementAtCaret.text).startsWith("public boolean isNoMailings()")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_using_byName_extractor() {
|
internal fun extractor_is_able_to_find_reference_using_byName_extractor(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference6.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference6.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).isEqualTo("private String name;")
|
assertThat(myFixture.elementAtCaret.text).isEqualTo("private String name;")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_using_resultOf_extractor() {
|
internal fun extractor_is_able_to_find_reference_using_resultOf_extractor(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference7.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference7.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).startsWith("public String getStreetName()")
|
assertThat(myFixture.elementAtCaret.text).startsWith("public String getStreetName()")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_for_field_extraction_on_list() {
|
internal fun extractor_is_able_to_find_reference_for_field_extraction_on_list(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference8.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference8.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).isEqualTo("private String name;")
|
assertThat(myFixture.elementAtCaret.text).isEqualTo("private String name;")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_for_field_flat_extraction_of_path_on_list() {
|
internal fun extractor_is_able_to_find_reference_for_field_flat_extraction_of_path_on_list(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference9.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference9.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).startsWith("private String street;")
|
assertThat(myFixture.elementAtCaret.text).startsWith("private String street;")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_able_to_find_reference_for_extraction_on_result_of_method() {
|
internal fun extractor_is_able_to_find_reference_for_extraction_on_result_of_method(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference10.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference10.java", "Address.java", "Contact.java")
|
||||||
assertThat(fixture.elementAtCaret.text).startsWith("public String getStreetName()")
|
assertThat(myFixture.elementAtCaret.text).startsWith("public String getStreetName()")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
internal fun extractor_is_unable_to_find_reference() {
|
internal fun extractor_is_unable_to_find_reference(@MyFixture myFixture: JavaCodeInsightTestFixture) {
|
||||||
fixture.configureByFiles("FindReference11.java", "Address.java", "Contact.java")
|
myFixture.configureByFiles("FindReference11.java", "Address.java", "Contact.java")
|
||||||
assertThatThrownBy { fixture.elementAtCaret.text }.isInstanceOf(AssertionError::class.java)
|
assertThatThrownBy { myFixture.elementAtCaret.text }.isInstanceOf(AssertionError::class.java)
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user