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 [](https://app.travis-ci.com/chrisly42/cajon-plugin) [](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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user