From cde1c39e0ba2fdbd9791054d2ec12765b824f4f0 Mon Sep 17 00:00:00 2001 From: Amitoj Duggal Date: Mon, 17 Jun 2024 14:12:08 +0200 Subject: [PATCH 001/118] Add Kotlin support for Junit 5 recipes 1: CleanupJUnitImports (#528) * Adding Kotlin support to the recipes, fixing the recipes to work use preVisit instead of visitCompilationUnit. * Do a single recipe run per unit test * Stop after pre visit, since we're only updating imports --------- Co-authored-by: Amitoj Duggal Co-authored-by: Tim te Beek --- build.gradle.kts | 1 + .../testing/junit5/CleanupJUnitImports.java | 17 ++++--- .../junit5/CleanupJUnitImportsTest.java | 44 +++++++++++++++++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6e03b6a63..4f3662b82 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,6 +43,7 @@ dependencies { testImplementation("org.openrewrite:rewrite-java-17") testImplementation("org.openrewrite:rewrite-groovy") + testImplementation("org.openrewrite:rewrite-kotlin:$rewriteVersion") testImplementation("org.openrewrite.gradle.tooling:model:$rewriteVersion") testRuntimeOnly("org.gradle:gradle-tooling-api:latest.release") diff --git a/src/main/java/org/openrewrite/java/testing/junit5/CleanupJUnitImports.java b/src/main/java/org/openrewrite/java/testing/junit5/CleanupJUnitImports.java index a411e92b2..77a408c1b 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/CleanupJUnitImports.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/CleanupJUnitImports.java @@ -22,6 +22,7 @@ import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaSourceFile; public class CleanupJUnitImports extends Recipe { @Override @@ -44,14 +45,18 @@ public TreeVisitor getVisitor() { public static class CleanupJUnitImportsVisitor extends JavaIsoVisitor { @Override - public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) { - for (J.Import im : cu.getImports()) { - String packageName = im.getPackageName(); - if (packageName.startsWith("junit") || (packageName.startsWith("org.junit") && !packageName.contains("jupiter"))) { - maybeRemoveImport(im.getTypeName()); + public J preVisit(J tree, ExecutionContext ctx) { + stopAfterPreVisit(); + if (tree instanceof JavaSourceFile) { + JavaSourceFile c = (JavaSourceFile) tree; + for (J.Import imp : c.getImports()) { + String packageName = imp.getPackageName(); + if (packageName.startsWith("junit") || (packageName.startsWith("org.junit") && !packageName.contains("jupiter"))) { + maybeRemoveImport(imp.getTypeName()); + } } } - return cu; + return tree; } } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/CleanupJUnitImportsTest.java b/src/test/java/org/openrewrite/java/testing/junit5/CleanupJUnitImportsTest.java index f59a1cbea..30ec0e109 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/CleanupJUnitImportsTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/CleanupJUnitImportsTest.java @@ -19,10 +19,12 @@ import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.java.JavaParser; +import org.openrewrite.kotlin.KotlinParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.kotlin.Assertions.kotlin; class CleanupJUnitImportsTest implements RewriteTest { @@ -31,14 +33,16 @@ public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13")) + .parser(KotlinParser.builder() + .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13")) .recipe(new CleanupJUnitImports()); } @DocumentExample @Test void removesUnusedImport() { - //language=java rewriteRun( + //language=java java( """ import org.junit.Test; @@ -48,14 +52,25 @@ public class MyTest {} """ public class MyTest {} """ + ), + //language=kotlin + kotlin( + """ + import org.junit.Test + + class MyTest {} + """, + """ + class MyTest {} + """ ) ); } @Test void leavesOtherImportsAlone() { - //language=java rewriteRun( + //language=java java( """ import java.util.Arrays; @@ -65,14 +80,25 @@ void leavesOtherImportsAlone() { public class MyTest { } """ + ), + //language=kotlin + kotlin( + """ + import java.util.Arrays + import java.util.Collections + import java.util.HashSet + + class MyTest { + } + """ ) ); } @Test void leavesUsedJUnitImportAlone() { - //language=java rewriteRun( + //language=java java( """ import org.junit.Test; @@ -82,7 +108,19 @@ public class MyTest { public void foo() {} } """ + ), + //language=kotlin + kotlin( + """ + import org.junit.Test + + class MyTest { + @Test + fun foo() {} + } + """ ) ); + } } From 60cff4b0bfdd8c426be9815d552f938b6644aea9 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 17 Jun 2024 19:20:19 +0200 Subject: [PATCH 002/118] Add Picnic AssertJ rules to AssertJ best practices (#527) * Add Picnic AssertJ rules to AssertJ best practices * Include Picnic's JUnitToAssertJRulesRecipes in migration * Exclude `jakarta.xml.bind-api` from TimeFold * Move the exclude to rewrite-third-party --- build.gradle.kts | 1 + .../testing/assertj/IsEqualToEmptyString.java | 7 +++++++ src/main/resources/META-INF/rewrite/assertj.yml | 17 +++++++++++++++++ ...gTest.java => AssertJBestPracticesTest.java} | 4 ++-- 4 files changed, 27 insertions(+), 2 deletions(-) rename src/test/java/org/openrewrite/java/testing/assertj/{IsEqualToEmptyStringTest.java => AssertJBestPracticesTest.java} (93%) diff --git a/build.gradle.kts b/build.gradle.kts index 4f3662b82..4efd2fa0e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,6 +34,7 @@ dependencies { implementation("org.openrewrite:rewrite-maven") implementation("org.openrewrite.recipe:rewrite-java-dependencies:$rewriteVersion") implementation("org.openrewrite.recipe:rewrite-static-analysis:$rewriteVersion") + implementation("org.openrewrite.recipe:rewrite-third-party:$rewriteVersion") runtimeOnly("org.openrewrite:rewrite-java-17") compileOnly("org.projectlombok:lombok:latest.release") diff --git a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java index 168c14324..184ef6dee 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java @@ -27,6 +27,13 @@ import java.util.Collections; +/** + * AssertJ has a more idiomatic way of asserting that a String is empty. + * This recipe will find instances of `assertThat(String).isEqualTo("")` and replace them with `isEmpty()`. + * + * @deprecated Use {@link tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes.AbstractStringAssertStringIsEmptyRecipe} instead. + */ +@Deprecated public class IsEqualToEmptyString extends Recipe { private static final MethodMatcher IS_EQUAL_TO = new MethodMatcher("org.assertj.core.api.AbstractStringAssert isEqualTo(java.lang.String)"); diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 2695a5dd0..f928d283a 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -28,6 +28,22 @@ recipeList: - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions - org.openrewrite.java.testing.assertj.IsEqualToEmptyString + - tech.picnic.errorprone.refasterrules.AssertJBigDecimalRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJBigIntegerRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJBooleanRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJByteRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJCharSequenceRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJDoubleRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJFloatRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJIntegerRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJLongRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJNumberRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJPrimitiveRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJShortRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJThrowingCallableRulesRecipes + --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.StaticImports @@ -365,3 +381,4 @@ recipeList: version: 3.x onlyIfUsing: org.assertj.core.api.Assertions acceptTransitive: true + - tech.picnic.errorprone.refasterrules.JUnitToAssertJRulesRecipes diff --git a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java similarity index 93% rename from src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java rename to src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java index 9edf572d6..4252b33ff 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java @@ -24,13 +24,13 @@ import static org.openrewrite.java.Assertions.java; -class IsEqualToEmptyStringTest implements RewriteTest { +class AssertJBestPracticesTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) - .recipe(new IsEqualToEmptyString()); + .recipeFromResources("org.openrewrite.java.testing.assertj.Assertj"); } @DocumentExample From f67d1e9e0ada45239d2bbdfc3b6f969869d50f06 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 18 Jun 2024 20:32:30 +0000 Subject: [PATCH 003/118] refactor: Only publish build scans if authenticated Use this link to re-run the recipe: https://app.moderne.io/recipes/builder/kLJjXlflM?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- settings.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/settings.gradle.kts b/settings.gradle.kts index 19421c709..991d06956 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,6 +30,12 @@ develocity { fileFingerprints = true } + publishing { + onlyIf { + authenticated + } + } + uploadInBackground = !isCiServer } } From 6a58d6cd03cbadefab9a114a02b6f92c067f692f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 19 Jun 2024 15:52:52 +0200 Subject: [PATCH 004/118] Drop Java 17 requirement through rewrite-third-party (#531) --- build.gradle.kts | 1 - .../testing/assertj/IsEqualToEmptyString.java | 3 --- src/main/resources/META-INF/rewrite/assertj.yml | 17 ----------------- 3 files changed, 21 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4efd2fa0e..4f3662b82 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,7 +34,6 @@ dependencies { implementation("org.openrewrite:rewrite-maven") implementation("org.openrewrite.recipe:rewrite-java-dependencies:$rewriteVersion") implementation("org.openrewrite.recipe:rewrite-static-analysis:$rewriteVersion") - implementation("org.openrewrite.recipe:rewrite-third-party:$rewriteVersion") runtimeOnly("org.openrewrite:rewrite-java-17") compileOnly("org.projectlombok:lombok:latest.release") diff --git a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java index 184ef6dee..fb014fd94 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java @@ -30,10 +30,7 @@ /** * AssertJ has a more idiomatic way of asserting that a String is empty. * This recipe will find instances of `assertThat(String).isEqualTo("")` and replace them with `isEmpty()`. - * - * @deprecated Use {@link tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes.AbstractStringAssertStringIsEmptyRecipe} instead. */ -@Deprecated public class IsEqualToEmptyString extends Recipe { private static final MethodMatcher IS_EQUAL_TO = new MethodMatcher("org.assertj.core.api.AbstractStringAssert isEqualTo(java.lang.String)"); diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index f928d283a..2695a5dd0 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -28,22 +28,6 @@ recipeList: - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions - org.openrewrite.java.testing.assertj.IsEqualToEmptyString - - tech.picnic.errorprone.refasterrules.AssertJBigDecimalRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJBigIntegerRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJBooleanRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJByteRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJCharSequenceRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJDoubleRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJFloatRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJIntegerRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJLongRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJNumberRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJPrimitiveRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJShortRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes - - tech.picnic.errorprone.refasterrules.AssertJThrowingCallableRulesRecipes - --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.StaticImports @@ -381,4 +365,3 @@ recipeList: version: 3.x onlyIfUsing: org.assertj.core.api.Assertions acceptTransitive: true - - tech.picnic.errorprone.refasterrules.JUnitToAssertJRulesRecipes From 288c9ef266076d82a11b3907d47f713290a51bfe Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Thu, 20 Jun 2024 19:28:43 +1000 Subject: [PATCH 005/118] Jmockit Expectations with no times or result should be transformed to Mockito verify statement (#530) * Ensure Jmockit expectations with no times or result transform to a mockito verify * Minor polish to text blocks * Make times, minTimes, maxTimes more flexible as it was originally so even if someone mistakenly puts times and minTimes together, it still migrates without issue --------- Co-authored-by: Tim te Beek --- .../jmockit/ExpectationsBlockRewriter.java | 43 +- .../JMockitExpectationsToMockitoTest.java | 383 +++++++++++++++--- 2 files changed, 352 insertions(+), 74 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java index c45b0b798..ae2dce1ee 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java @@ -17,6 +17,7 @@ import org.openrewrite.Cursor; import org.openrewrite.ExecutionContext; +import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.JavaVisitor; @@ -118,22 +119,31 @@ private void rewriteMethodBody(List expectationStatements) { return; } J.MethodInvocation invocation = (J.MethodInvocation) expectationStatements.get(0); - if (!mockInvocationResults.getResults().isEmpty()) { + boolean hasExpectationsResults = !mockInvocationResults.getResults().isEmpty(); + if (hasExpectationsResults) { // rewrite the statement to mockito if there are results rewriteExpectationResult(mockInvocationResults.getResults(), invocation); } else if (nextStatementCoordinates.isReplacement()) { // if there are no results and the Expectations block is not yet replaced, remove it removeExpectationsStatement(); } + + boolean hasTimes = false; if (mockInvocationResults.getTimes() != null) { + hasTimes = true; writeMethodVerification(invocation, mockInvocationResults.getTimes(), "times"); } if (mockInvocationResults.getMinTimes() != null) { + hasTimes = true; writeMethodVerification(invocation, mockInvocationResults.getMinTimes(), "atLeast"); } if (mockInvocationResults.getMaxTimes() != null) { + hasTimes = true; writeMethodVerification(invocation, mockInvocationResults.getMaxTimes(), "atMost"); } + if (!hasExpectationsResults && !hasTimes) { + writeMethodVerification(invocation, null, null); + } } private void rewriteExpectationResult(List results, J.MethodInvocation invocation) { @@ -182,18 +192,22 @@ private void removeExpectationsStatement() { methodBody.getStatements().get(bodyStatementIndex + numStatementsAdded).getCoordinates().after(); } - private void writeMethodVerification(J.MethodInvocation invocation, Expression times, String verificationMode) { + private void writeMethodVerification(J.MethodInvocation invocation, @Nullable Expression times, @Nullable String verificationMode) { String fqn = getInvocationSelectFullyQualifiedClassName(invocation); if (fqn == null) { // cannot write a verification statement for an invocation without a select field return; } visitor.maybeAddImport("org.mockito.Mockito", "verify"); - visitor.maybeAddImport("org.mockito.Mockito", verificationMode); + if (verificationMode != null) { + visitor.maybeAddImport("org.mockito.Mockito", verificationMode); + } List templateParams = new ArrayList<>(); templateParams.add(invocation.getSelect()); - templateParams.add(times); + if (times != null) { + templateParams.add(times); + } templateParams.add(invocation.getName().getSimpleName()); String verifyTemplate = getVerifyTemplate(invocation.getArguments(), fqn, verificationMode, templateParams); @@ -251,17 +265,20 @@ private static void appendToTemplate(StringBuilder templateBuilder, boolean buil templateBuilder.append(templateField); } - private static String getVerifyTemplate(List arguments, String fqn, String verificationMode, List templateParams) { + private static String getVerifyTemplate(List arguments, String fqn, @Nullable String verificationMode, List templateParams) { + StringBuilder templateBuilder = new StringBuilder("verify(#{any(" + fqn + ")}"); // verify(object + if (verificationMode != null) { + templateBuilder.append(", ").append(verificationMode).append("(#{any(int)})"); // verify(object, times(2) + } + templateBuilder.append(").#{}("); // verify(object, times(2)).method( + if (arguments.isEmpty()) { - return "verify(#{any(" + fqn + ")}, " - + verificationMode - + "(#{any(int)})).#{}();"; + templateBuilder.append(");"); // verify(object, times(2)).method(); + return templateBuilder.toString(); } - StringBuilder templateBuilder = new StringBuilder("verify(#{any(" + fqn + ")}, " - + verificationMode - + "(#{any(int)})).#{}("); + boolean hasArgument = false; - for (Expression argument : arguments) { + for (Expression argument : arguments) { // verify(object, times(2).method(anyLong(), any Int() if (argument instanceof J.Empty) { continue; } else if (argument instanceof J.Literal) { @@ -276,7 +293,7 @@ private static String getVerifyTemplate(List arguments, String fqn, if (hasArgument) { templateBuilder.delete(templateBuilder.length() - 2, templateBuilder.length()); } - templateBuilder.append(");"); + templateBuilder.append(");"); // verify(object, times(2).method(anyLong(), any Int()); return templateBuilder.toString(); } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index 72d8cfe7d..69f4627fe 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -44,7 +44,7 @@ public void defaults(RecipeSpec spec) { @DocumentExample @Test - void voidResult() { + void whenNoResultNoTimes() { //language=java rewriteRun( java( @@ -71,6 +71,55 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @DocumentExample + @Test + void whenNoResultNoTimesNoArgs() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(); + }}; + myObject.wait(10L, 10); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) class MyTest { @@ -79,6 +128,7 @@ class MyTest { void test() { myObject.wait(10L, 10); + verify(myObject).wait(); } } """ @@ -159,19 +209,19 @@ public int getSomeField() { """ ), java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -190,7 +240,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @@ -225,19 +275,19 @@ public String getSomeField(String s) { """ ), java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(anyString); @@ -251,7 +301,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; @@ -285,21 +335,21 @@ public String getSomeField() { """ ), java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + String expected = "expected"; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -313,17 +363,17 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + String expected = "expected"; - + void test() { when(myObject.getSomeField()).thenReturn(expected); assertEquals(expected, myObject.getSomeField()); @@ -348,19 +398,19 @@ public Object getSomeField() { """ ), java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNotNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -374,7 +424,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @@ -529,7 +579,7 @@ public String getSomeOtherField(Object input) { """ ), java( - """ + """ import java.util.ArrayList; import java.util.List; @@ -544,7 +594,7 @@ public String getSomeOtherField(Object input) { class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField((List) any); @@ -572,7 +622,7 @@ void test() { class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField(anyList())).thenReturn(null); when(myObject.getSomeOtherField(any(Object.class))).thenReturn(null); @@ -585,6 +635,73 @@ void test() { ); } + @Test + void whenNoArguments() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertNull; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new Expectations() {{ + myObject.getSomeField(); + result = null; + }}; + assertNull(myObject.getSomeField()); + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertNull; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + when(myObject.getSomeField()).thenReturn(null); + assertNull(myObject.getSomeField()); + } + } + """ + ) + ); + } + @Test void whenMixedArgumentMatcher() { //language=java @@ -601,7 +718,7 @@ public String getSomeField(String s, String s2, String s3, long l1) { """ ), java( - """ + """ import java.util.ArrayList; import java.util.List; @@ -616,7 +733,7 @@ public String getSomeField(String s, String s2, String s3, long l1) { class MyTest { @Mocked MyObject myObject; - + void test() { String bazz = "bazz"; new Expectations() {{ @@ -642,7 +759,7 @@ void test() { class MyTest { @Mock MyObject myObject; - + void test() { String bazz = "bazz"; when(myObject.getSomeField(eq("foo"), anyString(), eq(bazz), eq(10L))).thenReturn(null); @@ -672,31 +789,31 @@ public String getString() { """ ), java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; String s = "s"; - + new Expectations() {{ myObject.getSomeField(anyString); result = s; - + myObject.getString(); result = a; }}; - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -706,7 +823,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; @@ -719,11 +836,11 @@ class MyTest { void test() { String a = "a"; String s = "s"; - + when(myObject.getSomeField(anyString())).thenReturn(s); - + when(myObject.getString()).thenReturn(a); - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -747,19 +864,19 @@ public String getSomeField(String s) { """ ), java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; new Expectations() {{ @@ -768,7 +885,7 @@ void test() { String b = "b"; result = s; }}; - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -777,7 +894,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; @@ -792,7 +909,7 @@ void test() { String s = "s"; String b = "b"; when(myObject.getSomeField(anyString())).thenReturn(s); - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -803,6 +920,55 @@ void test() { @Test void whenTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(anyLong, anyInt); + times = 2; + }}; + myObject.wait(10L, 10); + myObject.wait(10L, 10); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + verify(myObject, times(2)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMinTimes() { //language=java rewriteRun( java( @@ -820,9 +986,55 @@ class MyTest { void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); - times = 2; + minTimes = 2; }}; myObject.wait(10L, 10); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject, atLeast(2)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMaxTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(anyLong, anyInt); + maxTimes = 5; + }}; myObject.wait(10L, 10); } } @@ -831,9 +1043,9 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock @@ -841,8 +1053,56 @@ class MyTest { void test() { myObject.wait(10L, 10); + verify(myObject, atMost(5)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMinTimesMaxTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(anyLong, anyInt); + minTimes = 1; + maxTimes = 3; + }}; + myObject.wait(10L, 10); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { myObject.wait(10L, 10); - verify(myObject, times(2)).wait(anyLong(), anyInt()); + verify(myObject, atLeast(1)).wait(anyLong(), anyInt()); + verify(myObject, atMost(3)).wait(anyLong(), anyInt()); } } """ @@ -869,14 +1129,14 @@ public String getSomeField() { import mockit.Tested; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Tested MyObject myObject; - + void test() { new Expectations(myObject) {{ myObject.getSomeField(); @@ -890,15 +1150,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @InjectMocks MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn("foo"); assertEquals("foo", myObject.getSomeField()); @@ -943,10 +1203,10 @@ public void doSomething() {} class MyTest { @Mocked Object myObject; - + @Mocked MyObject myOtherObject; - + void test() { new Expectations() {{ myObject.hashCode(); @@ -989,6 +1249,7 @@ void test() { assertNull(myOtherObject.getSomeObjectField()); myObject.wait(10L, 10); assertEquals("foo", myOtherObject.getSomeStringField("bar", 10L)); + verify(myObject).wait(anyLong(), anyInt()); } } """ From 8388b2898794e4ff0bb26d404d4c173246ff14b1 Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Thu, 20 Jun 2024 20:59:50 +1000 Subject: [PATCH 006/118] Rewrite both JMockit `@Mocked` and `@Injectable` annotated arguments (#532) * Ensure Jmockit expectations with no times or result transform to a mockito verify * Minor polish to text blocks * Make times, minTimes, maxTimes more flexible as it was originally so even if someone mistakenly puts times and minTimes together, it still migrates without issue * Add feature to enable migration of Jmockit Injectable annotation exactly as we are doing the Mocked annotation ie method parameter annotation as well as field annotation. Have moved all of the code from JMockitMockedVariableToMockito to JMockitAnnotationToMockito for code reuse. Also add the corresponding test cases and jmockit.yml file modification. * Use `@Option` instead of inheritance * Drop Option and just replace both variants * Update display name and description to match application --------- Co-authored-by: Tim te Beek --- .../JMockitAnnotatedArgumentToMockito.java | 108 ++++++++++++++++++ .../JMockitMockedVariableToMockito.java | 106 ----------------- .../java/testing/jmockit/package-info.java | 19 +++ .../resources/META-INF/rewrite/jmockit.yml | 2 +- ...MockitAnnotatedArgumentToMockitoTest.java} | 95 +++++++++++++-- 5 files changed, 214 insertions(+), 116 deletions(-) create mode 100644 src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java delete mode 100644 src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockito.java create mode 100644 src/main/java/org/openrewrite/java/testing/jmockit/package-info.java rename src/test/java/org/openrewrite/java/testing/jmockit/{JMockitMockedVariableToMockitoTest.java => JMockitAnnotatedArgumentToMockitoTest.java} (59%) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java new file mode 100644 index 000000000..a89e16e89 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java @@ -0,0 +1,108 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.search.FindAnnotations; +import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.Statement; + +import java.util.ArrayList; +import java.util.List; + +@EqualsAndHashCode(callSuper = false) +public class JMockitAnnotatedArgumentToMockito extends Recipe { + @Override + public String getDisplayName() { + return "Convert JMockit `@Mocked` and `@Injectable` annotated arguments"; + } + + @Override + public String getDescription() { + return "Convert JMockit `@Mocked` and `@Injectable` annotated arguments into Mockito statements."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check( + Preconditions.or( + new UsesType<>("mockit.Mocked", false), + new UsesType<>("mockit.Injectable", false) + ), + new JavaIsoVisitor() { + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDeclaration, ExecutionContext ctx) { + J.MethodDeclaration md = super.visitMethodDeclaration(methodDeclaration, ctx); + + List parameters = md.getParameters(); + if (!parameters.isEmpty() && !(parameters.get(0) instanceof J.Empty)) { + maybeRemoveImport("mockit.Injectable"); + maybeRemoveImport("mockit.Mocked"); + maybeAddImport("org.mockito.Mockito"); + + // Create lists to store the mocked parameters and the new type parameters + List mockedParameter = new ArrayList<>(); + + // Remove any mocked parameters from the method declaration + md = md.withParameters(ListUtils.map(parameters, parameter -> { + if (parameter instanceof J.VariableDeclarations) { + J.VariableDeclarations variableDeclarations = (J.VariableDeclarations) parameter; + // Check if the parameter has the annotation "mockit.Mocked or mockit.Injectable" + if (!FindAnnotations.find(variableDeclarations, "mockit.Injectable").isEmpty() || + !FindAnnotations.find(variableDeclarations, "mockit.Mocked").isEmpty() ) { + mockedParameter.add(variableDeclarations); + return null; + } + } + return parameter; + })); + + // Add mocked parameters as statements to the method declaration + if (!mockedParameter.isEmpty()) { + JavaTemplate addStatementsTemplate = JavaTemplate.builder("#{} #{} = Mockito.mock(#{}.class);\n") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-core-3.12")) + .imports("org.mockito.Mockito") + .contextSensitive() + .build(); + // Retain argument order by iterating in reverse + for (int i = mockedParameter.size() - 1; i >= 0; i--) { + J.VariableDeclarations variableDeclarations = mockedParameter.get(i); + // Apply the template and update the method declaration + md = addStatementsTemplate.apply(updateCursor(md), + md.getBody().getCoordinates().firstStatement(), + variableDeclarations.getTypeExpression().toString(), + variableDeclarations.getVariables().get(0).getSimpleName(), + variableDeclarations.getTypeExpression().toString()); + } + } + } + return md; + } + } + ); + } +} diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockito.java deleted file mode 100644 index 80e7ce019..000000000 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockito.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * https://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.jmockit; - -import lombok.EqualsAndHashCode; -import lombok.Value; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.NonNullApi; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; -import org.openrewrite.java.search.FindAnnotations; -import org.openrewrite.java.search.UsesType; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.Statement; - -import java.util.ArrayList; -import java.util.List; - -@Value -@EqualsAndHashCode(callSuper = false) -@NonNullApi -public class JMockitMockedVariableToMockito extends Recipe { - @Override - public String getDisplayName() { - return "Rewrite JMockit Mocked Variable"; - } - - @Override - public String getDescription() { - return "Rewrites JMockit `Mocked Variable` to Mockito statements."; - } - - @Override - public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("mockit.Mocked", false), - new RewriteMockedVariableVisitor()); - } - - private static class RewriteMockedVariableVisitor extends JavaIsoVisitor { - @Override - public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDeclaration, ExecutionContext ctx) { - J.MethodDeclaration md = super.visitMethodDeclaration(methodDeclaration, ctx); - - List parameters = md.getParameters(); - if (!parameters.isEmpty() && !(parameters.get(0) instanceof J.Empty)) { - maybeRemoveImport("mockit.Mocked"); - maybeAddImport("org.mockito.Mockito"); - - // Create lists to store the mocked parameters and the new type parameters - List mockedParameter = new ArrayList<>(); - - // Remove any mocked parameters from the method declaration - md = md.withParameters(ListUtils.map(parameters, parameter -> { - if (parameter instanceof J.VariableDeclarations) { - J.VariableDeclarations variableDeclarations = (J.VariableDeclarations) parameter; - // Check if the parameter has the annotation "mockit.Mocked" - if (!FindAnnotations.find(variableDeclarations, "mockit.Mocked").isEmpty()) { - mockedParameter.add(variableDeclarations); - return null; - } - } - return parameter; - })); - - // Add mocked parameters as statements to the method declaration - if (!mockedParameter.isEmpty()) { - JavaTemplate addStatementsTemplate = JavaTemplate.builder("#{} #{} = Mockito.mock(#{}.class);\n") - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-core-3.12")) - .imports("org.mockito.Mockito") - .contextSensitive() - .build(); - // Retain argument order by iterating in reverse - for (int i = mockedParameter.size() - 1; i >= 0; i--) { - J.VariableDeclarations variableDeclarations = mockedParameter.get(i); - // Apply the template and update the method declaration - md = addStatementsTemplate.apply(updateCursor(md), - md.getBody().getCoordinates().firstStatement(), - variableDeclarations.getTypeExpression().toString(), - variableDeclarations.getVariables().get(0).getSimpleName(), - variableDeclarations.getTypeExpression().toString()); - } - } - } - - return md; - } - } -} diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java b/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java new file mode 100644 index 000000000..85365fe33 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2021 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@NonNullApi +package org.openrewrite.java.testing.jmockit; + +import org.openrewrite.internal.lang.NonNullApi; diff --git a/src/main/resources/META-INF/rewrite/jmockit.yml b/src/main/resources/META-INF/rewrite/jmockit.yml index dd7d1367a..1b4651ae2 100644 --- a/src/main/resources/META-INF/rewrite/jmockit.yml +++ b/src/main/resources/META-INF/rewrite/jmockit.yml @@ -23,7 +23,7 @@ tags: - jmockit recipeList: - org.openrewrite.java.testing.jmockit.JMockitExpectationsToMockito - - org.openrewrite.java.testing.jmockit.JMockitMockedVariableToMockito + - org.openrewrite.java.testing.jmockit.JMockitAnnotatedArgumentToMockito - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: mockit.Mocked newFullyQualifiedTypeName: org.mockito.Mock diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java similarity index 59% rename from src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockitoTest.java rename to src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java index 89293f3ef..aba68599f 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockedVariableToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java @@ -24,7 +24,7 @@ import static org.openrewrite.java.Assertions.java; -class JMockitMockedVariableToMockitoTest implements RewriteTest { +class JMockitAnnotatedArgumentToMockitoTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec @@ -32,9 +32,7 @@ public void defaults(RecipeSpec spec) { .logCompilationWarningsAndErrors(true) .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9", - "jmockit-1.49", - "mockito-core-3.12", - "mockito-junit-jupiter-3.12" + "jmockit-1.49" )) .recipeFromResource( "/META-INF/rewrite/jmockit.yml", @@ -52,7 +50,7 @@ void mockedVariableTest() { import mockit.Mocked; import static org.junit.jupiter.api.Assertions.assertNotNull; - + class A { @Mocked Object mockedObject; @@ -68,7 +66,7 @@ void test(@Mocked Object o, @Mocked Object o2) { import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertNotNull; - + class A { @Mock Object mockedObject; @@ -86,7 +84,7 @@ void test() { } @Test - void noVariableTest() { + void mockedNoVariableTest() { rewriteRun( //language=java java( @@ -94,7 +92,7 @@ void noVariableTest() { import mockit.Mocked; import static org.junit.jupiter.api.Assertions.assertNotNull; - + class A { @Mocked Object mockedObject; @@ -108,7 +106,86 @@ void test() { import org.mockito.Mock; import static org.junit.jupiter.api.Assertions.assertNotNull; - + + class A { + @Mock + Object mockedObject; + + void test() { + assertNotNull(mockedObject); + } + } + """ + ) + ); + } + + @Test + void injectableVariableTest() { + //language=java + rewriteRun( + java( + """ + import mockit.Injectable; + + import static org.junit.jupiter.api.Assertions.assertNotNull; + + class A { + @Injectable + Object mockedObject; + + void test(@Injectable Object o, @Injectable Object o2) { + assertNotNull(o); + assertNotNull(o2); + } + } + """, + """ + import org.mockito.Mock; + import org.mockito.Mockito; + + import static org.junit.jupiter.api.Assertions.assertNotNull; + + class A { + @Mock + Object mockedObject; + + void test() { + Object o = Mockito.mock(Object.class); + Object o2 = Mockito.mock(Object.class); + assertNotNull(o); + assertNotNull(o2); + } + } + """ + ) + ); + } + + @Test + void injectableNoVariableTest() { + rewriteRun( + //language=java + java( + """ + import mockit.Injectable; + + import static org.junit.jupiter.api.Assertions.assertNotNull; + + class A { + @Injectable + Object mockedObject; + + void test() { + assertNotNull(mockedObject); + } + } + """, + """ + import org.mockito.Mock; + + import static org.junit.jupiter.api.Assertions.assertNotNull; + class A { @Mock Object mockedObject; From 9eabd197a0efeb261370aad45418329f6dcfd75c Mon Sep 17 00:00:00 2001 From: Amitoj Duggal Date: Sun, 23 Jun 2024 15:05:01 +0200 Subject: [PATCH 007/118] Add Kotlin support for JUnit recipes: UpdateBeforeAfterAnnotations (#533) * Adding Kotlin support to the recipes, fixing the recipes to work use preVisit instead of visitCompilationUnit. * Do a single recipe run per unit test * Stop after pre visit, since we're only updating imports * Adding Kotlin support for the UpdateBeforeAfterAnnotations, along with new tests for kotlin * Added kotlin tests for AddParameterizedTestAnnotation * Add Picnic AssertJ rules to AssertJ best practices (#527) * Add Picnic AssertJ rules to AssertJ best practices * Include Picnic's JUnitToAssertJRulesRecipes in migration * Exclude `jakarta.xml.bind-api` from TimeFold * Move the exclude to rewrite-third-party * refactor: Only publish build scans if authenticated Use this link to re-run the recipe: https://app.moderne.io/recipes/builder/kLJjXlflM?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne * Drop Java 17 requirement through rewrite-third-party (#531) * Jmockit Expectations with no times or result should be transformed to Mockito verify statement (#530) * Ensure Jmockit expectations with no times or result transform to a mockito verify * Minor polish to text blocks * Make times, minTimes, maxTimes more flexible as it was originally so even if someone mistakenly puts times and minTimes together, it still migrates without issue --------- Co-authored-by: Tim te Beek * Rewrite both JMockit `@Mocked` and `@Injectable` annotated arguments (#532) * Ensure Jmockit expectations with no times or result transform to a mockito verify * Minor polish to text blocks * Make times, minTimes, maxTimes more flexible as it was originally so even if someone mistakenly puts times and minTimes together, it still migrates without issue * Add feature to enable migration of Jmockit Injectable annotation exactly as we are doing the Mocked annotation ie method parameter annotation as well as field annotation. Have moved all of the code from JMockitMockedVariableToMockito to JMockitAnnotationToMockito for code reuse. Also add the corresponding test cases and jmockit.yml file modification. * Use `@Option` instead of inheritance * Drop Option and just replace both variants * Update display name and description to match application --------- Co-authored-by: Tim te Beek * Adding Kotlin support for the UpdateBeforeAfterAnnotations, along with new tests for kotlin * Added kotlin tests for AddParameterizedTestAnnotation * Restoring changes to issue to retain the references * Remove trailing whitespace in text blocks * Update src/test/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotationsTest.java Co-authored-by: Tim te Beek * Removing tests for kotlin and keep one in the Documentation example. We can tackle the issues and add tests separately if we see bug in workflows. * Removing extra tests for Kotlin, and keeping one, fixing issue with failing build. * Restored changes to the disabled test. * Minor touch up --------- Co-authored-by: Amitoj Duggal Co-authored-by: Tim te Beek Co-authored-by: Tim te Beek Co-authored-by: Moderne Co-authored-by: Shivani Sharma --- .../junit5/UpdateBeforeAfterAnnotations.java | 8 ++-- .../AddParameterizedTestAnnotationTest.java | 37 ++++++++++++++++++- .../UpdateBeforeAfterAnnotationsTest.java | 37 ++++++++++++++++--- 3 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotations.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotations.java index 832634e32..1809e14ab 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotations.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotations.java @@ -49,15 +49,13 @@ public TreeVisitor getVisitor() { public static class UpdateBeforeAfterAnnotationsVisitor extends JavaIsoVisitor { @Override - public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionContext ctx) { - //This visitor handles changing the method visibility for any method annotated with one of the four before/after - //annotations. It registers visitors that will sweep behind it making the type changes. + public J preVisit(J tree, ExecutionContext ctx) { + stopAfterPreVisit(); doAfterVisit(new ChangeType("org.junit.Before", "org.junit.jupiter.api.BeforeEach", true).getVisitor()); doAfterVisit(new ChangeType("org.junit.After", "org.junit.jupiter.api.AfterEach", true).getVisitor()); doAfterVisit(new ChangeType("org.junit.BeforeClass", "org.junit.jupiter.api.BeforeAll", true).getVisitor()); doAfterVisit(new ChangeType("org.junit.AfterClass", "org.junit.jupiter.api.AfterAll", true).getVisitor()); - - return super.visitCompilationUnit(cu, ctx); + return tree; } } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AddParameterizedTestAnnotationTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AddParameterizedTestAnnotationTest.java index 5b2e87923..5103fea4d 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/AddParameterizedTestAnnotationTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/AddParameterizedTestAnnotationTest.java @@ -20,10 +20,12 @@ import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; +import org.openrewrite.kotlin.KotlinParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.kotlin.Assertions.kotlin; class AddParameterizedTestAnnotationTest implements RewriteTest { @Override @@ -31,6 +33,8 @@ public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9", "junit-jupiter-params-5.9")) + .parser(KotlinParser.builder() + .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9", "junit-jupiter-params-5.9")) .recipe(new AddParameterizedTestAnnotation()); } @@ -45,7 +49,7 @@ void replaceTestWithParameterizedTest() { import org.junit.jupiter.api.Test; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; - + class NumbersTest { @Test @ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE}) @@ -58,7 +62,7 @@ void testIsOdd(int number) { import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; - + class NumbersTest { @ParameterizedTest @ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE}) @@ -67,6 +71,35 @@ void testIsOdd(int number) { } } """ + ), + //language=kotlin + kotlin( + """ + import org.junit.jupiter.api.Test + import org.junit.jupiter.params.provider.ValueSource + import org.junit.jupiter.api.Assertions.assertTrue + + class NumbersTest { + @Test + @ValueSource(ints = [1, 3, 5, -3, 15, Int.MAX_VALUE]) + fun testIsOdd(number: Int) { + assertTrue(number % 2 != 0) + } + } + """, + """ + import org.junit.jupiter.params.ParameterizedTest + import org.junit.jupiter.params.provider.ValueSource + import org.junit.jupiter.api.Assertions.assertTrue + + class NumbersTest { + @ParameterizedTest + @ValueSource(ints = [1, 3, 5, -3, 15, Int.MAX_VALUE]) + fun testIsOdd(number: Int) { + assertTrue(number % 2 != 0) + } + } + """ ) ); } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotationsTest.java b/src/test/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotationsTest.java index 47d723d7a..2c71b6107 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotationsTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/UpdateBeforeAfterAnnotationsTest.java @@ -21,10 +21,12 @@ import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; +import org.openrewrite.kotlin.KotlinParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.kotlin.Assertions.kotlin; @SuppressWarnings("JUnitMalformedDeclaration") class UpdateBeforeAfterAnnotationsTest implements RewriteTest { @@ -34,6 +36,8 @@ public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13")) + .parser(KotlinParser.builder() + .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13")) .recipe(new UpdateBeforeAfterAnnotations()); } @@ -45,9 +49,8 @@ void beforeToBeforeEach() { java( """ import org.junit.Before; - + class Test { - @Before void before() { } @@ -55,14 +58,36 @@ void before() { """, """ import org.junit.jupiter.api.BeforeEach; - + class Test { - @BeforeEach void before() { } } """ + ), + //language=kotlin + kotlin( + """ + import org.junit.Before + + class Test { + + @Before + fun before() { + } + } + """, + """ + import org.junit.jupiter.api.BeforeEach + + class Test { + + @BeforeEach + fun before() { + } + } + """ ) ); } @@ -185,8 +210,8 @@ void before() { } @Test - @Disabled("Issue #59") - void beforeMethodOverridesPublicAbstract() { + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/59") + void retainPublicModifierOnOverriddenMethod() { //language=java rewriteRun( From 68194d3f2675edfd0c63a22e99b165525956483f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 26 Jun 2024 10:37:26 +0200 Subject: [PATCH 008/118] Convert Hamcrest collection matchers from static imports to AssertJ Fixes https://github.com/openrewrite/rewrite-testing-frameworks/issues/538 --- .../resources/META-INF/rewrite/hamcrest.yml | 3 ++ .../MigrateHamcrestToAssertJTest.java | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/hamcrest.yml b/src/main/resources/META-INF/rewrite/hamcrest.yml index 7439f28ce..1bcb7a12e 100644 --- a/src/main/resources/META-INF/rewrite/hamcrest.yml +++ b/src/main/resources/META-INF/rewrite/hamcrest.yml @@ -43,6 +43,9 @@ recipeList: - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: org.hamcrest.core.* *(..) fullyQualifiedTargetTypeName: org.hamcrest.Matchers + - org.openrewrite.java.ChangeMethodTargetToStatic: + methodPattern: org.hamcrest.collection.* *(..) + fullyQualifiedTargetTypeName: org.hamcrest.Matchers # Then remove wrapping `is(Matcher)` calls such that further recipes will match - org.openrewrite.java.testing.hamcrest.RemoveIsMatcher diff --git a/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java b/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java index 64ad82036..5b44a19c1 100644 --- a/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java +++ b/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java @@ -760,4 +760,37 @@ void ba() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/538") + void collectionMatchers() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + import static org.hamcrest.collection.IsCollectionWithSize.hasSize; + import static org.hamcrest.MatcherAssert.assertThat; + + class Foo { + void bar(List list) { + assertThat(list, hasSize(12)); + } + } + """, + """ + import java.util.List; + + import static org.assertj.core.api.Assertions.assertThat; + + class Foo { + void bar(List list) { + assertThat(list).hasSize(12); + } + } + """ + ) + ); + } } From fd0eb2d69a26a1d32b10b769644d9ae609937ae1 Mon Sep 17 00:00:00 2001 From: gideon-sunbit Date: Wed, 26 Jun 2024 11:41:10 +0300 Subject: [PATCH 009/118] Add a NoMissingTypes Precondition to CleanupMockitoImports (#539) * Add a NoMissingTypes Precondition to CleanupMockitoImports to prevent changes if types are missing * Specifically handle Mockito Kotlin imports --------- Co-authored-by: Tim te Beek --- build.gradle.kts | 1 + .../mockito/CleanupMockitoImports.java | 18 ++++-- .../mockito/CleanupMockitoImportsTest.java | 56 ++++++++++++++----- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4f3662b82..42276ebba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -55,6 +55,7 @@ dependencies { testRuntimeOnly("net.datafaker:datafaker:latest.release") { exclude(group = "org.yaml", module = "snakeyaml") } + testRuntimeOnly("org.mockito.kotlin:mockito-kotlin:latest.release") testRuntimeOnly("org.testcontainers:testcontainers:latest.release") testRuntimeOnly("org.testcontainers:nginx:latest.release") diff --git a/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java b/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java index 8f9fcae2e..b8e63c553 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java @@ -47,7 +47,9 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.mockito.*", false), new CleanupMockitoImportsVisitor()); + return Preconditions.check( + new UsesType<>("org.mockito.*", false), + new CleanupMockitoImportsVisitor()); } private static class CleanupMockitoImportsVisitor extends JavaIsoVisitor { @@ -104,12 +106,18 @@ private static class CleanupMockitoImportsVisitor extends JavaIsoVisitor qualifiedMethods) { J.MethodInvocation mi = super.visitMethodInvocation(method, qualifiedMethods); if (MOCKITO_METHOD_NAMES.contains(mi.getSimpleName()) - && mi.getSelect() != null - && TypeUtils.isAssignableTo("org.mockito.Mockito", mi.getSelect().getType())) { + && mi.getSelect() != null + && TypeUtils.isAssignableTo("org.mockito.Mockito", mi.getSelect().getType())) { qualifiedMethods.add(mi.getSimpleName()); } return mi; diff --git a/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java b/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java index 94ad05d85..cf36f76cb 100755 --- a/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java @@ -19,10 +19,13 @@ import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.java.JavaParser; +import org.openrewrite.kotlin.KotlinParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.TypeValidation; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.kotlin.Assertions.kotlin; class CleanupMockitoImportsTest implements RewriteTest { @@ -31,6 +34,7 @@ public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() .classpathFromResources(new InMemoryExecutionContext(), "mockito-all-1.10")) + .parser(KotlinParser.builder().classpath("mockito-core", "mockito-kotlin")) .recipe(new CleanupMockitoImports()); } @@ -43,12 +47,12 @@ void removesUnusedMockitoImport() { """ import org.mockito.Mock; import java.util.Arrays; - + public class MyTest {} """, """ import java.util.Arrays; - + public class MyTest {} """ ) @@ -65,7 +69,7 @@ void leavesOtherImportsAlone() { import java.util.Collections; import java.util.HashSet; import java.util.List; - + public class MyTest {} """ ) @@ -85,7 +89,7 @@ void doNotRemoveImportsPossiblyAssociatedWithAnUntypedMockitoMethod() { class MyObjectTest { MyObject myObject; MyMockClass myMock; - + void test() { when(myObject.getSomeField()).thenReturn("testValue"); given(myObject.getSomeField()).willReturn("testValue"); @@ -116,7 +120,7 @@ void doNotRemoveImportsAssociatedWithAnUntypedMockitoMethodMixed() { class MyObjectTest { MyObject myObject; MyMockClass myMock; - + void test() { when(myObject.getSomeField()).thenReturn("testValue"); given(myObject.getSomeField()).willReturn("testValue"); @@ -148,7 +152,7 @@ void doNotRemoveImportsAssociatedWithATypedMockitoMethodMixed() { class MyObjectTest { MyObject myObject; MyMockClass myMock; - + void test() { when(myObject.getSomeField()).thenReturn("testValue"); given(myObject.getSomeField()).willReturn("testValue"); @@ -178,7 +182,7 @@ void doNotRemoveStartImportsPossiblyAssociatedWithAnUntypedMockitoMethod() { class MyObjectTest { MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn("testValue"); } @@ -212,7 +216,7 @@ class MyObject { class MyObjectTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn("testValue"); } @@ -226,7 +230,7 @@ void test() { class MyObjectTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn("testValue"); } @@ -243,16 +247,16 @@ void preserveStarImports() { java( """ package mockito.example; - + import java.util.List; - + import static org.mockito.Mockito.*; - + public class MockitoArgumentMatchersTest { static class Foo { boolean bool(String str, int i, Object obj) { return false; } } - + public void usesMatchers() { Foo mockFoo = mock(Foo.class); when(mockFoo.bool(anyString(), anyInt(), any(Object.class))).thenReturn(true); @@ -270,7 +274,7 @@ void removeUnusedStarImports() { java( """ import static org.mockito.Mockito.*; - + public class MockitoArgumentMatchersTest { } """, @@ -281,4 +285,28 @@ public class MockitoArgumentMatchersTest { ) ); } + + @Test + void handleKotlinImportsCorrectly() { + rewriteRun( + //language=kotlin + kotlin( + """ + import org.mockito.kotlin.times + class Foo { + fun bar() { + org.mockito.Mockito.mock(Foo::class.java) + } + } + """, + """ + class Foo { + fun bar() { + org.mockito.Mockito.mock(Foo::class.java) + } + } + """ + ) + ); + } } From 2096894f126ced6fb61c472ed21a9b0933c1132d Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Wed, 3 Jul 2024 15:30:18 +1000 Subject: [PATCH 010/118] Migrate JMockit Verifications to Mockito (#540) * First draft of adding feature to migration JMockit Verifications to Mockito verify statements. Tests are failing, need to fix and also add tests once they pass. * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Add more test cases, fix existing test cases, refactor method name. Some test still failing. * Refactor everything to be simpler to understand, also remove empty new line between migrated mockit when statements as mockito statements are more compact than Expectations * Add support for multiple statements in Verifications to be migrated by replacing the Verification block * Add test case with blank lines in Verification block to be erased * Remove trailing whitespaces in text blocks * Refactor * Refactor method and variable names. One test case failing when we use an external class to mock an object * Try to debug issue where seeing very strange behaviour in code, where when we change the expected output to the actual generated output by including the static import, we get error that the type is missing or malformed. This looks like a bug in the framework. It seems to only occur when we add a second class in the before. * Skip type validation after template `verify(#{any()}).#{}(#{any()})` * Add missing nullable annotations; add Lombok annotations * Apply suggestions from code review --------- Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../jmockit/ArgumentMatchersRewriter.java | 3 +- ...ewriter.java => JMockitBlockRewriter.java} | 289 ++++--- ...ockito.java => JMockitBlockToMockito.java} | 40 +- .../testing/jmockit/JMockitBlockType.java | 29 + .../java/testing/jmockit/JMockitUtils.java | 26 +- .../jmockit/SetupStatementsRewriter.java | 4 +- .../resources/META-INF/rewrite/jmockit.yml | 2 +- .../JMockitExpectationsToMockitoTest.java | 322 +++++--- .../JMockitVerificationsToMockitoTest.java | 740 ++++++++++++++++++ 9 files changed, 1175 insertions(+), 280 deletions(-) rename src/main/java/org/openrewrite/java/testing/jmockit/{ExpectationsBlockRewriter.java => JMockitBlockRewriter.java} (58%) rename src/main/java/org/openrewrite/java/testing/jmockit/{JMockitExpectationsToMockito.java => JMockitBlockToMockito.java} (62%) create mode 100644 src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java index 7d5efe007..8b24ee034 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java @@ -60,6 +60,7 @@ class ArgumentMatchersRewriter { } private static final Map PRIMITIVE_TO_MOCKITO_ARGUMENT_MATCHER = new HashMap<>(); + static { PRIMITIVE_TO_MOCKITO_ARGUMENT_MATCHER.put(JavaType.Primitive.Int, "anyInt"); PRIMITIVE_TO_MOCKITO_ARGUMENT_MATCHER.put(JavaType.Primitive.Long, "anyLong"); @@ -81,7 +82,7 @@ class ArgumentMatchersRewriter { this.expectationsBlock = expectationsBlock; } - J.Block rewriteExpectationsBlock() { + J.Block rewriteJMockitBlock() { List newStatements = new ArrayList<>(expectationsBlock.getStatements().size()); for (Statement expectationStatement : expectationsBlock.getStatements()) { // for each statement, check if it's a method invocation and replace any argument matchers diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java similarity index 58% rename from src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java rename to src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java index ae2dce1ee..147bcdd50 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/ExpectationsBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java @@ -15,6 +15,9 @@ */ package org.openrewrite.java.testing.jmockit; +import lombok.AccessLevel; +import lombok.Data; +import lombok.Setter; import org.openrewrite.Cursor; import org.openrewrite.ExecutionContext; import org.openrewrite.internal.lang.Nullable; @@ -26,13 +29,16 @@ import java.util.ArrayList; import java.util.List; -class ExpectationsBlockRewriter { +import static org.openrewrite.java.testing.jmockit.JMockitBlockType.Verifications; + +class JMockitBlockRewriter { private static final String WHEN_TEMPLATE_PREFIX = "when(#{any()})."; private static final String RETURN_TEMPLATE_PREFIX = "thenReturn("; private static final String THROW_TEMPLATE_PREFIX = "thenThrow("; private static final String LITERAL_TEMPLATE_FIELD = "#{}"; private static final String ANY_TEMPLATE_FIELD = "#{any()}"; + private static final String MOCKITO_IMPORT_FQN_PREFX = "org.mockito.Mockito"; private static String getObjectTemplateField(String fqn) { return "#{any(" + fqn + ")}"; @@ -41,167 +47,145 @@ private static String getObjectTemplateField(String fqn) { private final JavaVisitor visitor; private final ExecutionContext ctx; private final J.NewClass newExpectations; + private final JMockitBlockType blockType; // index of the Expectations block in the method body private final int bodyStatementIndex; private J.Block methodBody; private JavaCoordinates nextStatementCoordinates; - private boolean expectationsRewriteFailed = false; + private boolean rewriteFailed = false; - boolean isExpectationsRewriteFailed() { - return expectationsRewriteFailed; + boolean isRewriteFailed() { + return rewriteFailed; } // keep track of the additional statements being added to the method body, which impacts the statement indices // used with bodyStatementIndex to obtain the coordinates of the next statement to be written private int numStatementsAdded = 0; - ExpectationsBlockRewriter(JavaVisitor visitor, ExecutionContext ctx, J.Block methodBody, - J.NewClass newExpectations, int bodyStatementIndex) { + JMockitBlockRewriter(JavaVisitor visitor, ExecutionContext ctx, J.Block methodBody, + J.NewClass newExpectations, int bodyStatementIndex, JMockitBlockType blockType) { this.visitor = visitor; this.ctx = ctx; this.methodBody = methodBody; this.newExpectations = newExpectations; this.bodyStatementIndex = bodyStatementIndex; + this.blockType = blockType; nextStatementCoordinates = newExpectations.getCoordinates().replace(); } J.Block rewriteMethodBody() { - visitor.maybeRemoveImport("mockit.Expectations"); + visitor.maybeRemoveImport(blockType.getFqn()); // eg mockit.Expectations assert newExpectations.getBody() != null; - J.Block expectationsBlock = (J.Block) newExpectations.getBody().getStatements().get(0); - if (expectationsBlock.getStatements().isEmpty()) { + J.Block jmockitBlock = (J.Block) newExpectations.getBody().getStatements().get(0); + if (jmockitBlock.getStatements().isEmpty()) { // empty Expectations block, remove it - removeExpectationsStatement(); + removeBlock(); return methodBody; } // rewrite the argument matchers in the expectations block - ArgumentMatchersRewriter amr = new ArgumentMatchersRewriter(visitor, ctx, expectationsBlock); - expectationsBlock = amr.rewriteExpectationsBlock(); - - // iterate over the expectations statements and rebuild the method body - List expectationStatements = new ArrayList<>(); - for (Statement expectationStatement : expectationsBlock.getStatements()) { - if (expectationStatement instanceof J.MethodInvocation) { - // handle returns statements - J.MethodInvocation invocation = (J.MethodInvocation) expectationStatement; - if (invocation.getSelect() == null && invocation.getName().getSimpleName().equals("returns")) { - expectationStatements.add(expectationStatement); - continue; + ArgumentMatchersRewriter amr = new ArgumentMatchersRewriter(visitor, ctx, jmockitBlock); + jmockitBlock = amr.rewriteJMockitBlock(); + + // iterate over the statements and build a list of grouped method invocations and related statements eg times + List> methodInvocationsToRewrite = new ArrayList<>(); + int methodInvocationIdx = -1; + for (Statement jmockitBlockStatement : jmockitBlock.getStatements()) { + if (jmockitBlockStatement instanceof J.MethodInvocation) { + // ensure it's not a returns statement, we add that later to related statements + J.MethodInvocation invocation = (J.MethodInvocation) jmockitBlockStatement; + if (invocation.getSelect() != null && !invocation.getName().getSimpleName().equals("returns")) { + methodInvocationIdx++; + methodInvocationsToRewrite.add(new ArrayList<>()); } - // if a new method invocation is found, apply the template to the previous statements - if (!expectationStatements.isEmpty()) { - // apply template to build new method body - rewriteMethodBody(expectationStatements); + } - // reset statements for next expectation - expectationStatements = new ArrayList<>(); - } + if (methodInvocationIdx != -1) { + methodInvocationsToRewrite.get(methodInvocationIdx).add(jmockitBlockStatement); } - expectationStatements.add(expectationStatement); } - // handle the last statement - if (!expectationStatements.isEmpty()) { - rewriteMethodBody(expectationStatements); + // remove the jmockit block + if (nextStatementCoordinates.isReplacement()) { + removeBlock(); } + // now rewrite + methodInvocationsToRewrite.forEach(this::rewriteMethodInvocation); return methodBody; } - private void rewriteMethodBody(List expectationStatements) { - final MockInvocationResults mockInvocationResults = buildMockInvocationResults(expectationStatements); - if (mockInvocationResults == null || !(expectationStatements.get(0) instanceof J.MethodInvocation)) { - // invalid Expectations block, cannot rewrite - expectationsRewriteFailed = true; + private void rewriteMethodInvocation(List statementsToRewrite) { + final MockInvocationResults mockInvocationResults = buildMockInvocationResults(statementsToRewrite); + if (mockInvocationResults == null) { + // invalid block, cannot rewrite + rewriteFailed = true; return; } - J.MethodInvocation invocation = (J.MethodInvocation) expectationStatements.get(0); - boolean hasExpectationsResults = !mockInvocationResults.getResults().isEmpty(); - if (hasExpectationsResults) { - // rewrite the statement to mockito if there are results - rewriteExpectationResult(mockInvocationResults.getResults(), invocation); - } else if (nextStatementCoordinates.isReplacement()) { - // if there are no results and the Expectations block is not yet replaced, remove it - removeExpectationsStatement(); + + J.MethodInvocation invocation = (J.MethodInvocation) statementsToRewrite.get(0); + boolean hasResults = !mockInvocationResults.getResults().isEmpty(); + if (hasResults) { + rewriteResult(invocation, mockInvocationResults.getResults()); } boolean hasTimes = false; if (mockInvocationResults.getTimes() != null) { hasTimes = true; - writeMethodVerification(invocation, mockInvocationResults.getTimes(), "times"); + rewriteVerify(invocation, mockInvocationResults.getTimes(), "times"); } if (mockInvocationResults.getMinTimes() != null) { hasTimes = true; - writeMethodVerification(invocation, mockInvocationResults.getMinTimes(), "atLeast"); + rewriteVerify(invocation, mockInvocationResults.getMinTimes(), "atLeast"); } if (mockInvocationResults.getMaxTimes() != null) { hasTimes = true; - writeMethodVerification(invocation, mockInvocationResults.getMaxTimes(), "atMost"); + rewriteVerify(invocation, mockInvocationResults.getMaxTimes(), "atMost"); } - if (!hasExpectationsResults && !hasTimes) { - writeMethodVerification(invocation, null, null); + if (!hasResults && !hasTimes) { + rewriteVerify(invocation, null, null); + } + } + + private void removeBlock() { + methodBody = JavaTemplate.builder("") + .javaParser(JavaParser.fromJavaVersion()) + .build() + .apply( + new Cursor(visitor.getCursor(), methodBody), + nextStatementCoordinates + ); + if (bodyStatementIndex == 0) { + nextStatementCoordinates = methodBody.getCoordinates().firstStatement(); + } else { + setNextCoordinatesAfterLastStatementAdded(0); } } - private void rewriteExpectationResult(List results, J.MethodInvocation invocation) { - String template = getMockitoStatementTemplate(results); + private void rewriteResult(J.MethodInvocation invocation, List results) { + String template = getWhenTemplate(results); if (template == null) { // invalid template, cannot rewrite - expectationsRewriteFailed = true; + rewriteFailed = true; return; } - visitor.maybeAddImport("org.mockito.Mockito", "when"); + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "when"); List templateParams = new ArrayList<>(); templateParams.add(invocation); templateParams.addAll(results); - methodBody = JavaTemplate.builder(template) - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-core-3.12")) - .staticImports("org.mockito.Mockito.*") - .build() - .apply( - new Cursor(visitor.getCursor(), methodBody), - nextStatementCoordinates, - templateParams.toArray() - ); - if (!nextStatementCoordinates.isReplacement()) { - numStatementsAdded += 1; - } - - // the next statement coordinates are directly after the most recently written statement - nextStatementCoordinates = methodBody.getStatements().get(bodyStatementIndex + numStatementsAdded) - .getCoordinates().after(); + methodBody = rewriteTemplate(template, templateParams, nextStatementCoordinates); + setNextCoordinatesAfterLastStatementAdded(++numStatementsAdded); } - private void removeExpectationsStatement() { - methodBody = JavaTemplate.builder("") - .javaParser(JavaParser.fromJavaVersion()) - .build() - .apply( - new Cursor(visitor.getCursor(), methodBody), - nextStatementCoordinates - ); - - // the next statement coordinates are directly after the most recently added statement, or the first statement - // of the test method body if the Expectations block was the first statement - nextStatementCoordinates = bodyStatementIndex == 0 ? methodBody.getCoordinates().firstStatement() : - methodBody.getStatements().get(bodyStatementIndex + numStatementsAdded).getCoordinates().after(); - } - - private void writeMethodVerification(J.MethodInvocation invocation, @Nullable Expression times, @Nullable String verificationMode) { - String fqn = getInvocationSelectFullyQualifiedClassName(invocation); - if (fqn == null) { + private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression times, @Nullable String verificationMode) { + if (invocation.getSelect() == null) { // cannot write a verification statement for an invocation without a select field return; } - visitor.maybeAddImport("org.mockito.Mockito", "verify"); - if (verificationMode != null) { - visitor.maybeAddImport("org.mockito.Mockito", verificationMode); - } List templateParams = new ArrayList<>(); templateParams.add(invocation.getSelect()); @@ -209,21 +193,56 @@ private void writeMethodVerification(J.MethodInvocation invocation, @Nullable Ex templateParams.add(times); } templateParams.add(invocation.getName().getSimpleName()); + String verifyTemplate = getVerifyTemplate(invocation.getArguments(), verificationMode, templateParams); - String verifyTemplate = getVerifyTemplate(invocation.getArguments(), fqn, verificationMode, templateParams); - methodBody = JavaTemplate.builder(verifyTemplate) + JavaCoordinates verifyCoordinates; + if (this.blockType == Verifications) { + // for Verifications, replace the Verifications block + verifyCoordinates = nextStatementCoordinates; + } else { + // for Expectations put the verify at the end of the method + verifyCoordinates = methodBody.getCoordinates().lastStatement(); + } + + methodBody = rewriteTemplate(verifyTemplate, templateParams, verifyCoordinates); + if (this.blockType == Verifications) { + setNextCoordinatesAfterLastStatementAdded(++numStatementsAdded); + } + + // do this last making sure rewrite worked and specify hasReference=false because in verify case it cannot find + // the static reference in AddImport class, and getSelect() returns not null + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "verify", false); + if (verificationMode != null) { + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, verificationMode); + } + } + + private void setNextCoordinatesAfterLastStatementAdded(int numStatementsAdded) { + // the next statement coordinates are directly after the most recently written statement, calculated by + // subtracting the removed jmockit block + int nextStatementIdx = bodyStatementIndex + numStatementsAdded - 1; + if (nextStatementIdx >= this.methodBody.getStatements().size()) { + rewriteFailed = true; + } else { + this.nextStatementCoordinates = this.methodBody.getStatements().get(nextStatementIdx).getCoordinates().after(); + } + } + + private J.Block rewriteTemplate(String verifyTemplate, List templateParams, JavaCoordinates + rewriteCoords) { + JavaTemplate.Builder builder = JavaTemplate.builder(verifyTemplate) .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-core-3.12")) - .staticImports("org.mockito.Mockito.*") - .imports(fqn) + .staticImports("org.mockito.Mockito.*"); + return builder .build() .apply( new Cursor(visitor.getCursor(), methodBody), - methodBody.getCoordinates().lastStatement(), + rewriteCoords, templateParams.toArray() ); } - private static String getMockitoStatementTemplate(List results) { + private static @Nullable String getWhenTemplate(List results) { boolean buildingResults = false; final StringBuilder templateBuilder = new StringBuilder(WHEN_TEMPLATE_PREFIX); for (Expression result : results) { @@ -265,26 +284,27 @@ private static void appendToTemplate(StringBuilder templateBuilder, boolean buil templateBuilder.append(templateField); } - private static String getVerifyTemplate(List arguments, String fqn, @Nullable String verificationMode, List templateParams) { - StringBuilder templateBuilder = new StringBuilder("verify(#{any(" + fqn + ")}"); // verify(object + private static String getVerifyTemplate(List arguments, @Nullable String + verificationMode, List templateParams) { + StringBuilder templateBuilder = new StringBuilder("verify(#{any()}"); // eg verify(object if (verificationMode != null) { - templateBuilder.append(", ").append(verificationMode).append("(#{any(int)})"); // verify(object, times(2) + templateBuilder.append(", ").append(verificationMode).append("(#{any(int)})"); // eg verify(object, times(2) } - templateBuilder.append(").#{}("); // verify(object, times(2)).method( + templateBuilder.append(").#{}("); // eg verify(object, times(2)).method( if (arguments.isEmpty()) { - templateBuilder.append(");"); // verify(object, times(2)).method(); + templateBuilder.append(");"); // eg verify(object, times(2)).method(); <- no args return templateBuilder.toString(); } boolean hasArgument = false; - for (Expression argument : arguments) { // verify(object, times(2).method(anyLong(), any Int() + for (Expression argument : arguments) { // eg verify(object, times(2).method(anyLong(), anyInt() if (argument instanceof J.Empty) { continue; } else if (argument instanceof J.Literal) { templateBuilder.append(((J.Literal) argument).getValueSource()); } else { - templateBuilder.append("#{any()}"); + templateBuilder.append(ANY_TEMPLATE_FIELD); templateParams.add(argument); } hasArgument = true; @@ -293,11 +313,11 @@ private static String getVerifyTemplate(List arguments, String fqn, if (hasArgument) { templateBuilder.delete(templateBuilder.length() - 2, templateBuilder.length()); } - templateBuilder.append(");"); // verify(object, times(2).method(anyLong(), any Int()); + templateBuilder.append(");"); // eg verify(object, times(2).method(anyLong(), anyInt()); return templateBuilder.toString(); } - private static MockInvocationResults buildMockInvocationResults(List expectationStatements) { + private static @Nullable MockInvocationResults buildMockInvocationResults(List expectationStatements) { final MockInvocationResults resultWrapper = new MockInvocationResults(); for (int i = 1; i < expectationStatements.size(); i++) { Statement expectationStatement = expectationStatements.get(i); @@ -333,20 +353,19 @@ private static MockInvocationResults buildMockInvocationResults(List return resultWrapper; } - private static String getVariableNameFromAssignment(J.Assignment assignment) { - String name = null; + private static @Nullable String getVariableNameFromAssignment(J.Assignment assignment) { if (assignment.getVariable() instanceof J.Identifier) { - name = ((J.Identifier) assignment.getVariable()).getSimpleName(); + return ((J.Identifier) assignment.getVariable()).getSimpleName(); } else if (assignment.getVariable() instanceof J.FieldAccess) { J.FieldAccess fieldAccess = (J.FieldAccess) assignment.getVariable(); if (fieldAccess.getTarget() instanceof J.Identifier) { - name = fieldAccess.getSimpleName(); + return fieldAccess.getSimpleName(); } } - return name; + return null; } - private static String getPrimitiveTemplateField(JavaType.Primitive primitiveType) { + private static @Nullable String getPrimitiveTemplateField(JavaType.Primitive primitiveType) { switch (primitiveType) { case Boolean: return "#{any(boolean)}"; @@ -373,54 +392,16 @@ private static String getPrimitiveTemplateField(JavaType.Primitive primitiveType } } - private static String getInvocationSelectFullyQualifiedClassName(J.MethodInvocation invocation) { - Expression select = invocation.getSelect(); - if (select == null || select.getType() == null) { - return null; - } - String fqn = null; - if (select.getType() instanceof JavaType.FullyQualified) { - fqn = ((JavaType.FullyQualified) select.getType()).getFullyQualifiedName(); - } - return fqn; - } - + @Data private static class MockInvocationResults { + @Setter(AccessLevel.NONE) private final List results = new ArrayList<>(); private Expression times; private Expression minTimes; private Expression maxTimes; - private List getResults() { - return results; - } - private void addResult(Expression result) { results.add(result); } - - private Expression getTimes() { - return times; - } - - private void setTimes(Expression times) { - this.times = times; - } - - private Expression getMinTimes() { - return minTimes; - } - - private void setMinTimes(Expression minTimes) { - this.minTimes = minTimes; - } - - private Expression getMaxTimes() { - return maxTimes; - } - - private void setMaxTimes(Expression maxTimes) { - this.maxTimes = maxTimes; - } } } diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java similarity index 62% rename from src/main/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockito.java rename to src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java index e841aa033..4283eedf5 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java @@ -27,27 +27,31 @@ import org.openrewrite.java.tree.Statement; import java.util.List; +import java.util.Optional; @Value @EqualsAndHashCode(callSuper = false) -public class JMockitExpectationsToMockito extends Recipe { +public class JMockitBlockToMockito extends Recipe { + @Override public String getDisplayName() { - return "Rewrite JMockit Expectations"; + return "Rewrite JMockit Expectations and Verifications"; } @Override public String getDescription() { - return "Rewrites JMockit `Expectations` blocks to Mockito statements."; + return "Rewrites JMockit `Expectations and Verifications` blocks to Mockito statements."; } @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("mockit.Expectations", false), - new RewriteExpectationsVisitor()); + return Preconditions.check(Preconditions.or( + new UsesType<>(JMockitBlockType.Expectations.getFqn(), false), + new UsesType<>(JMockitBlockType.Verifications.getFqn(), false) + ), new RewriteJMockitBlockVisitor()); } - private static class RewriteExpectationsVisitor extends JavaIsoVisitor { + private static class RewriteJMockitBlockVisitor extends JavaIsoVisitor { @Override public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDeclaration, ExecutionContext ctx) { @@ -63,17 +67,19 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl int bodyStatementIndex = 0; // iterate over each statement in the method body, find Expectations blocks and rewrite them while (bodyStatementIndex < statements.size()) { - if (!JMockitUtils.isValidExpectationsNewClassStatement(statements.get(bodyStatementIndex))) { - bodyStatementIndex += 1; - continue; - } - ExpectationsBlockRewriter ebr = new ExpectationsBlockRewriter(this, ctx, methodBody, - ((J.NewClass) statements.get(bodyStatementIndex)), bodyStatementIndex); - methodBody = ebr.rewriteMethodBody(); - statements = methodBody.getStatements(); - // if the expectations rewrite failed, skip the next statement - if (ebr.isExpectationsRewriteFailed()) { - bodyStatementIndex += 1; + Statement s = statements.get(bodyStatementIndex); + Optional blockType = JMockitUtils.getJMockitBlock(s); + if (blockType.isPresent()) { + JMockitBlockRewriter blockRewriter = new JMockitBlockRewriter(this, ctx, methodBody, + ((J.NewClass) s), bodyStatementIndex, blockType.get()); + methodBody = blockRewriter.rewriteMethodBody(); + statements = methodBody.getStatements(); + // if the expectations rewrite failed, skip the next statement + if (blockRewriter.isRewriteFailed()) { + bodyStatementIndex++; + } + } else { + bodyStatementIndex++; } } return md.withBody(methodBody); diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java new file mode 100644 index 000000000..e649448a0 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java @@ -0,0 +1,29 @@ +/* + * Copyright 2024 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +enum JMockitBlockType { + + Expectations("mockit.Expectations"), + Verifications("mockit.Verifications"); // Add NonStrictExpectations later + + private final String fqn; +} diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java index 79d21e91c..a11b5246b 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java @@ -19,20 +19,32 @@ import org.openrewrite.java.tree.Statement; import org.openrewrite.java.tree.TypeUtils; +import java.util.Optional; + +import static java.util.Optional.empty; + class JMockitUtils { - static boolean isValidExpectationsNewClassStatement(Statement s) { + + static Optional getJMockitBlock(Statement s) { if (!(s instanceof J.NewClass)) { - return false; + return empty(); } J.NewClass nc = (J.NewClass) s; if (!(nc.getClazz() instanceof J.Identifier)) { - return false; + return empty(); } J.Identifier clazz = (J.Identifier) nc.getClazz(); - if (!TypeUtils.isAssignableTo("mockit.Expectations", clazz.getType())) { - return false; + + // JMockit block should be composed of a block within another block + if (nc.getBody() == null || nc.getBody().getStatements().size() != 1) { + return empty(); + } + + for (JMockitBlockType blockType : JMockitBlockType.values()) { + if (TypeUtils.isAssignableTo(blockType.getFqn(), clazz.getType())) { + return Optional.of(blockType); + } } - // Expectations block should be composed of a block within another block - return nc.getBody() != null && nc.getBody().getStatements().size() == 1; + return empty(); } } diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java index 4fd9a54f2..fbbc1add3 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java @@ -36,9 +36,9 @@ class SetupStatementsRewriter { J.Block rewriteMethodBody() { List statements = methodBody.getStatements(); - // iterate over each statement in the method body, find Expectations blocks and rewrite them + // iterate over each statement in the method body, find JMockit blocks and rewrite them for (Statement s : statements) { - if (!JMockitUtils.isValidExpectationsNewClassStatement(s)) { + if (!JMockitUtils.getJMockitBlock(s).isPresent()) { continue; } J.NewClass nc = (J.NewClass) s; diff --git a/src/main/resources/META-INF/rewrite/jmockit.yml b/src/main/resources/META-INF/rewrite/jmockit.yml index 1b4651ae2..4178ebcd4 100644 --- a/src/main/resources/META-INF/rewrite/jmockit.yml +++ b/src/main/resources/META-INF/rewrite/jmockit.yml @@ -22,7 +22,7 @@ tags: - testing - jmockit recipeList: - - org.openrewrite.java.testing.jmockit.JMockitExpectationsToMockito + - org.openrewrite.java.testing.jmockit.JMockitBlockToMockito - org.openrewrite.java.testing.jmockit.JMockitAnnotatedArgumentToMockito - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: mockit.Mocked diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index 69f4627fe..54d26e64c 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -71,7 +71,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) @@ -118,7 +118,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) @@ -155,7 +155,7 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; @ExtendWith(JMockitExtension.class) @@ -176,7 +176,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; @@ -214,14 +214,14 @@ public int getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -240,7 +240,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @@ -280,14 +280,14 @@ public String getSomeField(String s) { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(anyString); @@ -301,7 +301,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; @@ -340,16 +340,16 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + String expected = "expected"; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -363,17 +363,17 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + String expected = "expected"; - + void test() { when(myObject.getSomeField()).thenReturn(expected); assertEquals(expected, myObject.getSomeField()); @@ -403,14 +403,14 @@ public Object getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNotNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -424,7 +424,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @@ -518,7 +518,7 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(JMockitExtension.class) @@ -567,7 +567,7 @@ void whenClassArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(List input) { return "X"; @@ -582,19 +582,19 @@ public String getSomeOtherField(Object input) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField((List) any); @@ -610,19 +610,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField(anyList())).thenReturn(null); when(myObject.getSomeOtherField(any(Object.class))).thenReturn(null); @@ -642,7 +642,7 @@ void whenNoArguments() { java( """ import java.util.List; - + class MyObject { public String getSomeField() { return "X"; @@ -654,19 +654,19 @@ public String getSomeField() { """ import java.util.ArrayList; import java.util.List; - + import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -679,19 +679,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn(null); assertNull(myObject.getSomeField()); @@ -709,7 +709,7 @@ void whenMixedArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(String s, String s2, String s3, long l1) { return "X"; @@ -721,19 +721,19 @@ public String getSomeField(String s, String s2, String s3, long l1) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String bazz = "bazz"; new Expectations() {{ @@ -747,19 +747,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { String bazz = "bazz"; when(myObject.getSomeField(eq("foo"), anyString(), eq(bazz), eq(10L))).thenReturn(null); @@ -778,7 +778,7 @@ void whenSetupStatements() { java( """ class MyObject { - + public String getSomeField(String s) { return "X"; } @@ -794,26 +794,26 @@ public String getString() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; String s = "s"; - + new Expectations() {{ myObject.getSomeField(anyString); result = s; - + myObject.getString(); result = a; }}; - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -823,7 +823,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; @@ -836,11 +836,9 @@ class MyTest { void test() { String a = "a"; String s = "s"; - when(myObject.getSomeField(anyString())).thenReturn(s); - when(myObject.getString()).thenReturn(a); - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -869,14 +867,14 @@ public String getSomeField(String s) { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; new Expectations() {{ @@ -885,7 +883,7 @@ void test() { String b = "b"; result = s; }}; - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -894,7 +892,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; @@ -909,7 +907,7 @@ void test() { String s = "s"; String b = "b"; when(myObject.getSomeField(anyString())).thenReturn(s); - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -928,19 +926,20 @@ void whenTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); - times = 2; + times = 3; }}; myObject.wait(10L, 10); myObject.wait(10L, 10); + myObject.wait(10L, 10); } } """, @@ -948,18 +947,19 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); - verify(myObject, times(2)).wait(anyLong(), anyInt()); + myObject.wait(10L, 10); + verify(myObject, times(3)).wait(anyLong(), anyInt()); } } """ @@ -972,12 +972,12 @@ void whenMinTimes() { //language=java rewriteRun( java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked @@ -996,9 +996,9 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock @@ -1019,12 +1019,12 @@ void whenMaxTimes() { //language=java rewriteRun( java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked @@ -1043,9 +1043,9 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock @@ -1066,12 +1066,12 @@ void whenMinTimesMaxTimes() { //language=java rewriteRun( java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked @@ -1091,9 +1091,9 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock @@ -1129,14 +1129,14 @@ public String getSomeField() { import mockit.Tested; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Tested MyObject myObject; - + void test() { new Expectations(myObject) {{ myObject.getSomeField(); @@ -1150,15 +1150,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @InjectMocks MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn("foo"); assertEquals("foo", myObject.getSomeField()); @@ -1195,18 +1195,18 @@ public void doSomething() {} import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + @Mocked MyObject myOtherObject; - + void test() { new Expectations() {{ myObject.hashCode(); @@ -1256,4 +1256,130 @@ void test() { ) ); } + + @Test + void whenMultipleExpectations() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeStringField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new Expectations() {{ + myObject.getSomeStringField(); + result = "a"; + }}; + assertEquals("a", myObject.getSomeStringField()); + new Expectations() {{ + myObject.getSomeStringField(); + result = "b"; + }}; + assertEquals("b", myObject.getSomeStringField()); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + when(myObject.getSomeStringField()).thenReturn("a"); + assertEquals("a", myObject.getSomeStringField()); + when(myObject.getSomeStringField()).thenReturn("b"); + assertEquals("b", myObject.getSomeStringField()); + } + } + """ + ) + ); + } + + @Test + void whenMultipleExpectationsNoResults() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(anyLong); + }}; + myObject.wait(1L); + new Expectations() {{ + myObject.wait(); + }}; + myObject.wait(); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + import static org.mockito.Mockito.anyLong; + import static org.mockito.Mockito.verify; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(1L); + myObject.wait(); + verify(myObject).wait(anyLong()); + verify(myObject).wait(); + } + } + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java new file mode 100644 index 000000000..23022dcb5 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -0,0 +1,740 @@ +/* + * Copyright 2023 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.TypeValidation; + +import static org.openrewrite.java.Assertions.java; + +class JMockitVerificationsToMockitoTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true) + .classpathFromResources(new InMemoryExecutionContext(), + "junit-jupiter-api-5.9", + "jmockit-1.49", + "mockito-core-3.12", + "mockito-junit-jupiter-3.12" + )) + .recipeFromResource( + "/META-INF/rewrite/jmockit.yml", + "org.openrewrite.java.testing.jmockit.JMockitToMockito" + ); + } + + @DocumentExample + @Test + void whenNoTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(anyLong, anyInt); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @DocumentExample + @Test + void whenNoTimesNoArgs() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.verify; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject).wait(); + } + } + """ + ) + ); + } + + + @Test + void whenTimesNoArgs() { + //language=java + rewriteRun( + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(); + myObject.wait(); + new Verifications() {{ + myObject.wait(); + times = 2; + }}; + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import static org.mockito.Mockito.times; + import static org.mockito.Mockito.verify; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(); + myObject.wait(); + verify(myObject, times(2)).wait(); + } + } + """ + ) + ); + } + + @Test + void whenClassArgumentMatcher() { + //language=java + rewriteRun( + spec -> spec.afterTypeValidationOptions(TypeValidation.builder().methodInvocations(false).build()), + java( + """ + import java.util.List; + + class MyObject { + public String getSomeField(List input) { + return "X"; + } + public String getSomeOtherField(Object input) { + return "Y"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Mocked; + import mockit.Verifications; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + myObject.getSomeField(new ArrayList<>()); + myObject.getSomeOtherField(new Object()); + new Verifications() {{ + myObject.getSomeField((List) any); + myObject.getSomeOtherField((Object) any); + }}; + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import static org.mockito.Mockito.*; + + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + myObject.getSomeField(new ArrayList<>()); + myObject.getSomeOtherField(new Object()); + verify(myObject).getSomeField(anyList()); + verify(myObject).getSomeOtherField(any(Object.class)); + } + } + """ + ) + ); + } + + + @Test + void whenMixedArgumentMatcher() { + //language=java + rewriteRun( + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(anyLong, 10); + }}; + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import static org.mockito.Mockito.*; + + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject).wait(anyLong(), eq(10)); + } + } + """ + ) + ); + } + + @Test + void whenSetupStatements() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + String a = "a"; + String s = "s"; + myObject.wait(1L); + myObject.wait(); + new Verifications() {{ + myObject.wait(anyLong); + myObject.wait(); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.anyLong; + import static org.mockito.Mockito.verify; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + String a = "a"; + String s = "s"; + myObject.wait(1L); + myObject.wait(); + verify(myObject).wait(anyLong()); + verify(myObject).wait(); + } + } + """ + ) + ); + } + + @Test + void whenSetupStatements2() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + String a = "a"; + myObject.wait(1L); + new Verifications() {{ + myObject.wait(anyLong); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.anyLong; + import static org.mockito.Mockito.verify; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + String a = "a"; + myObject.wait(1L); + verify(myObject).wait(anyLong()); + } + } + """ + ) + ); + } + + @Test + void whenTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(anyLong, anyInt); + times = 3; + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + myObject.wait(10L, 10); + verify(myObject, times(3)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMinTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(anyLong, anyInt); + minTimes = 2; + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject, atLeast(2)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMaxTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(anyLong, anyInt); + maxTimes = 5; + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject, atMost(5)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMinTimesMaxTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new Verifications() {{ + myObject.wait(anyLong, anyInt); + minTimes = 1; + maxTimes = 3; + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject, atLeast(1)).wait(anyLong(), anyInt()); + verify(myObject, atMost(3)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenMultipleStatements() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + @Mocked + Object myOtherObject; + + void test() { + myObject.hashCode(); + myOtherObject.wait(); + myObject.wait(10L, 10); + myOtherObject.wait(10L); + new Verifications() {{ + myObject.hashCode(); + myOtherObject.wait(); + myObject.wait(anyLong, anyInt); + myOtherObject.wait(anyLong); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + @Mock + Object myOtherObject; + + void test() { + myObject.hashCode(); + myOtherObject.wait(); + myObject.wait(10L, 10); + myOtherObject.wait(10L); + verify(myObject).hashCode(); + verify(myOtherObject).wait(); + verify(myObject).wait(anyLong(), anyInt()); + verify(myOtherObject).wait(anyLong()); + } + } + """ + ) + ); + } + + @Test + void whenMultipleVerificationsAndMultipleStatements() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(); + new Verifications() {{ + + myObject.wait(); + + myObject.wait(anyLong, anyInt); + }}; + myObject.wait(1L); + myObject.wait(2L); + new Verifications() {{ + myObject.wait(anyLong); + times = 2; + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(); + verify(myObject).wait(); + verify(myObject).wait(anyLong(), anyInt()); + myObject.wait(1L); + myObject.wait(2L); + verify(myObject, times(2)).wait(anyLong()); + } + } + """ + ) + ); + } +} From 30f35fe919b8166c19ddf22e2f1ea1c0d918487a Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 3 Jul 2024 15:27:56 +0200 Subject: [PATCH 011/118] Skip RemoveTestPrefix when calling a similarly named method (#543) * Skip RemoveTestPrefix when calling a similarly named method https://github.com/openrewrite/rewrite-testing-frameworks/issues/258 * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../testing/cleanup/RemoveTestPrefix.java | 16 ++++++++++ .../testing/cleanup/RemoveTestPrefixTest.java | 31 ++++++++++++++++--- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java b/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java index f16fe570d..2cb18b734 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java @@ -31,6 +31,7 @@ import java.time.Duration; import java.util.Arrays; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; public class RemoveTestPrefix extends Recipe { @@ -121,6 +122,21 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, } } + // Skip when calling a similarly named method + AtomicBoolean skip = new AtomicBoolean(false); + new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, AtomicBoolean atomicBoolean) { + if (method.getName().getSimpleName().equals(newMethodName)) { + skip.set(true); + } + return super.visitMethodInvocation(method, atomicBoolean); + } + }.visitMethodDeclaration(m, skip); + if (skip.get()) { + return m; + } + // Rename method and return type = type.withName(newMethodName); return m.withName(m.getName().withSimpleName(newMethodName).withType(type)) diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java index 00be3cd29..6cdeae91a 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java @@ -53,7 +53,7 @@ void testMethod() { @Test void test_snake_case() { } - + @Test void testRTFCharacters() { } @@ -85,7 +85,7 @@ void method() { @Test void snake_case() { } - + @Test void rtfCharacters() { } @@ -139,7 +139,7 @@ void ignoreOverriddenMethod() { abstract class AbstractTest { public abstract void testMethod(); } - + class BTest extends AbstractTest { @Test @Override @@ -268,7 +268,7 @@ class ATest { @Test void testMyDoSomethingLogic() { } - + void myDoSomethingLogic() {} } """ @@ -292,7 +292,7 @@ class ATest { @MethodSource void testMyDoSomethingLogic(Arguments args) { } - + static Stream testMyDoSomethingLogic() { return Stream.empty(); } @@ -324,4 +324,25 @@ void tests() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/258") + void removeTestPrefixWithClashingMethod() { + rewriteRun( + //language=java + java( + """ + import org.junit.jupiter.api.Test; + import static java.util.List.of; + + class FooTest { + @Test + void testOf() { + of(); + } + } + """ + ) + ); + } } From 3211368e54fd4d5399e0d25e30aafea6384d2812 Mon Sep 17 00:00:00 2001 From: Niklas Gustavsson Date: Wed, 3 Jul 2024 15:30:01 +0200 Subject: [PATCH 012/118] Add AssertTrueNullToAssertNull to CleanupAssertions (#542) AssertTrueNullToAssertNull is unexpectedly missing from CleanupAssertions. --- src/main/resources/META-INF/rewrite/junit5.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 4b28417a3..82396b90b 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -289,6 +289,7 @@ recipeList: - org.openrewrite.java.testing.cleanup.AssertFalseEqualsToAssertNotEquals - org.openrewrite.java.testing.cleanup.AssertEqualsNullToAssertNull - org.openrewrite.java.testing.cleanup.AssertFalseNullToAssertNotNull + - org.openrewrite.java.testing.cleanup.AssertTrueNullToAssertNull - org.openrewrite.java.testing.cleanup.AssertEqualsBooleanToAssertBoolean - org.openrewrite.java.testing.cleanup.AssertNotEqualsBooleanToAssertBoolean - org.openrewrite.java.testing.cleanup.AssertionsArgumentOrder From e2bb0ae11ae97ff7ab9cadbb458a00f265112dea Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Sat, 6 Jul 2024 07:31:12 +1000 Subject: [PATCH 013/118] Add migration of JMockit NonStrictExpectations blocks as well as JMockit junit 4 runner (#546) * Add migration of JMockit NonStrictExpectations blocks as well as JMockit junit 4 runner * Add unit tests for NonStrictExpectations, all passing, refactor to reduce code duplication * Add missing copyright clause * Remove @Nullable annotation because using javax or open rewrite internal annotation is not recommended as per code review * Add missing nullable annotations --------- Co-authored-by: Tim te Beek --- build.gradle.kts | 1 + .../testing/jmockit/JMockitBlockRewriter.java | 85 +- .../jmockit/JMockitBlockToMockito.java | 12 +- .../testing/jmockit/JMockitBlockType.java | 11 +- .../java/testing/jmockit/JMockitUtils.java | 7 +- .../rewrite/classpath/jmockit-1.22.jar | Bin 0 -> 615388 bytes .../resources/META-INF/rewrite/jmockit.yml | 3 + .../JMockitExpectationsToMockitoTest.java | 18 +- ...kitNonStrictExpectationsToMockitoTest.java | 1086 +++++++++++++++++ .../testing/jmockit/JMockitTestUtils.java | 47 + .../JMockitVerificationsToMockitoTest.java | 17 +- 11 files changed, 1211 insertions(+), 76 deletions(-) create mode 100644 src/main/resources/META-INF/rewrite/classpath/jmockit-1.22.jar create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java diff --git a/build.gradle.kts b/build.gradle.kts index 42276ebba..e7ccd9904 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,6 +20,7 @@ recipeDependencies { parserClasspath("org.mockito:mockito-all:1.10.19") parserClasspath("org.mockito:mockito-core:3.+") parserClasspath("org.jmockit:jmockit:1.49") + parserClasspath("org.jmockit:jmockit:1.22") // last version with NonStrictExpectations parserClasspath("org.mockito:mockito-junit-jupiter:3.+") parserClasspath("org.powermock:powermock-api-mockito:1.7.+") parserClasspath("org.powermock:powermock-core:1.7.+") diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java index 147bcdd50..0e9829b4d 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java @@ -29,11 +29,15 @@ import java.util.ArrayList; import java.util.List; +import static org.openrewrite.java.testing.jmockit.JMockitBlockType.NonStrictExpectations; import static org.openrewrite.java.testing.jmockit.JMockitBlockType.Verifications; class JMockitBlockRewriter { private static final String WHEN_TEMPLATE_PREFIX = "when(#{any()})."; + private static final String VERIFY_TEMPLATE_PREFIX = "verify(#{any()}"; + private static final String LENIENT_TEMPLATE_PREFIX = "lenient()."; + private static final String RETURN_TEMPLATE_PREFIX = "thenReturn("; private static final String THROW_TEMPLATE_PREFIX = "thenThrow("; private static final String LITERAL_TEMPLATE_FIELD = "#{}"; @@ -131,6 +135,11 @@ private void rewriteMethodInvocation(List statementsToRewrite) { rewriteResult(invocation, mockInvocationResults.getResults()); } + if (blockType == NonStrictExpectations) { + // no verify for NonStrictExpectations + return; + } + boolean hasTimes = false; if (mockInvocationResults.getTimes() != null) { hasTimes = true; @@ -145,7 +154,7 @@ private void rewriteMethodInvocation(List statementsToRewrite) { rewriteVerify(invocation, mockInvocationResults.getMaxTimes(), "atMost"); } if (!hasResults && !hasTimes) { - rewriteVerify(invocation, null, null); + rewriteVerify(invocation, null, ""); } } @@ -153,14 +162,11 @@ private void removeBlock() { methodBody = JavaTemplate.builder("") .javaParser(JavaParser.fromJavaVersion()) .build() - .apply( - new Cursor(visitor.getCursor(), methodBody), - nextStatementCoordinates - ); + .apply(new Cursor(visitor.getCursor(), methodBody), nextStatementCoordinates); if (bodyStatementIndex == 0) { nextStatementCoordinates = methodBody.getCoordinates().firstStatement(); } else { - setNextCoordinatesAfterLastStatementAdded(0); + setNextStatementCoordinates(0); } } @@ -171,17 +177,26 @@ private void rewriteResult(J.MethodInvocation invocation, List resul rewriteFailed = true; return; } - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "when"); List templateParams = new ArrayList<>(); templateParams.add(invocation); templateParams.addAll(results); - - methodBody = rewriteTemplate(template, templateParams, nextStatementCoordinates); - setNextCoordinatesAfterLastStatementAdded(++numStatementsAdded); + this.rewriteFailed = !rewriteTemplate(template, templateParams, nextStatementCoordinates); + if (!this.rewriteFailed) { + this.rewriteFailed = true; + setNextStatementCoordinates(++numStatementsAdded); + // do this last making sure rewrite worked and specify hasReference=false because framework cannot find static + // reference for when method invocation when lenient is added. + boolean hasReferencesForWhen = true; + if (this.blockType == NonStrictExpectations) { + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "lenient"); + hasReferencesForWhen = false; + } + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "when", hasReferencesForWhen); + } } - private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression times, @Nullable String verificationMode) { + private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression times, String verificationMode) { if (invocation.getSelect() == null) { // cannot write a verification statement for an invocation without a select field return; @@ -194,7 +209,6 @@ private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression t } templateParams.add(invocation.getName().getSimpleName()); String verifyTemplate = getVerifyTemplate(invocation.getArguments(), verificationMode, templateParams); - JavaCoordinates verifyCoordinates; if (this.blockType == Verifications) { // for Verifications, replace the Verifications block @@ -203,21 +217,22 @@ private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression t // for Expectations put the verify at the end of the method verifyCoordinates = methodBody.getCoordinates().lastStatement(); } + this.rewriteFailed = !rewriteTemplate(verifyTemplate, templateParams, verifyCoordinates); + if (!this.rewriteFailed) { + if (this.blockType == Verifications) { + setNextStatementCoordinates(++numStatementsAdded); // for Expectations, verify statements added to end of method + } - methodBody = rewriteTemplate(verifyTemplate, templateParams, verifyCoordinates); - if (this.blockType == Verifications) { - setNextCoordinatesAfterLastStatementAdded(++numStatementsAdded); - } - - // do this last making sure rewrite worked and specify hasReference=false because in verify case it cannot find - // the static reference in AddImport class, and getSelect() returns not null - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "verify", false); - if (verificationMode != null) { - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, verificationMode); + // do this last making sure rewrite worked and specify hasReference=false because in verify case framework + // cannot find the static reference + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "verify", false); + if (!verificationMode.isEmpty()) { + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, verificationMode); + } } } - private void setNextCoordinatesAfterLastStatementAdded(int numStatementsAdded) { + private void setNextStatementCoordinates(int numStatementsAdded) { // the next statement coordinates are directly after the most recently written statement, calculated by // subtracting the removed jmockit block int nextStatementIdx = bodyStatementIndex + numStatementsAdded - 1; @@ -228,23 +243,28 @@ private void setNextCoordinatesAfterLastStatementAdded(int numStatementsAdded) { } } - private J.Block rewriteTemplate(String verifyTemplate, List templateParams, JavaCoordinates + private boolean rewriteTemplate(String template, List templateParams, JavaCoordinates rewriteCoords) { - JavaTemplate.Builder builder = JavaTemplate.builder(verifyTemplate) + int numStatementsBefore = methodBody.getStatements().size(); + methodBody = JavaTemplate.builder(template) .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-core-3.12")) - .staticImports("org.mockito.Mockito.*"); - return builder + .staticImports("org.mockito.Mockito.*") .build() .apply( new Cursor(visitor.getCursor(), methodBody), rewriteCoords, templateParams.toArray() ); + return methodBody.getStatements().size() > numStatementsBefore; } - private static @Nullable String getWhenTemplate(List results) { + private @Nullable String getWhenTemplate(List results) { boolean buildingResults = false; - final StringBuilder templateBuilder = new StringBuilder(WHEN_TEMPLATE_PREFIX); + StringBuilder templateBuilder = new StringBuilder(); + if (this.blockType == NonStrictExpectations) { + templateBuilder.append(LENIENT_TEMPLATE_PREFIX); + } + templateBuilder.append(WHEN_TEMPLATE_PREFIX); for (Expression result : results) { JavaType resultType = result.getType(); if (result instanceof J.Literal) { @@ -284,10 +304,9 @@ private static void appendToTemplate(StringBuilder templateBuilder, boolean buil templateBuilder.append(templateField); } - private static String getVerifyTemplate(List arguments, @Nullable String - verificationMode, List templateParams) { - StringBuilder templateBuilder = new StringBuilder("verify(#{any()}"); // eg verify(object - if (verificationMode != null) { + private static String getVerifyTemplate(List arguments, String verificationMode, List templateParams) { + StringBuilder templateBuilder = new StringBuilder(VERIFY_TEMPLATE_PREFIX); // eg verify(object + if (!verificationMode.isEmpty()) { templateBuilder.append(", ").append(verificationMode).append("(#{any(int)})"); // eg verify(object, times(2) } templateBuilder.append(").#{}("); // eg verify(object, times(2)).method( diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java index 4283eedf5..04db84952 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java @@ -29,26 +29,28 @@ import java.util.List; import java.util.Optional; +import static org.openrewrite.java.testing.jmockit.JMockitBlockType.*; + @Value @EqualsAndHashCode(callSuper = false) public class JMockitBlockToMockito extends Recipe { @Override public String getDisplayName() { - return "Rewrite JMockit Expectations and Verifications"; + return "Rewrite JMockit Expectations, Verifications and NonStrictExpectations"; } @Override public String getDescription() { - return "Rewrites JMockit `Expectations and Verifications` blocks to Mockito statements."; + return "Rewrites JMockit `Expectations, Verifications and NonStrictExpectations` blocks to Mockito statements."; } @Override public TreeVisitor getVisitor() { return Preconditions.check(Preconditions.or( - new UsesType<>(JMockitBlockType.Expectations.getFqn(), false), - new UsesType<>(JMockitBlockType.Verifications.getFqn(), false) - ), new RewriteJMockitBlockVisitor()); + new UsesType<>(Expectations.getFqn(), false), + new UsesType<>(Verifications.getFqn(), false), + new UsesType<>(NonStrictExpectations.getFqn(), false)), new RewriteJMockitBlockVisitor()); } private static class RewriteJMockitBlockVisitor extends JavaIsoVisitor { diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java index e649448a0..b36c9240f 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java @@ -16,14 +16,17 @@ package org.openrewrite.java.testing.jmockit; import lombok.Getter; -import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor @Getter enum JMockitBlockType { - Expectations("mockit.Expectations"), - Verifications("mockit.Verifications"); // Add NonStrictExpectations later + Expectations, + Verifications, + NonStrictExpectations; private final String fqn; + + JMockitBlockType() { + this.fqn = "mockit." + this.name(); + } } diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java index a11b5246b..9d144039f 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java @@ -40,10 +40,9 @@ static Optional getJMockitBlock(Statement s) { return empty(); } - for (JMockitBlockType blockType : JMockitBlockType.values()) { - if (TypeUtils.isAssignableTo(blockType.getFqn(), clazz.getType())) { - return Optional.of(blockType); - } + JMockitBlockType blockType = JMockitBlockType.valueOf(clazz.getSimpleName()); + if (blockType != null && TypeUtils.isOfClassType(clazz.getType(), blockType.getFqn())) { + return Optional.of(blockType); } return empty(); } diff --git a/src/main/resources/META-INF/rewrite/classpath/jmockit-1.22.jar b/src/main/resources/META-INF/rewrite/classpath/jmockit-1.22.jar new file mode 100644 index 0000000000000000000000000000000000000000..9b3cc67180355373807e9cbcb8c3dc06af854995 GIT binary patch literal 615388 zcmbTeb9AO#(g)hHZQHifv2EMN8>2f;I=0oZZKIQpZL4ED9o+OebH6!rzL}oy-mLYk zl|QOBs%rlVyY{Of4FU@N;RED{4>1-x5+DBZ2lf8Htf-10our%?gTgx*>IXX zjYSPvN6!0oD!-DR;@3cA%gtUoA+s^PY6zpQQ^JAXTVWS6xc)D_lR?FVX#)-!RczKJ zT4@TMOh4i6sag@L&EkudyIL^lzkv$%&9o98Z{TSgeCo!=G0GtGwxWjmCKQ^vxDVd*aH5xJLGq^|Ixa$sgtXvvFYzt2JudBYj13A3HZyPe-|0zKZ#7;0j5rN zhBm*U{$)}B81jFp4V`}{aFl;?SlR(h&7BMZmiE7sJ?_6}_{IER7Ki=sIjvmmECH;) z*%Zld`TqY;3@~*D*qQ%-pZFhq|A&eHqP+hD_21<4hct~19RMy)mcLyl;lIk~Pd*z% zXJ>I!JJbKFPrQG_ZR+k|Y7F?p5`JgE^#6_3(8=7z*3=FlYX~s5_}5JUhiLx`G*JAv zu`KPZ-q-Yd+ob&OgSgro|J}k_KL6`d$o|_Xf1I%2s)Y8x4FPa6v~xDIce4HaV*Y;q zG5^g-zvg#w_?>3{9hWn}&D~_yZb#Gda?~&^fu-z1#b5$bU`zd&lx?;$Ia1&8hsF_@8utaVUQ}`oAlY z|WFBH_3_EFupzEc$VR%VHqMbFGiJ*PG=vJnB)KXR;7pe4R@OSY~k(o+wY zp!7rlpIimq({fZS?i4e+zm{*hr8`qE17F<3kT|_i5?|8V)Eku#m(sW`-&yEIQA_UO zLAZRK%Us*QGVflkGg*;%jBvRrl|8_g!~eT(6O20W2nuv-rGK7t{Iai>NsZ^%HIw5v ztIj<}xKV>fKW^-CZPe!54Qa^waR}@(jeV9N??z<$Jb!A?LT}cw=+lGbk{TY{_$hdo zp1OJd01Jq0Mef^2=lVKGi}TuT{Nr=uEJfp#NU(Z$?&#|tlPUW7Elz$Xilw= zZ*BMuyfOs28BHRx?gs@(fM~8BE`SU04OlJ%)Y|oAgW(fc@%8Gf-3s^H7$U)=tH9!G z;Peot&gJ%T7drePjQ*vj`rCUr1OaKab;r~D9vb0;{23nodo!W?t(nN!8=CyhI3i=D zr9cD`gWrag2mAX)c8vFjN&N#HNk}2LK@xf*(|mX=<6wDz4 z|1nA#3Pm@uV9X(xU|kPytd2?Y9P7oKFzl`cJD%nJXyBenZ&-1-7B0ROECjb^jRI!1 z*f4;q9sN-rbYF`imSFxQlk$;cZNB72OupL47| z7VQO*bze5srt&K{ub;^1KK1Tg)( zz7k_5q<|Gs2fB=3p=MZR>(m-pK#Bk*P=;VZ%{8m~gW+-!&Za-)Zh-j|XmUjn5bIAJ zzdDOkQ9^2sKA!PiXKp+;R}oAwe866mCW)%0;-OMeS|r;AIppcZllth8;O6Bbmt!r| zSk^88BaaY-GaRT|-1YIv-dU*j)II79alSM}Sg5^hATH*ZE9)erF80R0|NEX?ZjsFZ zbnvy$T*Pq+3L-Y2_E-+<;H zN`QpGphz{9y~7PNKQjMpHfx?SA)6Pm1@intt66EOwi$>dYjZ_a$4V694Z2rOBM_1~ zkY0{Qhxk*{;(F9lgpxs*#-9sKAtK3MoTWhim(movA!!xgl}7zrrP2IeX$q!JwwBJ$ z|AbwYHMw`#eJ!M0QwldI$f4AjlFAK2yGRCx${|nrN^W7?kxn1a+`LxNRtLHb^8l;& z0Kc9<8Mcbaa5Ic?F}$xZVRx**0@JaWT4z4t{n6a)Zl|f~{KKdrSCp@bQ8VfwXf2bB zRmyZsILQ}p*qK+}9RyEYzV8pB$;K&jj75f7hTUjUyJnJ{mGu?k$4!`vy1|`nD^6%l zDq-na2V759zP{IFZ(&5OlyoIYSV~LV@Ed!rLlvc+CAgNVF!5x;-_ttCFrUJwk?-5J zL^%;WzU9l*THuKEhefSx4}~r#(f5f=Ra>_nYqr+f&djwatuD^1`ycu_SWVyVp;`ES zvj)6FPXy zHMT5^)v{&6JJYrIykCgh52rb`8yFgj)+j8uY0rpgEatJOkvRffrIL|Xywt}hv2FU{ z`lmn}>Q{`3@6{`=h-d1qfw|D}@|eAvT}6s|RWR1!hOH|ehY}66(`Ew+FY#84E1D8$ zipm9EA~~1R0gzgYR}4QUKXXPWeto zBFN|(nsr6=bq~a1NCTvU%M&}4U~_TGS__@r9T5;HCWlcflmosdVK-6iG(2*P1uj6VJ_9fB{boFb)zu8BQRq#QSLBCNrXN)s02eyj9~UMVGT0T z8uo{vFnhyaa>@-C_mnun7iDgNL7AJV7%KQv8>6O0Py)<3wf&g-GkS`>dFv9mu}!W7rIOQQx{2BnpicZ5q#Ie*elSr5W;FV-4`1Ct#F3J9+! zlC&n(zunq!BGMG_QlAYXL{*mSR$ zINmql^1i}h#T@>L>`*&d%ryQ9CsZsM3;eEyc{-QZ@rED^le4qUKD~Y%{SfpCwGvz=mZU-g#*C3ls)V&4iwYN%?2^qn2FMIhHd^y? zcNunM5rDMsW*KaSlk+fW+^u?MmsIXxRZ{MOA@lvTt72?i8Bnovg z_mTA}3bu5Go3bYg7nu0!7l`bXi=pJ}2YM;3w9=UXBeH7Kpq{vkB>$#Mc;Tu|-S(nQ zAMb8b$_GROst3$$i3gP)^9S!9B_e^a6;r{AO&D*gEgCTW9UQ0)>Ie9ZItGTbl|bjI z&PIbN#()kGkJu6#e|5DBB}nwe2$@3L%rRER!WHQVHuT0JGCtQeC%o8~E~)UtWp{pN z?7Fza@~BO|La(nrs&Ih@dY}CTw69C`-~()nj3DkWrSB28Vr`|= z)HD=N6>lonsUoWePZdianw=A&M6mZT;ZAUJy);3p5QbsfaXqx^0u@br54LXx%sl?@?UfL({lZIZAWo&I~0;?NY#zK>v zu#T`~^C^c)(^xkP?uA?)0NV6p>~RlzR0HK6XDv5YkhqWV3Tpm5 zfg%^khC_}w_LU8dB$~1U{eJt6Gq|0?5N$_u>b|bv*&WeQ^xlQ6m z<(OkFzvE(>o*HTAPq$4QA}^wpr(HR|(M{_-USP*7MUxJeXY$bceE}6s^ygHz9jf}= z(ii~;A{h8Nwy*coo$!5`9cPIMS6{m~cGu06UbkG{OsQW<5YHHIofl~zib!}5P|*&M z^>|67rf7y42}yC0n1dxhQaw+KCgN189pUB7b<|5)&KeSA{pbvHJlJ0M8>a{4g-k7G z!=3Y<3q;-1TFSX|UR`#%8J~27h+Z?ZeDHG_q{SF54|H_L2O^9 z;HoWAH2vh={oN}#$;ZMk_TQ?Nmu0ufJf2)pH)4NEQ+LuJjv&Ox$Y2sbe%**#HqQKHlwS&KGI*^WPuLq z%ErNM-m0hAROnvFPJEU^_HvVub)U`RFB9@5xnz(T2H%zx0$4?KqMkWE|1!23lzky) zP*+`_{(6~)i7d3TLEh__iD93n8G&u4=@XwGuK{XpW$Hby8z2H*3@4&-a*FiXIImn8 zt*Y2P(RVZrrtu6-*NCT?9P$mJx=}!4bKN9fq>4p(Rtv<0 zX=J-OH#uo1<)T_vlh~y=3zJhu3;T=Id^UGu{|+9#hd4X-W!RB$-E!g;u9@ zQNgHo^LLqZ>1rTs6kYMs-IhAv=^6n$WbzcrOgycjfI}1Vs9BL5kNSWt(otOOJ@t;`*Iu8=@Ec#GUnGi?Jffe!&xtn@Lb%X# z*j?f*B$qQeO&T)Sy|Uh-VT__B4HbUy=z#aj)y8(8HsQBl#7z{I?Si9Y=EYv`$>x@P z{Qz@Gfsr0aA$kXO4^ms)Jcwkbe+ni%zJikg>nLATDU|;yJnC2>>YK1SQYVu}i|8(0 zVyA!O>?T^V{m-M2ma|<3)(Z-4Od4K3xjFe940&R|q8gZq$>+M}bmXvZP_YZ7?vIid zy&okVpwG5iAcm<`1690Lz749Z!T@scelkh{h23J`Gv3D@hvK(=x$El^v0?Us!vQS> zuM$MzjONGZ23;522UrycMv?*e0FJl%B_rM#cY+&H?3D~C7iE(d*seP+13SDP7^Mbo zGnIjuUuOyLc6RcuBaSi8NKSrw9Frw|=Fr>2Bb4W!hT8+VDdsHR20}x44WZ)NrPxMM z`6(#_dKP-B!jL;!cm%BLTB?nRFm!2rnN_w35S9VUl0!)3>o6|fKJ0YR=Tz-A z?6-?NCVxmvBJVHOfl99jw{?u#m1UeHi2ViG_maa@zJaVtzpO93U zzActB;~^C;M<8VX*B4`tqk3n}hC{H? zaK}{RaFbjkf^}f*p5jh=8(Z6U|2PI)TvAWD)!0-fwb!MJIAVc9)49DaP`+$N%|8*r zT3pz(BMXObZ&+P5wb{n{pa&D6Z((&Iq8vb>h1uTGlQSL0ZfXn@5Y5h3Y~0D-k#BNL z^}MstkWm-!O{F|NkzvahUA#(PU~(t@ps=7E&YVcLdU=3mbE`S`NRbXROsZlEo#q6} zlbD(Yd!KB$zB2+Nxx3$Db4|<_E9^*`=?N2iQE+2leF{vRD}CrzZEIB>cuIS6YA*%N z0Hudac5*@1%K?;+Nkj=wJS^$2Ay8BsO8>3jY!4NA*b-Q)SMS?EbzBuzKgrxfqyZ8+ zlI?(N1~DCGKMtZ=-g#bnfICTQQQ0@2=2dr|N@EI$i%h}LGipP1Z;oU_xi+Z-drI%U znzZT@N^Oj4?~;NypkIFa5py(L@%@sI<^3AyKc{Id|2ID^V(M({Wa$8~|3|V`psK5k zV~Xm#PFgJuNe~HE-hlZ`d;->po9>uN~gDR3EOqXWJb}x{bJs$!gIy5 zPjm{okYH!9cn0f58t;}XoveUpynaXK&S&E~Yu}r1|K!I+*ZDK(CL?{n;|COMau?ii z68|0ULO}bRpItlM2$W{wj*i^$VM4e0HfJOjocZn(o~GH}kMdx*9SI{LMlPUsiaoxyA+4T+DgIUPWE>k+gp zqmuTKQ=U#y))VRr>Zez64O;bNq73$E$rZIEPVQLOFmj?qE8LN$MJMVN+qe@quEUkP zBXUFc`A3za#Qa%xQhp@U6k%|dnA(q452}^@N#q41ByZb+)=%9rC5)rVp!En< zQyf?v^qPNh;k(F}{>ww#9~y=aOgOKhmvStNn|pm1QIk7T zswFse$cCg7OM!@L03<{`Cl@zRe$FxS!jq&OKUkevAa{e-ZK?sQDQC@w(-wjLBMdJ2 z(dWtBxE^c6at@qNQ`7F%1&-o%m&tUIkDY-77@GM9!IrBYk>w66jQPRX$Q{`jq`BCw z{L4b-IaaK!SgiZjwJwooU3;6}O*FF(nACWii8@zsFvh+UutCd?GtGXDi@}dHtzClJ zfWBw2HRn`pPgwqiyN2)6cHd7{d564ScBbeXJjE>(bK5lHs?Oei zB$uNy9I1c_^i#7tEf4jAXAT$OdMauYuz>J?ubwB3srkL{9Q79R$(T>eBP!cB;C$) zY?LJY*Fd2k^2A$E zqncs+9X0Kj21;Rj?54%r(tFp^LXer6y_2MNu~IdEq{g}D+o;gb9bd>L@Pdmcs;@1Mu( z@0HlU+^Y-!zx^D4=G{TD6LRmJUISeP24F}%U6%%|1Be}q{bdxyWR}2ER=3-hB_#BX z+DeTga-GQ#1l=LXMHtNnyeH!vJYA3EsV}dO&%h2rAUJL8cQz+5D#njzhheeY`C*@3 ze7B%jwX`V2uoDm1JHFF0&kuU@V-&AaXksggi;^m|#Tv&KNFgwYJ5htdzsTUA&E%yO z3yMgiu=5}Oh(M9#1MGg?bbm@zGCg>FlJBPw=2nkLC}bXX2V4`>XNyp0I0l@4Tm{#g zK;zU}L;ens2p*c5bK&@!!WXcVa`lKeaoPwr{F1bB)Z%vxGrL3TtvsM<6Of&x<`#ey zB(~{Z@Y6|D7RV2nAiPTg73>S8W8*;TUeAwd?h)YOVh3Jhn*ig)SXm)B?c)6_C@>+A zmB)r_m|qq^U!hb&|9;zZ@&5f&;(xb*zjP)1Q{q;Ju7(Y2vi3Xdh#fc=pD<7KGP!fCeIeP0Vi<4U97;2ZCL`4Q)G&p|N?OCF-vZwn*H)d5zFRtx z#TzSYPkXpG>s6G*QPGUB){O!hS~YxMeOeq4&MdZ!$z~);rg;<@=eRrK&t?G3ncrKd z2Bs>SF~X&ajffJa`RDX`EKg`B46d4l`<~{PO$wkOI2x&EivXxB~o-9Vp1K2Q(Lel4bpMov9hA3 zPu!*eSlc+ciUftM6E?zw=Thsu18c%CcdimV07^*# zb)nS5a_s>oj=`E@H(Hz>XAo7cM&|HlYhopAl2>P(UjgJ}bQ~I%JN86``E^$0sN1U_ z0d_sl4RH5ddhCzaaK7*D48oXV&q67%RYC8ynsc@FaA>%LhWuRd5|KHS>7NL+4@s}h zaemKiqed);K6LnMdEPvRwMihDbMrXu!ev*JeTr<=i;S8V z#6VxIe^M8%*D&NyX&)d@;U2K1IC8_(0R40Ca31CH96&B3Xx>$pUqB zEOg!qdGQfh{B;c5CQM@%scF(mD_cR=8_avm{f?bxUQ77M+|^MNSERlVR~J{8US%?eyo1#;T<>J6N--sd#g=Ha6}JZ{ z>euGCiv`=A4o*+3WlpSZ!FgLgrK;^yn8QMBAE9{mw#}O~9Rw=)u(l=WeKO#aP#V}1 zaDM`dFd7*e+7YD{xeaDYC3GqGYrB5Ejn4{7O-%tYZA<4U`(g`In&y~LiMhkgz&_A` z>R@jr3Ag(r_&_bV6|oSS%_TS|_fN2<`mWMNma;p?KtgtEHt!Sk#lShATIjuKptjaA$&oz-968kj zz+&jZ;}vtf95dExtG${1;*bSz91F|tY0^OB z4q1m%Sd=(oCRdXXZzZ&>Vs(q2O>MltJv{a~33(o?aeJbLH$E{jvWbydaa(t}rvDZE zUMJzqES}H^bE9#x`LR}2!E0r(4o>K&9JY%Xjgl|g%U(vRvWvkL&F@gP<5?p0*ilnM zvQfY0sD#GnLRvUJRcCJjdBTF*j2kh*ZmDH{N`|}%pe2(JqRjYmfs^gh6*^nv`>?@xy3Brr3i~6J=v94HH zxAd*T3_p%#^LlN?p;ZZK@5d)TQAP2GEY7(#PqZ7*R@DmBQJN#^vAx}KGhrLl$KOk|oJjT6qw zW+$!v^=~Z`i$XYqvv|;7Ir_~N&RFCI=vbL@Te|Ob#L~nZSLfpvT`rKaXPXad?okaj zk0=3G)D00%J4$f!(bDxRChJ_u?Jey}%)53=mE2b~A*<8eHr*6rE7r_udJJg-U=!@g zG33CDLR8#lHL7+;WY>bm>nJu}oQ)F8vm{o^%PkY|Pq1i7g*Rv|V+3|l9fV0kD|1dg zoEFRoYkql)vNnamW$)G5i5)OB2CE0A*Wut~)|1{5>eoU;)cvK4FJIKz+JhHVpLP3S zqiVK5apdZ@_~E#JELP`i6JW1*r(>`8t^jy19}**jkYmSdY!kk?vFUV+!Vzo=qY+p> zP`nmwnt52U(v|W_Gwiw3w65hOIE}YBu23gfG9*=vU#dsEb+PI6!eGl}5VapTQ&i;T zxNnnEbC{$*K?sE@Rntin9iPMVJBOV*-(?heAFkfM(?QN`7sXGxQl%T%H|GYXb@AN%ST5AZCR<1{u+K)VT|(QU_8yu8#R`()tpjms_H=A(n% z3aAe;DrvuHxJU1pPAetx2Z#+m3SbDr0e|kq%ZaK$HqQbUBEXAkmB;bm-XnvKE zL}lYCmRR-;CEpSCN$jU}q zq+cbT;fw_JpwNW7l;eTx?qRr^U^nk$%8o61aFX>ue$mtBl= zmmexMSr9QF!;jz!SWxdqbTb4MsT}OanOBs}qYTtDP;HpI)s?y7j{FHZAu?B$lmYC5 zzli(6f9DkSu346PK8y*=h{D&;(QZvrlT+Y2p7kf;rPKp;pyryK+x8k`2TJ?dW;;1) z6`5yNjy1#%8(+V*2wdC~gW@9rMIzb&eF=QB3d9*HwXI3&w#u@uVSl`#Cov@MHYhon zpQ&edFTlq6)GgO~N)KH= z{~))WV7=F~-e)K;tue2Z;=(Ll=IOI}orilzcaV=`6nCt7?Z$BLmVLuH1 z(;e~|T%>nCxAozRYZ859@6zu1>Agqg4t)N3^7W7I9V65mfw%XvaQl0#@XtWv?->lv zdq(+>zUsdR62J18Qys(gn|Mr`)(P4t_YP8>o86*)OA-p*thmbyu=ve>5T-a@wK*RUj!3CtI~eYclA=>Z(xoiVB8 zQp#f}SE=jMhEm@EDK(PNoxucqDe{~n!QxvE)&}3f`Ux$#Wt2*1qh+dLMy^ebhhL>tgok0{DuHv%6fZ(-E+Ujxtszn~dMcM4|0|w(14#2v(UQHIzzay@ek< zp+kYvE#@sq!@CO$v@vzVohHq9w+?Y~MjvIyEAwmOBve^slgL-#9zmgF2}Dq*27d@%?uC157JJ9nVOXu1lnz~aP(@2l}&(-qKBAuYdO>_(9? zt4=wGH`ii#Wykh$g-Tum(d9MVr!tvv46U=hf*-yi5c5c97d$1@;+J23Ve!TUyikCvgyU!s$B zHscgGez;jo@aB@V++Nq7{tvF zEX+nl|1+qPA(0;vgI{_)p|jFMe_DfY^~4nRwQvK#_hNJIcV|5Wxz*BVdD#pwC9|%KLq*8c*jDk zuaqx+t_dC8%LEdby7vQExW?UC0L~WVj_?yl^sbHUdHR!aw7hi-1saj8!Zl+LV_in(-OTxgpl+?>#2gqo7eyF7$jer0 zmT0sXF6njncn z)AcIWMP_$f3%35I&wI)D$Z*PFnTKxfIMglx0txIxq21WRkgKKyzgE2UlZN-b8u{!t zxII#jnFX#5f2JsoR)t+#@s^5L8#y=1n|U<{3tR^^rlyT__)ZLcL+!}zL4%xC05CA+ z70-wX(0*_J29Uf7x@@Bv$kMRgl&$-4-C9d?A%9@HyO63?bDLg+j`Mx(d~CnnMg|bV zT_XN~|5r+wz2zsowfmy3S9CfZM1h$5P&F_b!@>t1kEU(*1NW#r+plKIa&63{WQ5_A>FQS>q>SY9r zrfVWi5?T>A_f4UMF*T&6HrK0%ye>wUHFwQ-md9FWOcuht2Wamy`3k{tb=ar#=Y&be$&o*f&SP; z_)_B*cEFLWwE1~xQV;IVYEqWr?E88pszy)^35_n-dsha4S7z(uO7udjuTcD}2pQJ| zW+*5%R2$6QK)lgD9#w=_Kk!TXuEqsA0v*r6Sn-#v@X&>syN>8ES-}eled@q_I;O0e zmL+hTF-z>rG7~q$iVVaXUF4!p(otSY{Krjy>)BX|MQAQKO#H=q&8v3y5KafJ1Es|9 zQI8PC(UqDmjYT@p4@5vSa)`t`(43{#+6MmC@ZmRY9!0K^b_C#_jJ}Qa zcg49fe;^<8C+}5L)58y!-psnFin>T#>4t08#@djf;9XmQ5oPJ*aYb=OfPsnJoU??> z$W{g=9@H)FiBAvM6k5nQGWj9qH9?%MUpKlcf|ri*S?-ow^AL|`NH#tBZ7}$43C&PnZ5T#v$~3V6LpE;ZnOfv8^c(a|tcXACB+#X!o`Y9hLCGce$HpsogMw z)ler*&?_4!E~9`}q|#`RA2d=x8Wl5mo+qKe2$zNV0%U4Vl8d98;86!QAU!BDDBV3Y zNu)7x#`ohUFsNuMQx%8JsV~qb8nt33nJEhzQH`KP> zwvtrg-EIDI-ndI2k8O~{5N5`h6FVeDPmz9Mbb6#vIY~rDX;6F3as=^xYA3=mXu|>T!1yH4k zyAZSGdAo%CHxFuNqF)%%2fp!XtFIR>v0{OQvl_k1H|!ML#R zuh;Tr{~A>Oy*l-mvbcz;jj8$j)4o5;Qarcz3;f{V;3VL3uHde&;P7JL50%fsgXS^2LxI8m*~?pHk@;`>L~+K^>GYcReOqRUpQX;jGS6<{0;zM0v@ z?O*PNHAR}FIssoHo{3pkL*;;qqi5Bp$R`iY56EkuOGl-AD>A)Rwu0*p{>8iT=8`$7VH4%dgy%#>kU}aOzjXK>DjHO>_@hOO{6m?tZ(!(ZB&6K_}nzm4BFlw$qdP} z#qC=K9uhO@IY71ASTO}!EE}TA#xuLdTQH3}@~~e84JTTc!W=JZL5|@)g zn6T9ZjIO~jqEo7qFDhugzy%RP1@(lvnqAGA+B+is7RNt2)?Oc-v=(z8#<&&$l@Nc3 zACQ-LI2P+6h08D6#ixC8{XLl9l7iOTVcrI!Je-(8hLTI6ZhgGV5m7j3Uh&ZYO8tVx zy*W5MJYBi2Z)(TT-A&@tPw^k%BV7D>@xwcKNDoC+Qxz6Iadq0L!c%G@*9xosGoWDt z00WUo#Yd1><>D2}q3`gUbuoU$P5F|{kB&W7n(T6?Mt7HCp|^sVODy8dQH~`LP+x68 zjw9y=J&ipNxU`ja+XaA15-MQpQ5$OO>b?7n;(KA;Lq!;EJIGI1Ki0alWT@~gXD9Q~ zh~PWX9>G6ZHqCicLYr?y=c*rt3oew;(w9=&dgk0&2jcAK@tsYMb;p}y6V?0q zc-+x=KYvWSkIi>kEu2p%Pl)$K6<19W)ly=xMC~6+yPt<6YbdN)c5}$gd6{zHa7Z72 zWy_X2;UqC4<76TZ?`}0qiQPfu87*#fEs_$F5D6_56b#FsHCl{x3XGU#`b5)!o4Sa) zyux}NGZ*{WVFCwd<+)i3MQ*f_wx^K*zh6lXVI6k4|7p|UX?@Yl2eqB!>OmGCTm|8h zJd)HDzdw)lDQO*Q4L=@*1mO}Fd2dhP3ZZjjKvbSJKC{ltXn^Y&+B*sJ`emY}o!dIt z`3E0a|LZuU$hmPB*TD&s}vkbr)aHc>IgoGY2zED=Q2$uoE+w) zKH4lvk0D5Y!H^y%0<&|v4f)^^K{O#}UDS;$+wN9dB&{PIGQefff`v^#k8t#~KCSxF zXM2#mm0~@O@}xu0e#sw(Otb83mQF+FmRYX|R5$m{mT>jKQT5_WkpU|5LH)M3wp4x098Rjh2Ba#W(Q7D z5ELqnJQ0}?b7y7}-r<4~Vj`%!EqgP>;%miJ|HDb$6N=R~2IhSRevVLBe{#!7YQtSx zhwG2)^LqjyoxX%%a+7V$h&*v&P~pf)N6kD#4Y=T7n}Z^uVB!CI01jx14%!D2OZ z(4FSXafYl-h8S6?S%y;boN?O0i|eRh(PhR9DHvcYRB}Vx?ThsfKr5xLgu$yqH# zNiqvMjr|D;uAxQ;;}zF*owgSpIZW2lhuY{s$9P*$NrRKXFY^+@`8UJB6$r zP{FM#o?%4XwisZ-(&Gt6^BWrIbBiMrwn zjLy+%G(qGU^w8Gp&pCxWovl|32H^^(2bpM^WkDUq-8=J;^OZv8aETPOneZ00x09;A zoQ1;4*?pfQ6p-nAi>s#8VPL4p)J0nMKji_t>{dA=Ej`6ldvvMK3ozX6@>KA%KeP}F z*UFrq3h(5!J8llB;T&*T{T3MIbuhye22|=CSx6||YoTVRC>+$&qcR51{na8&_?3xu zQoEN~iNt&;a7Ro0^cdQ{Q7lhHSu?RRm3yb^r*6B34&sCl5e#t`Gr^*sBki*ECqWb+ zOr-h}A-~*2*IQN!izp>ltdqQ9$S!j zit}njCYk*Qs3Lk@N$w)KFrXj~{f93}?V09txsK?#Y8Jv{o2#Gat2jFk3 zteOj-4Fbf8P*QW5k66h1A*3xRb1w;R-Hs4rM@`1OHK6)7B|jA%7VNRe74=|r8) zFZOCT%ZaYRYmn>Jy;g4ppVd`?u!Y8tw7Nt-f(!L<4VODv`_1Pf%bn1uZm?+}N0xU; z6*Lwp^?_YQfR%+ynI4mtw4;`?3MDdq^H$h4OYGNx3!BXcB7TARb-Dzp#6DoWKaDm6 z|7-N}_ZZ+WKWgwVr|VZ7Fs6NMhck%wN3!fD1kLSAH<`%U&>IYJ-EQkG**2^oDrM0oaHguaFhIT8gtmi5ttz_%o z-#1P(EU0so*0+>oD5980czWD!U(L0RXnHNknKv&yk1#ZHf2vX!vpst5u$}07-X38% zG1KO#c#_;W(p*?}y1QtOW%;zQ)U`m1A2I`dLNIOGQT`W}&fdZhC6jxo02W$A}dfDVA zHssa{XEP>{0-^4EjDdHj837A)!M!mJN zCrFYICAc5f+hQw=U!=vJ?*w#`fTiGFn}WTjcd-c0<&>7J@7j`}!Th2EUx+j|J@G@Txh-FPzVD*LdCCA(pdp(A1JCP3AgTL`)&ulk^85fxG0hk@Ew2wrW z;&ajwa7&rnvObe5-)@2U0PADqgtz`bguP>sCSkOt+hv7y zcG`feduAfey%8B1k?-%!jJ@|->)9GSeQ>zilZR~Kze?Ijo28wadn(pX+gB^! zRCqi-IvtnR;oR<8&u(8=U1IlL@YUt?9oM!W{CXzrNQ zTw1?hFM5^WKmJXe-%T^OJBNHA3Hd$6`E#{ef*Eu-=gH7d)YI=NDPJQ4X!$2`mU~5? zh`rJAZC-iaKHxgMZ4j)|O^!;DodA-Z)8W9T}-u zgu18ENdHEbFj3J@tbY&d+U>xJP1s1XvT}EjW4i|mTG)x~ha5FuqQ|M>L-EI{TJ5a7 zx7Ly6^c=4r!4FiPzkAYSt(kuO8?yp`+p4U#*&#-3#ojDvmjD#s+LuUWK4bnm!$A;xH!A0`i6H`{BUw+IIDv~w#JUX&WPu_72zE(OK3Cn$ z`+vYM=2{j`LcCcS8XK{AqYdp6YLRO&^3oVYWGQLkEc@eWp(F7E(iGtf?!2S`9k;Go z-yEn$6b?JgGg`3$iPFa!{78QE5{0{}+&XYb>9VY+ly)+Z;5P}{8UrtJga`11>7Zzx zlX426{C|>w;pI^Ppf#f+2hrsQEkkl8OVB$4EaOJ#PlP*#DTp8xCdkH@3un#F@M2nE z&=A7phQFX8zhC?oRh^-c8W?iip@=6uMrK1vOsNlY?P_i5Lqp}iuM&}iM;e% zTl{)t5=Isg%pv{8D}c)dPpl!1-Qd-Vd(~h%6Kr~|Fqz%ETz=((aU*;PbkRQfSx^!a z%OM~De{(rnV!0)wj?>X^8p9q0$wz&{#1J7b#&`Ug22$JkQ&S4X1&RLefQ3I>>edxj z8zLz5m*$_xWqcK+gJ9A=Tj5y8qugvL6DV|-%86U@o>+%e5fk`4vahfLQA#BPrpJ^v8u=u zqgfVz11T(T`3;~TjH2igm|iNAT3zmfi z%hn0>&8snTSVvNKeIyUoaZC7JV*OzUHeGf1KMrBXg{}at1g2|p)X30MHXBc3$r;W? zK!xQxX1iUls-)5v_R>G20stTI>=6hNKnSsM9%s?JeDV6z@E#=0DwL4b9Nox zNaf!m|kRuk>&~>Q%%+R8tMw1SIc*PJ=bTJ^L?(+E%=xjDToteosFDIDm0#2jF!v;r*q(Hb zVhKv@g#?xe&=vx78oj27nc+bwafjZ5S}YbAXL=Fz|B2ipEaG zV=K;-YF2aT#B&r0*UsFJ^4GRvR1NkifTp84ll3LCEqVtyZK&}_0qIANWHkRBLi{D3 z8bw?*^{zIyqDR7)S&}26Io&{a6}lQ{7GLx>858J_f>kID7N|1|D^Bk~l1boT3FXbnI!{s7?}32^Zt${vSU=3} z1J;=lVERLrqI0VacP&JT`BnReQSpo2A|yR&Ehi3e?s_K`pw_HkH-~!BG|0sWvrss1 zg>!JDvdHXWEigKEN(pWFQ@3VAz`+MI(CRKEzvJ5cv*xXNoJchi<#M^bWq>2QCnP=( z-^Uxm-YnY=oq9>s0(;&Tm{GDXR3Y4 zH6*3r!7~EsAE=qH2yZOs<_Kx8;M`vMzhV|gHhD9{#RLgS>g=-cS zXFb8n0ajC6284&p5NxnH%0rq7$Hpg3p*dVrxOFL|w;*0TN;7TXza|DGrk^LwTLOv! z{6;~YZ#*uC*>0fD7-MDNkIAi1!TNDS_0~t_;=HA~wU`Ku?$C(|fwpz~GUR9&O5-j5 za82+wqmAAd3F>`$9(4Tl(d<%r-|Mbm_`h0vghw3ZAkhL&o0+NWs|^39L9cwT%C-L? za|`$^jpX>moMjLZm?_TXajTdp*@|*>m!L;X79L%G%&)x`gxx?u6CRk8ld&2rm)rAz zVX%lyA9YJW-tVS4$hX_w4F?77fyjHZ1>V;NVD^w-qDUYjQ=7S{Sd{4)OR(s_+KW>m zPkvaqa8sC-ZbPyh^N9rVP0}9yAu3Ky2w13vD9YJba*ab^J@FQ}N^J36_%%GlKj*dL zw@Gil^K|PR0-5Li4;6#~8b(r^bAQShAb46(BRT4EfBcc{$1xXe&aG};=|amOLC={a z?aUI5{=hIc`|G~gc~cXU+gBcheGJN^IG@+d)&(p_=nFIEw>n8|G*=r$>WZz6&&S9_ zr7K%c9!-I?rl1=)EEGh{Km@s?Sgc8-b-qmM%oYDhwmCxiyzI^A)t!!250Tm0c4ER) zNk~VpLt=`WQxoz}1ihtudE=el{qth#GyUTFRi2d1!!y=e*R~zPYqI?N0O*o4J%(N! zNDZlu=z;l$^pXoCKYK6Vtwy_sf%NzFYnA!Kml;{s(w<`lJt92SfHLzS_?~UVNw7pq zf4^hsZd=bYceJ&*-w~8E9eC`ZIaEf}9l@BZS}!SJSe!;>sGNxt2qA|o&cd=x@5Sej zUVkYcbS~pemc)nbJ3F4ana5wy7CNbu)D{s#LdP^aq$$q|#Ak^K!A54bj=6)!C_7L# zVGdZ}B-g4FIVME`99inD>N*|fF`>7L!FG>Vskf9=9lcN?b{G_sM@A$+N3q)B(_)}q zMWR$GZDdUWc7vdCJHr%Jt~pvVdt2oj-lyPh(}Fz#dgy{3hRfRtHPIJ!@D`eYPmV2& z54p2*)+U^OENXfiYcs09Z0~mO11KqXOnH@M<#<5W6Ax|=ZfaDu5(wi5am5JQB;<<`gQZ-_Bn(cLY)?vT> z*))gRr{Xua#|af=^;?+FE6mg)LK-a|OaeVqAE8ToykJ|(imrF_-M(ESd!Q4Rp>u5H zETuKtGPH(?p_A3Yj%v_5hAnjZhgiOO)y+`T zD)pv|(YZ8MJ2v56gGjZih_v+FM)=zW6N_Ct6smHB#j(TD!D7zs-biXk^b)JMtrST2 z)?%mCfknS7mw}&bJgM%fwMVwxt&oFH8y`SaE zL5j%~jO*uLP{d%1*@9*~REh2bTH@bZlVi%+!rTzG(BekRM1N=Iio# zCN;Za-z-YlBw>p7fnQJas-`+;1^A`@-Xa}UlE=nH(F<57I}Io3CnzC65;A;K1dA9b zK-$j4oskruF_D4+2;VbzKhm;^>F7tBBC(4KH*UCUHYC(MI>l>h9vX`txhu^}HX5@I zlNLk1WjP29SAU}55M(F4J9hY|!i`kzpIW3<7!k@IoV;C+iA6H%*$m(&c8D8RYB!)P z{Nr!x*JgI~aP&a^G*i2besCUObYOdQydQqg*<`_vL@t+4#10-aHI!+)i36(8-5j%k zm>CRRE_h0afWNw4h}L*cntN)C4Ahy!Q>d~hnLn__RvdgL5&-3_tX{Ic;W+ld$|2oMg7n&C-C4*N6wJL za&0KxLkqVR+Iw6)yhTHf)0dYEB4#e|IYLk3;o@)_!Kmpm0DhhK_(7L#tnj*TT2|OT zOPw0FI7?3caM?aY-vZIQXmV%^$F~>Gk(m;%s-^Ts{}5xw~JUjwcp zn{1cmAY@CJ>f%*Jt)yc(eh1algL%JU(QEHlmO7zJpvF*CApA{7F}Q?9C%Kj?IWF8) zn4BBBVS7?V5>XZ_*Qof*W(J*h9Q)GtUceJ;aOlNhmN6AQ1bA~;`#K8KK5 zF6d9QU&7Aw*Cp}bm)_GAwADRYGC~OiOr*7nY;FgfRFvm#R*XJIzOrPnZI}ohHn(U4 z1D<${Ikfyf&Ry`n3z&hR)BD=q0+%h)uk1tot4AbdeWjX)-%;K>3L z5%bY5@O`oy9;cDj`>)eyalc)H7YXga&TT_kl@W-8xPL{8GqQX`jLW4aLwW5rh7yQa z?Jb^~zgfeTh~F@2As=(A#YOGIiPT5+NqgTlL+_Fv&Lr;bidHnN-Y&g; zDM&3k*w|q`0tSI!OCj0t>PFeUgN>1F>7I}eIb5sEqhVtsuy*%3&BtN!3E`G}b|_TS z>VwNwEd;z30agoXaHZ{dFM3uVcaym-J^DxQezyu&m|-8+Pu&3Gx$U{f_nUA%1wD55 z<6oe-f}GlauJpEjy1gV(U#7%6zU@~0u6KI=6OA|-J=fmyLm@`~^IvCw|F?4aANaQa zXR`i(fQ|WWY;6A%RI6g{X#T&`(a{N#whMm{N4_&f7uu$=CEQzs=LgL#q3rqjg(2ra zinvixYpie-H;GvtvLOHd3Y+=02fn99EJgy4!*P?3*mzFD0+pv_V(Q}h)sw#Vd3%4( z_A6E2Ld;M)FhtV)Zdq6jy@W7|KuS3+8kJRX)gbJaV8EmMSp7E{{pGR$WoMV=ozG0y zZih}U$cSU6%r+Ev&oI5~lzp~dCV@^3GXR;byJae_lB>qsb=Gq2OK|IKUZ(y^y=&v( zFOflWI%E!~H+Ug8kqlyjAd+18;TtcWL*v9ho<^jXm`>Hmi%rYR4HbMQWZLU7=#ncK zmaX4XI2B4EQbao{rm1|2hb1I$DO@KETAzGhxm*o-E&p20#1yW|Bt!nC3sEug#h@d5 z<@V^6eF}TI`~W{aGnKHndRs4ki%uHZpWUV8os8xYOR0})A~Fx(qXMTi!(et(y3 z+|l@JLCy^__J16ZZ=>vjyy6jUQUf=ENM%IW>_+Ulh+mQ9O&B*tmm((p`oTFi#k=G74Frheh{ zum*PN2K&HpI_vV-x)1gv@O9H1{tYeQN@kdc@Lq?mt8HfZlVbA@h>pcwu8yZ*LGbRi zPA@i00ECg7vS|d=b8~QaK&%hNO(7(kHAjJ7gH~y@_A;W$3QAZq5JNbSXZMe(d0uN} zQv=iN#>OfNp?Q12681W}lH3w>j$Izrs)QHH3Y%^o{f~Nqrdikr*Oy`@ltShV;SsP) z9xtY;X&V=YM%vonWxrAb8%i|yhZz-$4E5v+%AvL>QD9fDNh`nlCQQSYGeJi*qgJQR zA6r#K!`$7%njA-KV`T~F!W@#>H6cL<+Z@Wt2J#{3V1qd+ljx7P3ZmzV>t(- z4PR~@0NI+lEb1w+`*c`HUdom`lASWa8Zlgs$g{3Q5ctwkt`i~ws4y;z&zA^MhF;sJ z)cpD*Q; zslPT@@<}fI-o&!HA&_ffAFfBWC@pakKtwzRj#PO+jlG>;N>-<=|H|G^Mn}2UoSklq zJ{%1x1On~iNv~0h05OJK`YSeR?cd1B41iBm)HrRFfvCUItb6Eyq@$$H+@Z9}N zpTAui1&42ffN*{bE4C7GunIG%$NFKH3TjM`=D_mR4#3}R1PLMWBw-N%+bYU+(nOwG z4bw7LEwAd=KN-%Z$9zuY%|p{y5tr38S)W0dw8L2@6dG8}-p3C};bMoP!bzI2V@%;- zN18|*gU=bbm$HDM(~~2xw$fn76p-321J#DLufw3@bc3SXSUuiBqgG5~jUYijg$3`2 z_woOP284%?$NZ7a3&!GnA<;2jk6o`Jnn!WI!O~G3ePcNPjnj(_zct7Y5qgsnsJm+o z@e_%{%n$B{sjRe6QC{Y96TR@nxTZjrBAtbA84r-CazGTw4pgk0=kIi@6{y=bnC*Li z>Fsl0-P;j_U4I$vyOt}ZcU1^I@{Ea2#RPZXW0p^I4r-V_fP$dY+Lm)BbkyrYnPN(t z99*hNW>Vw%0(|TE-r4olN1nF#pN-X(GEb;>#oR468hDl~I$6}kO z7ZT>%S>6zWm2%`rhfA*_DQKjLLqT%|wyIW1#jP@w+_lvhxL-m!Tl&h-Y0>LoBa$tP z^j{WOPX(=$CN@?uA%{U*E(KLl7-^%OE@ac!+ARfj!Mjrt?QWTE-UJ8lKMX;6W}(8T zpx%y2w9Cz&COa&gM5;_k4-gRYJ4SwY^_N754=uZ_P#nl8#i-S1)`z85?zJ2{*vgbZF9v?_)dYO$@XU8jbXyK+sDQ)MPS>~jQ z4sQt=7SdHTET}JLm|GK^wpbiwdGH#uMbKk?V}tK+VMXYBLg>E`1@|9XA&(&72uT{= zTiLl3jfq?EFfMpec6;1R8U|VzF)zh?_2}r&b}>l98jueZTap?+Hj+3OMJk;)NL!wP zgV0Mq^q3=6Ph!jXlx`?Rn5c3xE*Xhq$T;<3l*Tiua83Vt;>b8PV4OM`k(yfEW1I@x zJ<@x=%GE=lTYOXB855ihqdP8z0nj7lmcH&)Rar~Z#4hhpjo{U=O{ z%cKOn)PxyRLW)W)ijiTvNlc1Y&UAyc!j)2tBv=C**n0^rR*uyY9INE%f?q8bbS?T= zv?9E;`~)s_URvXV-hhC%EYUA$tC8f@=#HXyHF4C&oh$E@-4Cto-38y zJ={mYm9p**uQTQ|w&*@D5ds3%efvy-jyc_e^r#>uO&B{hPDNCMN+I7$jg&?`?ScLMc`d( zVcO3;31Pu3adw*6`WUiWc40aG=?T(0w`6I6c_GBSNze?gsJf`6S&c4u$qI+IcaSwt z9-6+su`V9W4Q0%=5Z~9N??F*Xg`fYcb+j?Q_^*h6zC2!b4oGY?DYoebyC^xmb=JhM z?*n?(*z|@?3JI}j$x#`|3GuvkC}ukUX^Fg7tf|75OeDLF#ZN1Qd3+gO1C-ejf|H}J zBpGkU&9Qi+5!h3Tu1k+w@WfAP(su%v{8p#l&)aH|j+L>2X`*GR$=Ox)L8(g-6w2HM z8Z+l+?*wZNtc|xZbI);dYw7%}fsbf`MlF|5_=4Gm4h)!_--ZKRO}pCbH@Ma>e%eoh z)&m!9z(lN7c=h_-mILHdfo6^@J=qzN?ktH5U1Leej8!!p0O#*N&fj9r-$KscQ3fh8 zijP@a&O-mNRR76K-1+t?-w_Uru12=S9^)TDVFvZ6{7rmWHy_(@Wjmp>Z1lRe!Nh*) zxk0{HEov}1+`Wc<;S*^RGoHUE6Yi`ST^d>Hm+j?4RgL^@gpPNdLH2qcfk4Pq%5L*? zlo*D(^z%iTPA3v=n4DwJ9c$f#HGd=g`yjD3(~bX{DswyRz{VNfsqoI-j3QWZ$PZeGTndsv}-)o4Keq|Uo_Ea8<> zCpW_wncWrEnh_i=+>Wf4TRNFAk@4wh*6tL zWmds|?7Bb$J_TnEksf83=@KV=+;sESo^boG=(o*pQVMa5a>wNPIw*1(n!NkY+5L_y z_ZlhE@BNgK9=_6MLr3?RCKW!-^GR;slI9mgE5~0t{Dx{x?OM-EvXMiE4fr93*rF;; zFskXI$t3BL)_9JNPcoXX++k;WT8KI~wcz_DT;2@avk_lxbl}dvueS<1x82b{+A@F8M?4^3AAp_7Q zd&qK<6J^PI>1@B>XF^)#DfQPW`Uoq$!#One?3oxpMAR+ARo&_NoTs{;>XjTBgI0}F zA_FE9O)cIxeXW_-P8cQ~ zb|GAJthUFV88DUFYWw{xz>$p$^DUCA;BsoznG)cz_^s@k)3d)AnHjjeZ)2JctQBx0 z;rl39_q7@$!0mCiNk-f`tELWz26EkzPlWVR4Jeyy1VcGdjw_wRD&X3LSoRp5;cHZm z?+VZi>Nwr`&-#fd1NfJsSCnVOp0N&e*HkWzPVF}~zk5Nt7OhvN*>}JV6J3%%b)BTr z6SB?@?Cy}YeOx~9{-dGDFqT$${ekop{8(WA`-bAb?8*5*dt@gk2Xh1G|K;_KR@Qb! zQAYijC~lJAq#?m#=7-FSn$Uy{CY(ShMzlJI9`uI_HCdd~T5zGrk}-dgtmo?&AHO|~ zj-37)dTN{7K_8ot_7^Ok)&#=e&1aKkR7qwl^u@ruHLpS1X~AVyT?CqVfl34AK#C%| zp)KQyOv*Vl;o;lZnNl;Wrg9#sVktnk1_s~P@=a>>Do?qI>R~%cD!N8YnKRC0w!WGH ztoR^8=QTpP7Oyn)@*(}mY)cD{dWn(DKcP@haw40&nw7Wa4}-a~6+!bVCI;9j)vTnF zrxLX#n(Vxd9>6raL2Ra%Qb9B*a)E8#HsfgA;q6$is_Z=7|qJ2TQkjhY6VMKH6^DVDmkOjC7i=(YE);pUN7ZDliYWd zM^TnC)vvDuR^Aj#h$WZ44$Xe^<}DF5eEsxK8xW7HAiK( z+ky^i<`LXLt#qFU#5U~t9h|pUz2)P~3sz0dG%qa4-}I&`Cc&Qp@s{L*kv;|rBymrE zm;)?ZlI+>+7H8l1jDmcwAoLqWBdxOYiP_SIBZft_Vrr5?jL(CLx&D0;twhRQIZC~T z1Z%5CrY*7Za*G=FT({X&Hiy0I*|!F7nRAj5gVYk9#9ES9ywMVtUbqv$JUGsuFVgo^ zWEPn6Yqh_#HPW>$qPbuY5f5GNuR0_z5oAP%Kp%JvJW($lqO@*k!j<};9V}5GtAoZs z@?Oh_?U^!=lOr?j1?)`Xl)6FM3m)RSwSkLd!vfIS7qyHmKpdusvHm z@F;$Z!N#4~;aS7z92!yXz`f1^Nze-f*hL%Aqml=%|2gE*L)+G;pc_zrj=LH5{u{S| z#k1?q1F{!}zF+KYOlZZ+l#m z3!&iKCG|q2&|Ld;;6Bn{G0^PmLAW4UZBgRVA(lIM8vJ!;8`?aY8XB@U4$Bv?OUbNv z1?1mm{Vzf&tI??>bD%o6l-W1oq;;VxavHS~1xRlf!YM*r@q)Rcwkfu|c#6-(p&qvR z`%J>8*`W+hue*5IHKWTv2xcbOmxxR+=~>&f#!9mRmX?Lqgv}$;Fj3mxSMSZF(xhk_ z2V_0Nh$om$QMtMLoIvqBvrCa4o@OhP>{RxVsKh!W%fKafIt=UvM zZj}eW@IfIFeG#|u`w+euRQesKyX&*#V#1VopR=BG?*Gobci|mBW&8S`qx-RXjfN^b zxbKeWv*6s?pFHdT63ySV|cU~4c%wg-y=XF1FN}Jqb0TDUZ=7vMLr$d zO#1WIzM3mV=9mp^x)7td=}OO(gO~(Ix)7f4xL_E5A!bD_EIy=1iYu8NVVr1T4Wr#& zeh`)CW5{8!pih--jg7eJvr={aSi^;>P+=aGO6B(nk6gi(Ek3S zJ!_q$Ew%Q$6&Zk%1b=LBI}$rIy^aWbW@e4X%=}m@8f;jl3}+3DfB-LR+`w^`UH>R| zan#6H9V8C3qese9{tLbeLNB5R=zMd4$QuE2JrjIpFej|J$l!D=Wmk(eJ?BC#wt(Fi z0`2_USz{+scBmonhb;|T63!@ra>{OKnjT%F@1p%N3Q*ww%~cyTLF#2F3}Z-&F>&Oi z0SEKp0_xeYwhGqQQX=ZPVmzFlo`x?S?nIfAtrX5|ND`EsUi}IHF(^TiyQ%+vtS@x)zB;COO}utR^VA1b6ohbkIcTh z?OD;Li@)E}%e>CTbd&O)j1Xa>S-Ja)g8Bz+?HihsYY{YrtrQniN(WbynJ)GBC1cY~ z9w09O+e-axi^w8Ljo(Am80UIhL9DN_LpbkF((doW1NglWLE(HN3d4>>YdPD8-l$`> z1BHWj*m~6T-NJd(m&Gdh_-|7|BO0k$c|Klxe?Z2+m#EOO%pWV6UEQ6 zuoKnVS1Mv}!m^DJU|M+sW#wHEpD{#|t#yz!LXzg;81{g~V3}Wbn+fs4kjFeHxcp^qH z8-?-}+P7%7+_7%}elYz(E@yJ=a7|`|GC8$#w=UJa(>BSaj{etL6RQY8%e}l!iYQn& z+$?+z_q3ZDtGRiHWah8j#*GK>gzerDtGT34rp!-a#+8tsfm8O8Q@18xiecH6t2UF3 z-jSTBApg)eu7C}mwbzz+uE#%E-8ghgmSs_f(8hTskB-7G9ap1g_Ceg>vtI;|-v7BH zbX-!)H-cw=#&Ew!TQ>C2%zU|8KS5AGO$E>$Q9f1PUqAo{pS}+f1LKWggdbDhb_uPe zj$KX+Hi^~h5RBK>UHlzq{M3-Q0>8_Fs{^iD#Tg$ldB&y%NWE4 z=&~(L9$N};wL`UST=Rt}gq;Qb8w&8kOT7W{f^NM9eAJO69o;)kCH9&~uNZTE=pS6% zu<2^PMpEK;?03iT+|cws~!b*<)(?31U0KN9fN-5ZO~l@_~j| z{IUOn-TvBXat+z-9c11Z8GK#x1j5Q^ggGMLZZi_DV2HD0*6OSS*_8w zEl8qXox%l~xjJy_;*Np6)$Dnw6KOIM+is#fYA@`#h!%mBUj|?ftf^exz+r}w0;4YJ zih#3%?UmW_Y$!F?rBR>Vr{4h0_hI_n=;g(XT&REyrT#>O> zBJ?n8e{!6IWuwMXX6kB%<2c19J9NB}*XOg$%NzDP&!+g*U2CEJbPmAbKTneJn6_$K zAox<6M0;C7i!2|eFv6#wwDkk9`3n*|irg7i>lVBINCzvDVm7T=CHwHa?6Vx>obDBm ztpsDM9F9t>MWTPCa&Mi)cAm9Jr)#<#eWq>cMI;WvI_eWrlc-$*6Fnb@eoE6pq;XHO zK2EAyV%wvV(o+)2R4If8N6Su`+(h*){{qclk+ErL=A{UMnzO!;O^}iR&Phptu zc1f+-V`|ucL|5ZAW{5Pe8;D4<9Q!v*5 z-}`u~y&?2ag`ZzC8xCnR4-{C(60`&`Xn{a?d;RdU@udagEd-G9k&&fjOU1yoyoKi0`a7;b9hJhx*<73<~`o&PXzhXkl)_&$*x6b z>)-Nb_&?>Ta|6DVEd0h|?*nrYibnCzrf&_D4GoEqu&r(ggz|_EaU}pD^7NZKL?4JH zv~RCs0V3&Lep`i~AE3O$JBHG{(+DHCw?4f7xng}nd~^qikQq{asDZL13S)D#6lFzu5scIYJ4)la()@5FiwbpV0VGKtSYVPA9g{(LC*7MfvLkz#|MT2f z$qNk3RIYB`$R{yd?@pOi*ZPiylrK>t$M}X5FKc?HWR5E|&yj*XHsGG3%`X7v^MlZb z0nD=e%Gt*UN>^l#650aFm4ZK#LQQsV0#d`|W}^Ix3eu5e$qp^QmNoq_u-Pkcj4gvY zrq_~uq?uHb?bVrCAoBxLOV*f8(GCPmle{fHAQRSysk>D{PFDC^*vU43M+Mr3X!8>E zAAesq>ZWiXEA&;#4leXnu^tx~7r7bzi;Ty%Xx}F)_n$smXxyR>+yXr|Fa(qVFcNGQ|}LsFK#e8%#Up!x11ic zo79gR+b>3A&tT}k60?@5T{esh5Lmu}X|K`&TLnAT&|iXmTuC>yk8eB?e`Wh1d~jBs zutsmOXv#&J^*%lX1APxdzwcteztd7~$iTmA@&4}QVtp`a{LNMTrz>|;jMs8si}?Zr zBNBtnZGJbn8w|VZ1b!=6Noi>jNo84zs!C0ZB9_GvhRtoW`63=jh8Bevy7qvC0ufvM z@wONamKY){^eYlW3U9hs)lHx;C^0k!FNB^7{|*)Jr#wE07m6UF2)3s{lrTshkjMtCZrs!pHFm(_g&h-s;H z&P0Zjl&34RW2G~7RkSozqI>=B#_!hs#p))a2((M-;{+=uChA7h?#3H_q|s@L${Z!` zQecKL!wQKAsuEPyRK-of@%7h3HS10Wm`Vxsq?IRfO$|*IZFQ}=!Zs8A*nG4h78Vp` z;Z;ZwDspl;<;5hrk%p=)|FR4&jDd&-iKu;|y5hz5@p(qC5sYQ@RBBAkF0rMMy#YP; zi@)y1&4H2<;}&%WbH!9o+X7J)R$8|L#98abmX?Ko+MzM%C@WnYhYXwYkTbbjG0hq3 zI-RVYZw9l59L=*r_qvir@3Ezr)I7mW#Fq+;Q7S4ZF`X_PUgXm>qVJXe<$Bnv7(6DX z&=eq*((By;)iY`p&NmsI<>0zNSFP%IJlu(*i zyoEU)G{bwU%kv+GH`jR`MGdG1dQ9te%c~b)4I!1vV=5>sM@Ff2jasujS>NQwjv`g0 zF(|>Q+FMt%8Cn5}U??vot)!?D)TZ4>S{`+7j?46!Lh+KkP>Xgi46Vf|}aLWfgV(PS;IDr$)cp(u>xGCx%2fu_WusTp#oqS7fdNnLQL z)07tZ0{m?%vO;Rsx!u4s)v1n=SW?GJp-?6YUijzXz0jFJ9G3>cRh+D(w6ufuy1ui$ zgM*$bCk@Mqrw?6{v@d56x>(R8VIT*){_W0ybrfNcz)AEaKvFIHpqCYX#}R2cu_+>! z0RaEePcbY@qL|fvMbHmr#L;Tji`mipmNidFpP#{_hc|Qu4f?UYbfsUr#`o5TmW-3+ zn%g>xtb{nm{<5<%R#{COXr)6LCo_YvNAAm37CoZl3A^2qV&SQ%C<=I26SK~ace_@< z4=)`9tGF8%uRtQpe(j0nTEKqs1x^WI!%eXSLdB|z#Et6FKhRAMA&unw5m!(vTQ8=> zby(6C4bO0ZtpGtqwoAf~kX6vcug|(LytJ-@SQK|o+O=8O$r+@A=(?@%mbDva1SwH0 zdn%pZ>!_5ytWvr8X$~V?C{EnHuD3O1Gr;$bFwa~64g|qao$Vh!pZ0{E?EQGJ7s3g&g-%y2< zPPPy-YSD0$y3J~UREl;Vv*?HI5?k574Y#F#+gQ`HW>|PIIj1_cz~>yot1QIs$~g z>c*EJ4eNKvR(H?7W_PHuyPd8SX$($px~LM1KGDnkD8@T@s> zrF!6;^j#wSCpkCB0pk>9a&2>{QF(f4eZKUon&9uTeOqj+5a92KheT^*Fc`{7sYxp_ zWh#-am+{Ah3SVe-&*T3?f#5BrF6kncQk8tR<+hFfBn z(L(}FPD0vl@|q)B3nUUE11rgGIdk#`R{${*dwarxiMsjj2W5hf#RGTRD83{hh*GYk z8Ed^_+}#GNUPV|oX#kpiT{4&3{3phGI=ENOX%Uhd4tp6eU_6hpGW}c7rZC)Masi)H z;|_XcjPQu$01h@fZT_IQRl!n8)hs9EZa+HqA6U86?WnJqYOUrnWI} zv#{^*cawUM#d##FqM;b$SEYxzA#j66H==VJs9w-M(9-FLmY}?+68RgHiNU|k512Fr z!6vuAWCaMRQO2NtD^JINGDx-!^bRjL=@l+$!mq^*9ip)tr_cw_Ap0PNX3cB2bEVX& z%_82Wh#`iPM;7WVzwAmc8x)+`X`(h*Cu@o?Me&PHAOl$yiXo4Mh}8>K)X}&QHUx+j zOoPR?Nzkx{OLM_ix-rfgFs)HXW(Q@Xm^Uryp)or`B8Q58gojCAQdu?FW`(!yO<<%* z+dtYcePUYWJV9jk@l{#LJFAP^Tc;CZ&H0wSLuYd5?5-Y2xW*fKJU~;XHYsSzOe~^5 zBE9c0e@yxil%)GlN0ZD8567p?Xa}U&31LebMNmtE3bzdDnAECWs6S!Qpwph z+47oIYvTUad}@BQ@~@}Sf|m>uqCH#UyZ51vAMwyAz?Q6A#j&b6k%6lnxJBV9n-Cqi zJ~34*C_OO_Hx#ms>>kz;Z5%R~X~dwO3k6-$Xn|kbuX`IZaBYl6fA`x{b$62dyTuom5`(v*(NR?Xvm$SnGBgP%XC&Vi@*eG={F6WPWC=_n2sHA2B5WWDZ zA<@SOouX*hp{8Gdz51NO9#}vXTw#n>6NXtGJa3LmF`fn&^SNEPF z{a9BqG{_RhXBNJ+*u{dW_mHXvwb?YYR27?eq^g>IQm-+E+{xkpcR05L z8kX~uq_K02Jl~>{oT^5NYf(|l5K>p*_0-I<#bEs#3^rbjyteAMf{rFrxddE?qz7oX zNE=#oiE18j=+@K`d}}6Sl+FOTV5*7>o+g9HKREGbPg0C>Z5x>5U^OQ@XXjhSbzP;- zH{ZXeXO-Ey+A2&v5l>|g4T>04$9ZeGWv1cI*)pL>SK|Kv96VVKMpaU2D#&U3bc&q; z9+>ZSZgYgqeRI{#-phP>+}J=c8O_SH(3P?3nuDr_6`O)6p)$xROL^`r^^^ZVakNl& zmuf<5uMpn*cn4Ed-N-16ibQ0^p))jnDrm=L17$ofVFjvTwfQZ-;_ilzsB^eft$X5h z`hjplK|W^O>XMm|D+pweTrNStML$Wd3LL^KHr<%R3E!(nzKR<}3znN00kCGl>kk8M za@AJ2SWVJJ)4G!yvb}}u3eC)HhM1GR%HD(B@!z!}#BDs5cQhNVSAlG={?hw%Mr;We zucn2StD{N>i_@vP{#!Zs{l1j58tR|Ee{*s4Tf){fA7w3Vqm#e;r;*%KO6BFGJHL?l z`VytYNu#Twh3YaL#3e+(3uvQ#Ej-YQL-F^2>hiR3G z^wvHVbph_nN9!Ec>252lN$L8G?QL_(-^D-{niex;rsjM(qW+js?$Z#uDpJS(prMd< zs&~q&W;EAXlADU9=&_D$n016j>2%u2S#{)e)c1xJ|D}_4E4pcL$o!4O{lmF?1IN2J znpookkyl~SwEew$7b<n?%!g|>x$_fG%2)Jm4ZQa6LvV71^BH`RrPIR%@OeD@DR_p->)8E*dYyjCbKKM`ngi+MY=z5Y zwLCBfq`O-6V>onL7E~f=X&|>+FRA_qO3?yXKI>y7FRdZcXk}0?{fJf+Y-s_Zrfve+ zGsg_Z8nzhix1)lW;(?!{VUKDRVBG|Aw(+)*G625{kI*Nx z3Wv~Jh{+qWyMF`94Mo?F>jv`F?|DP*1v%44c7yB%Ufcg&cOiSj=`fkePH0wAgyGeG3F!zsdZ3|o=Cw1#OMwTb8g}9KS%Gssfo8k zj6JwLV3$WwV+pYb_q{f859PHLI+ z+qP}nPCB-2+crCP(y_kSwr$(??f;JMo&1BdPt_ir(WzCd)_(W%Kw5}lY9Uy`CDc{_ zD!4I*Bol)&B?wD!^bn4%Mjkh`WQ1^|HVjejpE`6bt0n! z4M=PLHGhG5V`g0-D`8|C>WY28fw2V;%cKpdM5~ie9y)j=7lf`Eb;+K`&7P#^G;QP5 zGz@{LV_j+p)bRGUC@R$o#)WKftKyRT7d0%Z9T*s&v;j* zTu-MKo9_PFFfW+RkQE`E)8ykeHH4u$A^=>n#=Hv`B^igX1X%e(b42ozzYd46I=6&1 zRY6%5%0Ly_@8Q0bLl9gJ-v?c26G9%eNvZXB9hW0unP%ta^+mXBRY<6*uzWnjlZVJz zoXBk89aq4)vbFyr#)ap=z398N`iTS#)CpX2$+PS2<=6Uc_ zPBff)Q0}8r;gj7qnC0sL`nEp2*=8w#AJiLX?3JQdbGXMc@LD&CNxl4Rq^o!-AM|@; zjRV&OI7h>EUG!7H)~jC%9-Km*-mSeGZ0F>AF9aNHQG1mrc!klD{^3xu+8)nUdJu9a-YK;>R5o=z#3I<5a8LcruS%ZVz z3E?_lLv^Fb8pmE`eJ0JC-Zo=d?RfnTm@*+S9wX4i;u$=4N}f81tRiVyqv8#x+wIc) zHDeC*=Ab?%(Ma8F(;^6D7vfe0L(f7m5zJpjGf*;vE~K9p%_*QAIHuxdE@@gC%X!%r0piQ>2Dr%amm$C1`0|0<@xE0|Zn^;FbyPII*m0@CI6WFMD zH8CI1!y3~*B2Led$os7@F~Po62syImn3bP%RR$|6kaRRz*E4ZmaX;aaM?KS}6_ zelobmzmd0TYzm5dHMoa7Hh^Zt<>(0zg8|c**C}A8QWss9-LIoaLx81Shw8eQ(+O`< zFRupdRiicV#ErR5;w5Y~2~URrI1S2*$n^qw9l@vXq!07dC`W&bxC6kw8X654_azz{ z4Pkj8h8rICNZo)_8es~;bivH)qYe4AVV-R8HluFY-KaJvmJg)cVRH@B2P!Y2J<@d} zX-+|2gLL5p8sN&OIT}>m;H++~9iMc{I5A3qr|q6P=y~)s=|+*2v`cbEYQY>2a0ho#*KN$o$FCjdYmmVLgqTJvv5xFPv?NXuyvG6)1zm_eFmYLF zybctwUYv_SBLWt2XrLmVeVtoEhqHZ#mNMN~?FK$D#oz?25C4+N7Q`L|u#Qdjo^M*m z;EZ*>O{Q~#lWkbwgl3pn&?~~qdfoU_MfMXLIi&my!ra{RbGqDKb@Ghb9WF^l z@zwUcJUbD`9Qeank^u$dT9^0;Y76_66jOudpUbC4(v?tz%Q<&M* zFC4Eri~5l-(Cb_>yFu*goTLW*1&OS#NVqC z)-$S1?;>FE;~AYP!KGNUi_oFQpgDjZ`_gKaL4V$4Y;H>*2x!kir0VWrxA?Y)1?v2 z+@omt5lyNvJoGXH>W~#*%WJc3Et- zFQVMbL1=_Pdp3L8U_9eF8XGC^}=a4$D$(aHzEISl73sAoNUV$N8Id2w>aaL zdX|xm%<^xRRAl-j8K$lpxaqBqQPgSp40VJpVNdz6LR8DVf1w7H(i5JzMhIj^*$rS8 zTnd3JgkvEu!>l6CS?5#8& z!)~5|*qz-V0ok;B$+S&yPBJU`JDYnBPwLanFtA+sGhWc3%|Q50xDXFSFT=P%3)uK$ z+da~4c(dDQ#&q`p>}{kp!p@g7s_LxH1k+f&d87}c%+YE2Z9x@B zJ8bY9q#H5882Q7$zy^bX>8Wr^5taVXNS&zx#s?ZMI~yxxTSZOJEacZ@*a@B6Yh>Th`csh&gY z*O%AtUk4DJe;xb)l1C>I&!0MTXgga>+gbXAaYqgg%`=weFC6Nl|Th`EVz#_v#j6Lur?$iN?Lm=N`7PY=6O_57Yb*f>J&7OClb zY5Vl^B=Qe<#PbGe@3V2~9_@`ajx_0?uYq*(O`2bWj}NvR53wCco@*yYVNcFF?T>T>x;{&P+L2(Db(fYp!D7dc32#|V4xK(eQS;O>a( zu8I0m`dho5GlWi3xmBN$prmxd(IT`Q`F;^nw4JMP0_om`OZeYda{d!Crvv5WFMgR6??eee=R$xZ1y4;hu#s z4yBKc$RV_x+Spa71sBUCJ@Cc5VZDR8HX<-yzE zPr=K7c#KwFgzAvIgolxw!~#lxmTJoSe90h zWyzPtv4YxX7Di-B06P=JOJS6usmv;;_M<7U)u1$q-bQHF2Hsg`{pd6a6uX9gItiKK zAx%~O%gS(1i_yWt{c}U)b-a2?e?D08MiO+>C6O1zIMG0qe9otwDzGyxC@Fbl&3_BX zzvT_8FW}mgiW*xZJ%YTyfVE3s1U`i>x8MAqPzP6PO|pRX|G|3Qq9|>>lM` z(Q`w_F;KdFj_@-*0Lp>?hCN>~C(0Foz{2ff_y%ziZ(B+2f%W`EJMGgKdiqs1$pD2h z%8fmXszZ4~L+1}Vu&E%^??7J1QC@>S2I_8>m9wG3(_tfov&(}04)&}70F7mzrtPms zEDJ_70so#w{B3>vkW!Pt`D2|DHk$yGMhO?#&8ROZATL-wmzqx1Wk9SjsieFep6%F> zbnkZ;nR*=FlEbGn|pyW(ar`#{>zCAfR$j;$ zEW@PB!?Tn`SV=h7$UK}xE;9z|2fEvlnJ zwD%Nq+E8R3=H%pU>NpnX|FgfNLLhUZ;bjx7%8Ui5w15= zl9?wbHD*z=Qngv2Oj{Q|X5-aT4t1pL|G<;Y1t}A+a}iCNQ4}J0b>l^df`SyuGgB>? zD3?~qHz=1<$vc7S>=qwW6frlm>4371WBg@amv4;2h^fiQuNjcnazyu!_dB>52geeYJ@C{ zq+$@40Szs16DT_EQKbJ2yHKL?S zht_z>h)bJT-kfF-+6}-NoWt<1=hYpmL9bjxuMgWIpEg2>;9hJqujkvhd9LCN@1mVH zt&N6R9WjFb5Y`#&M!(?1NOuycI^lQZQ$Wu03~LQ^mtbfpYfTIvlJiMv&BTbR_K7M# zaUSgP$ZQQ|Kx!$R?uxAy+|1mkUu@%<#jzEvb*9)M#2038=CDUZcrd^F3iAl+A;~=? zD57|;UY+nqR=C?4YWz&_kSC2i5!1d4;)LGu#JnNXL-rk-FlzD;lSQeGBKAo)^a=D3 zp+&ZjY8=$wC%yx;Ds_^a5BU#PL+*sW;_dt11-t@P_)zL$5JcJ!QtW%*)xSdR?I7(? z@+T|%(4!2dGmH6<1@CLG>G@D}MBSJo+y%o%6PR|tO5s!ZrHTyNI~Bj`$|FJ?nH1Qu z)IID{w*LCky4SG94ACp23qt3G`cWRq9Pk_@ev8ap+>J&8!L4P7_rP#gvEgDeXK^TNWERl!v5ew(EwBl{Qt7vMm{g$S*pU*xI5X2il)%G<`rh=K`i#I|>kp$r zLBfyLGrw~$P#>+w)TNHI70fW|VCIrYw2zQa*C87To7<}Qw+9@$CNvOOFcKjMA-?(u zXCx(LLUSX!l8o!3;X$-GF&Ymtd4Vcuy$LKhJt2s6u^6ttC;v!Ej!KCKo6%{XV6#q( ztq#ZoEe{kk&*l>~iaSps=FlR#_iQgk8aB#j^wlv){;v4+bg6kqtjg&IT|O$>u^1l>a2?qGXRKl%y&(|G|=2wR9-vr8BdAJh9$br8wKrP}iu%qUIyj1W1+Gg4IUHq#1 zli~9Ugv7l&*Pbt*f3*=oO^jMBgO(V!2&IIOCoxB*#M)lUU^rotxWdlE4|UF7WQ69$ zcUgr}o_jM)zmeA6;F3?hqq^SMpxntsCARg)fWjuoCY8Z}tx|HCEFbXNDxWXra=%B_ zUgYh;Y!(9h#}vyVVNs;vJgcO=P$d{a_fYNo27bX^$029%BzS z?WXRN-42H3YEsUps=-c8PID}sOLN?WCkN7khU1>rw1Z5dg(9fW0f4s&rXu17aGy*% z7+mA(dIr&=;`)nYp`=GYm*2TLU7(ZZjdy#ycHZ#iDs;I}{d5_3NYjblDsC*zw~^sf z63)G5jmqBIg?$Kw_ z{AzLkg<7j-C7n8FYJOj0Hy zHdWSrv*EJJIzKtbG)sH7GZ`>5?L;Pte7P?BBGuUWD=SjYw$2w+3fZcRS}G&bCt;07 zU}9_?G{?yj72p-~%Tj*XtXf7 zW#=|_=}>K{py)Fyk!RiR-Xi4F9v<#}kXKCOmUqlvx`J zQi+sZiBzKW!PTHZg{mmEoC!W!RZ0|FZ3-h&^>Qn~Z-?8&s&NIs&It{X#LT~_@tr`^ zk36R>IR; z1}LhRdu2LO5>BfwS8vkr%{FI}k5Ld2#xPbpzbx6Z<-!hvLxd;DM9H1UoMn|L%0euc zX*rGEcRlib_{4c>xsY3}?3rqmC=%&XEHFoRF`Dz%&jy>lsk{Equ^)hNsg%4Xp_D3l zSdku~X$y9Q3Vc-6IWZKv>P=_&0f@ij)-$0gYXlZyPFyl=-l=7d)%)>4_x+CUY~+XT zz3|r;y9-ePoNb8-x9uhjl&u8?8B33x?*T;{zzzqlj>qe^c1qkF$poZ5EYe^MsCblg zG-+&Bs#Fjo6TFQX&ubhOlN8V8YCWGOJ+ej{9d(S5mvWSU_(0-QhOa8bYICG@|WB08Nb}cW57NU;J z2~nF6qVdQHl1BmF6z7Q14X>YL9Lc5 ziLFPoW^dy#^ON5b-CrwrYA503_T{MUlgE?)2WbIeG&+Qy0X@>G+ToCUPEU{6YeHs- zuuU%}B|S3v5Uo&0kBS_ zu;pI-uA@`R$+MC5NIjGE!W6Jc)-eiUs_>R@N#{P{^HzsTO^}FksN$67qoqD(en|aR z)rq*1K6-M9cJJv~?IUD2{8)XD=2^?DyUn040&PDoapZju^~QhvDcDUZkWxDlf5>xh z3@ebRKk+lJe^}DKfqhePbYA}{zEiM>E>sgqR$RV}&D z?D?la&7xGj`mL#vwFjUsvk0)FTG!S3>(*mtU2BQ8j-ZwHT#3HOMyDOWuzoJ3MZu?X zQN^&-eoE6^^NvkdykhD39;(IRTfMBiQ}wiHzvy-LulPLSX%T$!SJ!@5Ei3p7@u>St zUDW!Q!p-(9#x3;BfuHqQkKoAS*c4lcz)Iklxh#j_=r$*c=d!P#7R54wTN=kIt#cX| zvTtWp%P~eZqr^hn7S;>Xu&NXJ0NB@Bb+U|fO5`}$tyyBVn>B~K)@=^_u1pS)sz*I^ zXxMXCjxp^m$c8brD(={Z{b!G{W7m0;t;;gT)sA zeX5sv<+Y7+%X7@+=hObEG#?%NT)8+00{W{K)iY_DmX5h?W7~vy7CzJ6(mdnU&99fI z*VaOzJm3@ym5grdR1+U*zlVU6kscT~zBHT~z8` z;Z)h)$}O_Llaug@bS%3^x#iTVZyah@>)v!oZd_`YZS88;ZXI?Ab*#B31D1Z*eoeH< zbPTmmgrrd!3oGf2EzT|xcOttWqnH}QQ_G?#rUSSozzFXrC$lyvR> z$bPi^$Xtp2w5-c~=QX7t2zrxE*LGp2mv*7AXnONqV_wC!8aKBbfLr}U@(6iT*cCq8 zZNgr4wK89QwZ5%GIKng|9Hdzh3{@}j$92emklL{fw^-$kbmjY^y&$J~ihR&t<6V8U z&NLD1`z`r3g*+!ONqsDx|NXK#BHC2>*gmhss{^-ys7_obvi`elk$P&7Qw?+BlcR}2 z`eTk=tD{ls}8zSUqicTnB&2zH^zH)l1QT)pK5ZOa&i#uy710I&jO2+TnXG=R=h z(4PT;iCVRBqq5DbcQ>Hao}m{xr8%9Vm!J&13Xi*l4ng(=LOz?&Ml?|9qZJ$4->4f@ zgFL#uFeqKmhAq5ck+VfMix!%ll0)-k?3Y91s|%4%P4~#kS!+Oq?rNBLtGC)OKl~9US*Rth?FpZ>`0T&pxJeC!#iSG`R5pi>JGN{5V$F_jm$K~i%+zqAa$u*eSjb(rR&5NX~ zx(a_{Sr|~b($|8Wgw_@37x%cR@um?{E@Xm=>Fk8Cyfw`;GZu3SQ{nuF;n+5h6wY&81xPWGWkNfTs$KE zOV{=6M6$;B*)%pGi@IPGFxs-l<360h*JZZlMz+hCOG`@T7}%WG_(%KPwV#H2b^;$j z^Nn51NDhO1IhnyL)mO4Q^Zf8~+O}lc`U)ll^|T6AYL8ULAfh?gOp6zV>qpL`3%+Ae2#J6o|2E4tb47w0+s0UN38!hgT=CNv(hr6kK6qS)T3;92^hqwi9=<$}voy|MMa zVP*L8@RdN09h|jf}aBd)?I1?lp=Y@{hfEBjN|59qSPw(M@ zji>d?y`SXmJAct;=acwxFt{e(G7Db4Qb+pzXr$;=1->d=)hcN`(i3y<^u#+Hz~i-` z(6k~90rW*V`$V5m?jCBw2PVXa!F}q9IN#A{)yj(t-Pt>bBe|_uZYxh=S2nQFVEhH@LZq7N=T^Y_!8!|X4d1~3zW!}I^Tu1xIJc?8tyA9U?siFd-=Li0$@W8mb?{|;at4m7woo#r95FL7C;CACi!?zH_tJx%%3vZaI~MreDeQD&Ds1H+%+ubq zvbyu|=KF!?UNE~8b-PoA*rE>Y;*08}acAJ@kGMWn1lT^!Qe}LCu|Z%6W)a51UAes_ zVHe=DwiE;<{-aNlzP!IKO1QjFa)!`JC!de zggZZ}IV5&tFP~W(bm>9-J~Jmt&I_LOrQa;d3!n7m=PlL;@_vHZ`}IX^avPo4w$cym zi}!GmUgz-zl2%x2Zut(LR$*_l_RjWipp*JEccCfprOqzd6AQOsZ{GOGv-mnA8s-BG zPGz>d2ggcnuT=F0`RDR_<_|}a(%E+sd>iR_jWb#@^Dm@iCzCq(7KBcIolKn!I zK5ihIj2(Z(u3v|vkskpcBSoF&+aq-7bMX(D$+4rdT3|(fIxXc$>1wc1G?8Dh$9}n8 zyUdI{1X+@xUIj@4ly93wU^&;}TM!D@fT#Joz5DR`Uk%Q-be{1R0bP&I2JI52?7du8 z?EJM0q8tzldoVf~iRBUR2cd*VI`+YcerF%% zXYEcq5z8z6wf<9t^H8`Sn8+v#g_HMZ1Ym$mEP^xy^LI5}F#&hbiP8z)K;>BoBZ-Eg z@pmTyk6%d2sWu)(xxGtBGxu;X4&lf$yHLDhsd@^=crgP$rxQgsU%vc6-$%^6GUAj` z!jChl95VbXSEgKa83vW{m%qX3PLTc&Jo4iWk=PF~_dZYY4=mrK{;q}(!n}XD;X6O& zEP|-OZlGKg{5+JEU`EiU{u#<6HGHfhB3#{IAm%ZA5;i!&DCjA>dFgvyPi_55m%agi zG*l#zQ!U9$Kj!|B>`(-$?1#z#-`Xlv9@Z;vtO6GQ74uZ#hDfHDQm%3!r-ls%}`QC>v!*v&lgU#nZjD~**Ys%eawE&fW)=T%}%!O6+ zC$)qd43*xPin)pc(ZFK#QN-3S1qEk&F-0r)MdkGC5OZQKdF3M`6^@`Ad=GTGH1FLu z$r`<==?A(~9RP}6#35uk?vGuf@t3^E+(h4x1eG1TM=P%U+?MIYGf$XU%4qEG38O7uZ` zcq=T%%=bYz8ZSZ~&Y%5o?}Q_SJh${}0gGdAVbvWFTRc!x!w0HN)sc`SzZ>I@Gj;ms zw))(ycrmiArspX9qYS!e@tSf`s!l1?NyyNJgdm0;43)N8ve1cA*2+x`DsG@?tGDlr z!tXS(6$Lx>MFOhvx^e*ldaab}lqO1Ue&u^mYOIsgkS+~o`kg2$%Vx?<{sK)Y8s&Q< z+KL5N{8|(5e`nh{FM+;B#kU=*oczijAn5G(C`Ql}O;ykQ4&>}K*@#pzxMd?wn*rpS z6Wd{AK;q1Q_fR?4>k3*D;e%lz#Bnkir$@yxnn7_)T|_|}QE<$0hs>~bS9yK%j9g4% zViBn?c>$ZJ!}P;1Wa0>JnU1U-^QS|0%yEY9dms2k92vfZ@P^vh11`+qHpVcAEzDtCW6l{y@mpDARDp5I-L2cL1m;;g6JD(V)!1xjO0;a?sE7^T}oa8r(Vbt#|rqmk_au_pN6n^9Ox)?0txePKJ zW56hrJo=k>A}9P_!7#34kP`7QR>{7oaZQHRB+AgRPyH$-h76LPB`x9!CfdG_aY5^7 zIr2rU*uK_*YW-9>`U|m7j}i?&8+tTF44F}Fy(+IgEs8zn#8CS1**;E)KkGE&M{MeT zLcKJzaV%>Li)oT$+NH(fSP|m2SvJWB=E=CH)H*tqwH?&c%`Pfm7Rjt8lKl4iy7SO;T1&-j4^E z#q?zt<+{0va&MA#93lm85>Ww9BxvRJEEo10_^o(!zn)bD{nab%J|*^&5AOj#i}3{A zH{_s4!*Fz}emSO939}A2DS4}5p;2%EfjURwktzFx%m);_V7T~WR?M;LB6|!}H~QP0 z$9smdla@lCy6@zvzJwi{nj-ZBUN^h{gtEqEG6{g;8i8!Ilg9|@B3`TxmOJPQL7%)k zm09DoM}jtGR*Q)CiRzDPI78~H6&3CCnql-@s*(IpP{awLzN|R?c;C?}>2l1_?yw`s zR@aq-Rj*DPk{5YTm_u{BB*v-P1ozl=;0nwI(Lk&R!OQ?J#caIq;>gA*z!zxy!$>zoHPJhs9Cu~*s<)=WL=!LKya&#WU%hK7VYWS(`8R5&I* zm&_8|`(*EN5|^seakOJ8+kpWZYq0DokS5#HnhHPL#CG!k<(tBbN7ako#!)3wPTbxhA$MzarNeWS(= ziQSPzHRLHue?yNA+t1FeLg>bR%?@xv`p()C7_j!=k@rF-_jx1_sH*hZs0f!-2vt`M zV3k6-mLg2Eebr6J1YgL(*s&k%$+G~vWdVEi%Le&pjos#Eg5+gZ+*Vr-%$Q;0GB0G> znK5p-Xm~fmiKrWaP7>l6nKjm%!Dm?lOr0m)swQn_&@=Efn%5HP*m>&F{wWpGJW)Gl zFZ*joUZ%|GJGLf`-7~i|g4c4c*uCr0@4iacvV5(c4Fxg`n|JNPNiD*^+yqA4c}W|7 zDvAcy5)OoE%e%Lw2%Z`ZtF+Ac-Qf4Tm0LfM-qnSc7=K^6&-$+A6;3=;xPFeH{$q*j z2)%URfI!X_rj_$|-?1B_td^a7D2LZvYSyZ`w$5$=W(%+30)t(?gRsqBfU7vlHh?+* zJjuv#<>C#N*83)OA+*oFlt30&r|bky<98eHc;o1lwL?P!npSrkTvyO^u#~J`AA8I4 zT0W#tKtgxFje^~63NZuvpBAPIe!nK)=r zAN}g3!(l5hfAg3$Rr^Ej{qbW8*R#Y9;DSe1QnZ>5Qkh(Agk-A4OKhV;oQlFz{q?^q)-UFnEX|@rh|#r`FQkC zJ2{P>o$1w_*eHhQ?fgs3tpgz1v(PR!g?{CxJ6sboTIPn*=MNNTUiy)aDOh<2@m$oB zsJ8FhOvA>|xS|&^GqL&0y6h?h0h(#sMLto`b22qQtCG;5Ch{%hw^dVO#ko!%Rm7h@ zwIh((rlZGNY_A7C#0?2sK5gH$5n5LOzy!A3*z!2N?tZnI@aFg=mX2Zbn8D<+&}P)qNLPQ>}i=z{7t^!Ch)e1U&w;_3a2gR$%k z!S%;Slv*{tR9(n_@46N{vE?N;u^;}Nerx|8ReV<#M0fculPaQw`Wtg-56FWg9bC;S zdhJV88$JVqDB6waOa$-jqqjIXt`sxwXyy{b{(f7GzYh&w25eqh3krWR>o69Xs049r_md?*xZi{0C}Um#V!uR| zchSZfNP7kUEW~%1xVeA%`y!0WZ0a~MA?2F!T)}y6l&T^RnHJ>xQZo(WKNyVa&llk- zW;YAoA>*_5qxXzN@cT0B>A7|v9sjdUH}-?2Dc`&0(T?LJ@s7puUor61>C5egR|%#a zPS!$Q=EW7H)3lLq3l=YrseFWaExIuulm%$I^(fFeb=Z3?q?IQB^`yb>jI=>NJccRj zu|CTB%F0Cu_45mFeo)pttVWj&(X*DjQ)>h79b}V71b`RY z)VuZ>)KbJh6p-+80I<1y-~Sk=^Y%4lB$m3nG2oqxSJDyfSq{t6nLo%8CnCbAod z3dp+i7~pUZHx;-y!F3hco+8PJBZtJmlWXetU@(T>xtYjnbVF0@18#4aiP0e69SBk*ZVtd$Sr)JK9p$CbQK z75rO^y8b$zA8b#Ldy|Dw=MFu2PZto{4Xtsh4O#Z_cb9gDm~-Se+{p*}Kyx>l zL)Q)K>b^GohELf*S2x=1u67Bz34NRngz8@KmWqo9EjL@dSlKbt^~>X^u~iaS+=~dW zywn=!YQ-xy9OvpZ9hqtJt{r}Du^aW~7>Y-s`z0Irq`2r?7Xn}*T@Lq!AU1zPYiiC# z97?nAH3rC*tXUZ>*ip$0{~sVuaFU%a2d3$jw)>_bgAF_4nHBNMve#Hx{O7%XM7P#J z^Y1|b%?t$fhEm#Jf;d~S7fx!R$3B(!4C*OdK{Wo#Tdti6=hl-X-P;|@^Rx;1SC z12ykm;P4cw8JSijKi)40g~;=@+--pygAkBY#Bp@1`4^3t(pXBH;j?-0ljk4M|KOpC zZ*<_vWPyP06aE`_jQqcG$Nrx^sYK0I1xF3l&rVNDgV4UXkJxu^9Wme1*4MJ2DPX7+ zyj)O8$b2(|&IYQZwWHvuD9-OWOa3PSuV)EM&K!3ne(B5{&p$M-r}u8NgCmR01k5pm z%lrCh`^0m)?IfG`BXF0EDb_!yppX0vl( zs$;VgW5^2C8aD8pe&FmLpt&`lQ~2CFM=Mf|rsmzjsiI=*E!N^X(lm@kjM84flMLJU zc?&IKF|4zK`99uWFtyS`^QXB=-Kr^>I!mn?P^iVNKQWciSg`?XehY0$=Z zKryGi#IdKlNb_OeL5G7fq=TA>v6$zU>5-Pp%GFwaD^c?l-HpCOWAVFVLzZ~iZ>m0zvR6! zt6S-UO?N0J4p`;+tBeKjICfLbbNnuIKMz~(sF$!)MBPyIdLIm zs$VmEtwHGy>O#OI(9;Fwvp_xNyKJ2`2Dm8DHGAzrSe*q1Y5LwM99Z)Bti)KzS8K&W z-RyYWV#$0$J;*g2f@am1%bDM#es

BR!B9eXnC!tQ*V2pp$n#w9Z1OJSg4Cbn}h# z&iF1L$wY7v;9VfF%{J%VQxtw?{(a5N?>yXoq-<C+Be zR~T<4nc&(R|M&B9AX?8nGm!57wyN3j5zDy+BXz*~4XLF3m?$$vM|C|R$wDud=c9~o z*_m_fUicP_{8Gj+9V3y9q%aoZuEuW#p3FQQQ|`tv&5BpNM=a(eeuQV)tRY>R)uI8q z^?@u;BwE4TNJ|zX+wSg5$9~wX(b(>!*Z)Pw9%>0KEImGthV2@jSbUl8l1r*fD24G; zR*bWF@sq%M5j&!7#MtLsRK|L6x*({qK~oQQ_^4}lXC1`o-C zV50W7wVLVk)g9$3)s>_Qjewi?yKk1-7vY+h{cM}j0)0*V7y^72p9oeSU5O50?Qjm^`Nj;hVdR0eTP+lUxh(YY_MG zgxBCLRVP8np~$JovB(f)@*L#!9F&`K2C!t@Wc8{{5z>w+9*{9*${=LHR8qx*7vO#2 zik9WU6p;_!-rkAS*CdmS(n%HO(5cE5MyMoU#EwS*`KJuxV>ZMFp88j&i6irSELjS4)?+o3{Lk( z9P_NkBMPeAn(b3?zFpX=%dO2HrornRhC8_h0&a%a zI|+;J%nis7t}XOw4z6_^5bF#~VxiQOITeS{KM9)fKp~q-X;O3|Uux#|$O;bMyrpsL z9ot|!!Ar>&8}s7O87fn5gtM^xw4u%s+02s}^9>9Oza=BM};|1OOA%T)VG zkZfM;{tsW@7^O)NWZToWZQJy z8BzD%cww4_p&m!4t)SM@OlfUO_(fxgs6D&6hz`vfj1Gal5onRvCSs`2rhC`l)leYS z?*uOV01d6CMo&|lp{=5-RL5LfVPz=E*J89=UZJs8n(%wlY?r=vRGY)xRMOLw(-4R$ z`E9~Mryr5A)yOaziUZ?>u1O2JsJX~SupFuO(nppDz+(% zOz7dBq!7M<9u4h*P6U^D{C@m_HV6VqS_+z^YluZ5OcT6|E7xC3AwxYJTbZm!L;Me+ zhS6a`gB4K;*^%mEQ4=wOb8%C_A9#@JIwM6Ns+a?6an%~uVHI>$H2HxNQ}D8>DH?_% z0Cad*iM#+O=4kSpXR>IJlt>b)FJ}aIZIZ&kK$++f*%6s)5H^xnG8$c$vWi3*YY}Zv zLsSGwe0GN#IEnNM+e)=9q%3p|0+@CtaC9QD?FBg+EBN|4IylHv-*O@r2UkF~E!>o> zgqg6iw*#-z%KYZ$C?TEI$p>8i?!JL;S^B?|eRMwY<5lg+Xga$YlhZ$EdOKH$%{`OUSphLL%-%xC zsAxOTmfX1mZ=_dyV-wd3rWsrdmTO>&=kty-NENQyHh({akczbOw27vZ41kX)v9*udz{twqj&hq^-p{Br9Ms)X-K;SXtNt z9h$G(q~B-~I^#mo%dr?vw(tJgwYg7ip$1th^8z?J5~LaqG*cot>MV?gs-R3Y+J8wz zz?4#m@~~gwBAN_|BD7p!3)5}b;2#qlnzuvqnuem3cU?6- zkB3P&W7-d0;|L|DVG@0Taw>#muwaq1_NtfE0X<{^GozsFP(}6B^>RVAG*tvIbDa({ zXj#PYpeH{hYqNis+R6Ob4>p9rQ^>_IM4?}r07JuNAd&;39N!80uWo1)XVt8i?86|I3X!}Qb+&EakUvzUd9X3TAElWtu>8;)UYntr?F$( ze@UPRYS^>j(p4m?9WZkE6mW47Kxcwl23cBETo&#&>vBdZG}VN1(%b?Lh%?U=n2WT4 zEzqU5g)^6CT9LA|ywFmOq_(JN=Hbu}4HNXQLrSaB%j>Uu?-1C~;t}4vgJKUa+0|rr zAoFHQOY^A;_(|aWfyLaFqk24F2f`wP!PmdWqUvEtT4P#rkelZ=1(dx>*ic+;iFi5@ zbIHToLPbds+-)HMOvFs~sDUNu*x-~`(L{-c%wLqS1d3kd1Je$^n=bVh5?LH9!_Kvd zVM1qpM(?bQ27y1a@<(?WoAIj1&{gEtkTar{A08)yV`TdRWU_cu)`7t|4uUA(8?z_CuwAg`*{cjuR7^s;{@Js9Q8l)o0MQ8)4(%$( zENfs}>nNapyk7d^zLKTG^yGg6lzt+tQke2H@XuZlA7OXOzHf{gAHKwy$O9fn8SE}~ zw;t>pg;;H8)v;bI4D}m6tIM(WRlnR8>#Es<)D$5pQd1`~?qAtkjzl`OD_Bu=WalKP z!IQ<4)s3AAMPwsmSCckXES(putT=DN=)#lxkKM4Uib^o>o2vzRudy{sWLIz5M=)22 zMjTswLjIZ&Xz!3T;FPiB=@X}*vneKR`}x1G38L_lj^mQeYqQsCEuo8qAB)7=9fFE4 zNpbYr$H5NO!0+qrba3&sM=-HZ4XvLY2AA2ej1-<3*!+Ou?R1@$$+Gcfefh62MUjt0 z&g~kb3&&Ul+}ive!j}fCEG$#STtHK(n)D-kSZ+h#>FtY(%I9`dGnzP86>u@d$8(}U ztVfHYmN17wvW^c~bE{@@Wc(TPt?F5iPa)EvBJnQG??1kMfr}+jPqGwOEb#9(lUp9z zN8ETaC5#Ug-zZBtz{lpaRGJp^C&ag4*{zR;fR4s3|8!0> zr>UE#FCK_KCrmfg4HE1l6dvJDutCg^63nfM03=Vi84W2E$|Kz`E)B6+G941BIOAm< zZ}F|zM9n!_&txynviYT|OOS&V*$g^k^UCp!aBwIf-%Y1t6^I7cUV{ZFpLo3{a%GBHJslFb)$UhB zZAz1=iCw2e#0`=kM9|liecL8a&d>N zyiobdnZKD-Q53GO(xReE-FasB^wvM)y46hU_baX{Us^_86LaMs1;BF#P->u9z%9mq zy-s|fC8bT3S6SM@Juw+B3K}!c7CorHS$k)U<7uDNKCrtyi$BZcQdveWzh!>VWnY=j z6p)js4(C)ow7zk3dByPVl+NE;a(Vf0@$^=Z_nm#{CMcxQh@p*-VQ@!9MeD44s) z0aaT5iY+)~m1?QqxVyF2u8NNCTk;o+a@tq{%M=3O;IHTQe>{hXd43j+EjVUO^Y0QU z-J56oilFKa)33aZe4u1|_ir!0m6j=gVSHgxT{7Qqr5x99TT;aN zQ1?BWi+lL@iKa%&NPUdy>nt7d5czN)ao2jg==pFwbF*W(&67>A3*q|e4^OLzSLi}= z921H26YdisVD}__@%z9J)Pehv8d0~G^$FaoBHR^@lr!PzCvb?WFK-{agB(LTi-i!- z1Me;xt}a%o1hz?qOE~V6vKrA}m{3&(yuT*i#JlNv#(P=q&XE`%PB;8MdL`H`#g87p zw^VVEm+yT6`bl*TZ%!G^=eqFwc$C*to?ztjQ~@WIT;Ts^XK%RTY6nsZW9g2Q#DP3* z0eh!a>L;m~rBD%7(uXS;w5#;D!^O&p#&x@Ma}*cm;XD*`Y9GW(RmSP8%TDoNRvD~gUb`TfB+g+ zS9&}_+!U$F)6F(}Ihoks#|0n+TLaC2CW+D#FfFYBm%a?Nr)hgX-TOnItLn@O{|#>8 zslA7`xYE^w9$yk`cDON0EO^&(rX8*4`szIp56TOh@^NPp&QIe8RnMSdyR#7&M!<*J z@A~*Dm}JOl$4T1 z=sbyZ%7I@7Cyy`<53j`mLzPj^wd@saK z=l+{(?;*(Me>r#%;OE4@q!jmKf}B(dV#B!`PA2AcjZ%OO19clKBKSksIzUN+$k$}GqB zIC1Jj1R#2>JoU^;&QFo>f9oOrKeaAA2%GaB&y|pqRj_5HV?p zu>z!K&<(qLAXIwh!7_X)I8vVc8ew$4JivW{+%X1UQ3PLZ{L*w&Yq~37zzuQOTf#4Z z<%=*0sK`Yk0zb#bhpTrLxCD`O<4)z(Z1Y}--nyzV7sm2P>Rt10e>>a}lHRK_X4Qt! z{sk|&1E<_I7vR)~neZT~+Pm1L-5xwP=ph3Cw4tXVqOWI-y$qU4HKy)XK-lb)!eW&1 zk|abhK;Hko`P98&^8zIV3tph7T2QCAnShjtpaQC0dod+BE_^PrKpd89w0xRb; zWf=VT$ybaM;@$_@BkzrlTY#c^sBGHEn%jb5_S&S|DilM|NRN3Y9vuA#xS3t*kfRI! zr?pI-y0mY2tGDjih_~NgKv^RML6NV*O6V~0t)`3t*%5!Z!=$CD zGmq9y8(5X3f~5)_vY|AwBgsTlh7Bc?i(Og}SV7d?T* z8a^2}qxba&(KD@hF}P@au0&X62oiGV#Yur1gJ z@5O&KBftyaPynv6^_VyVDTIA8DJe$b(gA3@^?F4nSlV_<4Zj=*4I+wwpE!P%hs`96 zPm6%ux(kX00S~O^3?AK~PJgkIKA0a~`WVAnKcjY>#5a~o7&>WkMGsP+A@(N3M=h*D zCq}I(FpzF3C4S!1QYG1qqP}W3pfsesC0EflLy#X+Q)%~ID9^@_yY@j@BSjQGQh`Cw&zsABf(2Qq!QN}SjW0DMtwPi=M9ZUmrwc#I&f4TFrt$V}hK~`td2p%bfKh2-O5GacOK39@gZ5$zDGj6Et+9k-N8BIgzLT zGs%^TtRl$dOa5vFkyE({*PW_F?7?4zsI4tY!L9Pg?M=W+*(a+j^suJEMD?rHR;rb1{#zeE`{)Dfg~PaS4oE zNl8$)U;qW-f`f&eFL_NMBQs4D>k?_aUa(XdH*O`26Ul@z@gU(Re_$YiALt%vu0x;1 zUI;7_$U+djDKWa$5TOOC<1BqwLXRf+5xOs)Qy-(I6?3W_gf+l)hp0O#fa&(E3ak)Z zRq79w1ynaCll7?sEke-WQ<-%qE3f*`J+{*dZ~ikHE%o3t#BT!LFa z)$%0er^tt=mw}rv^t=r!spkK0^-rgJ;Q?@$Hi-eSKx>J-i}n?cPSjgvtffYeM7^h{ zxPj6z7=`CTO3guCorG=_hYZq`r~dt0IiyBLhZz}IM&#%b<8xQ!w#T$s(ba8cV$1Mp zjSyxj?$16XPNVHpWZc^@W0`0vGM#pkQ?L!Yo?g32I?atQ((%IdhF^M^EtUCnnd+pV!Ox){o3=r}Z$e$<~ftgk5E0#FWPFSo$1E_^Qpo z{pkx_!QZkE@i}-`_MAzpPD7Fh+03N>pnh7M0-{RT`Y-3<{K=r2OL%x1aTrD&$4dsf zU_@zj7$#+-lSClX9s$*h%ww7G>i=fvbs z?70ID#z>vm5gYJ;iq?%q_Ei~{%zVS6eVO?rTCLIEMeM+ZJUklBEc*rv%x%VVU9(5E zXnK;#`jNEeBX6spr$v-z3DI#|nP%|Z4W5o`o7qUHM$BSLjWo%SRa6o{#_1!dO;#9< zDlJGoRaz9504{Z`lC=?ct!=s%un58H_Q&rjZ3p z???=b&KXB77l34h9fh<&qAKoQD4jJi#mHsE~-*+Yaj*sdNn2Yq4> z%n`ebUM{qC5ZXh%DkxS2=s8^LRc*0vM}+r-P;IUg9U#KWn9C7Z9M){pWMSkpH`yQp zGl6E_z%w^|9D$h0u)d}=*QXZoWRtwwi#@njC7d-djdD^yWkk}ck~LFD<_6nqKq zh}5ZVV}=kJxn{ht)FQ4ktcRT1h%lIZ3FCz_>qATdGQMD$jdLg z*^9$ykFMfBLw9}bHN^V? zH#hbYzH=A2&zB$eF52KB5QU5oakfvyq|HMsHArIAzDhKWxV0}cM*;{JA8Ourbc|dL zum1iyrR#3`SvnQF|rOXp;tI?z0P^w3~Bv}u=j|1-f=c)Kqt}%So@R13qw)TxpOJ7CSNcdE9 zkbD*O5Ob+&BW99Y2QkLq_oa_W?vn4*S4%HZ^l5g&?URJ}wN=Az4#78pnYxf;FniL8x>k?&C+zYxq_Ka6 zFn;_=EcR)uE`K!k`o%^l$Cz;DEX4WYqYW-wd^8#y`K9dPr^(2c!!IIs+o1zmBlf4> zU{L)gv=TxOMXce)O!MO3n;Uib6Bxz{e|eWsi~~|#28uVP`d!Z5*VH72d{UF&SloM$ zUORz()%R~Owr(e`xc4edx%bpD_w=(JWZ88hw?9_49CQ(MdN!bk?E8fY!sqfC!<0EZ z(0)-x1W>E@)mp?=a~O2&2PvasRBXZ>Nx`a6ajDSM*QsHFno~R0>D~2$N%80ukoGbp z_c?SYK(f>5wFzSZzfcPsb|!%GMj$*>4(w`@Vd*I;?YfeoZL5Y1P>e&qDoF<3BrDz$ zn8H3%8>bgU8S|0pVqcnt1#_@g)4&QhNi9?>wX14bC)4L4cOpx#Ow2RXxzy5rB1*H}&fTz-_Xyb==#CX68lu`G9T)B> zv7%fDqFpo(&;033J>U}+k;N#q9ZND(W@YiSH=2%I92TP7*b6Nmd+E~2@j~W97dX|@ zVVI<#NU0wPCDRd%la~F+h&hltzW);)}cm3rbLyu9w{rV@dR9lQ3YbX3L<)0;vjiOC<0&`44iImupPH-%biqE8lCR8qE++LGBms*q z%=Gu0jAUcNdG05CihWk|I%rcAX{DLOT4$d5b{gWS;nP#$ULET!$(LSg|FII$xX%&v zgv8qzpez$NXlnowGrnb0J@ZFCVxk=C67mFAqw)1~9k<)CY#Z9I3f?vzGq#TGsyb*u z{rhGUe`3^O{zLz?-ege;{0&r6VBtk1xQ(@X!#&efBS4}K<o9G z<_J=yYl5q~TOMWcu%pg8x`7WOlRRo8O;|h_)6*8evC`DZE{eg7f%a+W(yx=3q*ahM z`TCB_jzucFohiFJSAmLM9D}odTcbAf*v*s8-exL1?ILMIo4<=Q<@g#@kc0x+M=U1h z(OTERh~jk&J#Zd9kdq6mRQ<+(2N{op9Q>*0;oWGKG5&8*luYe5+{-+)L>`)-ZO)K! z5Jg|)9?_t@keH^Cz;8qa% z5}cr>Wlv<(foRmBY!yFPNb^c;8znr4_Vb`hRgBG&jy-xdaC}wQ)#~AXWh-EwTKEw5 zC6QO9r+)Wy#8>Wq{tCWVD7xD?uB`HNNc7Se6RPu{CJJ~zyZJ~RE?f3dIm+svr5W@x zESunrF|I{gw;C?V3

  • 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 K?^Y@|C7ja)#&7ow~Bt)QC4ax4JMa>hA) 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%0A7HrxpUvusa^Qp4J~Fq` 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%0Affe(4%0?Fbo*X1y;qkSoq0_Qt9#rL6HvPf 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�-HjyFYYKMf(&2XU|jGyvCr7F};(> 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

    ^rq++#yyH0pQt0d^ZZLpe=w2?9#^ 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%0DV{|nZnDI_%C3e*nhiFoM7|#rV|h>$WKEpT5;vW! z5+Pr{gV8@#`vtb~rN6wY5pd2WU3r5-NVua6KU|ldZO95Yr8su`f{>cFdfwTu z6G$ZHl7H<9kd82-+cMiS9Q`-uG{F!8Uwik_Jq+O-5||V+1oMq2Gz15~*73iQ8Iv;E zd$pn~Mfoo;4BiNPejoeeVPr%PZa>)(@hu_bbMM0$zG2s3PRufMQbyV*s!i_uL zCVPnHPwvn>^DTCjVm5q}?kBb3RT#i9gG8+4G(NXqZ*~prSa)Qq9~D^z_Jr}~jLEET zS&6&G`7>!O_hRvHIcMgiQ0w{+@FQZ0g>OQybZxjN7nh znwk9)ubvDykJ4$=g_1J8f}=Z32PbPb4JQJ27~z7`cDR5$>8z^H+UbePsqdY78aCsPtclY3jj9TrAb;0hSh<*0B9_BT2NLNPjj0OVU|SQ2LXw?RdZWiL zSi{<&_D}7`Z(J3K`9|7h_o|I-*UR3gi6By1EGo$yjSI1{34S4X``2u_rK|TU0Q+2!64mz1%Mjz(*C2E6c-8rA#YJx&N`w+V9VH zf+D|lN?pI(q>{`wSLzhmX-eSC>)0e+X(bPBIa{m3Ca{!OFOAFXgwXan1dJu~R<=(i zUAd!2+X`HHT6-g!Z9A_wIQ~!PX=HUD{e@vmCxiTHtQs`?nY!OYa;bS#HY)xA%sXD& z6NCYL0O{#5PR;?(2EgaJmi^T7tKevgoR%&iUWZikIQo(4qAayA^NAPSX>_v}5}emS zjDvRRS7c2&rjppcNJW^9!fUkACz@;jjgb1drM#r=b=oZw<{^AJyn|ZQ4`ulbLYz)DCdJKRx8 zS>EAW(f_V2r9S7}jD1)ke#hcOPjVjJS4k-sjz4pkZyH{T!pzOW%+Ujawhufc5@>N! zz}J>eU>b^Lh~8{Cqw!K+6da2U?oGhS1n_;@yt`~l19a;J%QcpYTdj&~POKT1_zfv4 zdsa>@?;NT_P+A08+7bhd@pVC@&Zn(7j= z?ZOtE3@nB6DfY9&Tw=4aD_|E-IluTVT#X6qAfE+4y-RGirDjftibf91RM<|ktzgm4 zo=8?o@stv6fcL?>V~UmJG-d%<~X9X^>P^tg? z^oh{(rOsLtGItq#`#K^a&E{$ycR`zI!Ybj$VtOZI-*omA7kdEUZ$!a9XI)U)muvR0 zn)D_mUz~MaH>Upy>^wMf5aFnK-kD=CdrZxgRxw|E(11V3Z|RN|?sr7j)&w;1dk(05 zx2%+<{~k5)VjrXwO^~V6dgr;T&VVeyvX>a8iq2qLttv5-Za)OEbWMX#USYM>dEld5 zGp~!eD)w&VGO>#-PWxIf7EVR{IM_^nDLUnrn2U*H3k&h6RA=(1V4T+vKU*OM>$Rfm zXs-v#$T(CXBG{Njb+EbhVhTz?F#s`u?$NaPex7`#E1wwqd~j&^vaH)tV%`IiKahsM zK+LIYjhc!it_*c+-2MGyV5mnBIcd5ysJ1e)y)Q+{X1%>m94f|WAL6eo8MRjAMcFSMb-K!0Q6lzzZwHABE4a$F|~`Sfc0^%h9+K zspJ`UrDWM2<*@%Zf9O6(>JJ->X$WgBzhb$#lPU&2Y+Ylw%WL6jmvP=hSA_nk#wZP3 zVRJS2QNuyZWa=Q$wIyoq9iswN5UTS(^1ZO6IzBWC`@q&v`W0EfPEbb8&Qx;U_$Fo6 zIOOhoVG-EuNWUWMCrPewT@+-;jZVIhg#7gYT6?J?lGB}`E1xGtnbM3VL5b^t87%366_iHgr~>BO*sQ_P zW7!4Jd4Q&|F*IKc>v$Q5zI@9k2nhV>>W3JwbMUpy789^Ii1fy88ul{^QSjBg`T247 z6nqEF2us8uLk4B5l9r4 zh0AgBfL87t2xiPl_=8R9@kzb<(8E=10&u)3{fex8H@SpF2_)5+mTiA?o{yh&wceB% zC?nh{N^HS%-=ZNWWMrh<-I~we!QcXG8Heg2m*2L zGY5v;z<9eL;irMPVW}9o(jlDycjQsiB|OKbNrS!9xR!KOgzKoj;qVWI8j<^6EKams zVwMJjpmA-|aaF*44VN4mv!gDu?$0n@nhvkOAcAE<$ChK`w3+=kwkeMDCxKGtqhlN$7k%|)Qn$q8$k7tGy}exWl4B8c{af@v&zJ3xf%V!lT1Z5OJ6&7nC^2H7!4 z1j$?jZ@`JXBe#Rss_Ss)D1^7x)C7WEK=P-*vw!;zkuceZFxe0SxVy76puO%@@yMFA z6XJs>ZoE>cL6FGDADyeQJ)FT4O$J*{#C7lB-O|09ui(h68I#V{_E2YB+vgI(vn?4B z8M(r;X>qSwren~7H_|CB(ZkVR0!UkEU{Ref{2ae-!*5~spMiGU5X4*kln`N~!cjJu z*w45UYlJrvR9YPGGEjtBF@Fd(sIvZ=5RJuKbzPx7!!8981u+R`Q*Izg`V4 zAN89Bb=I(F_TEQkO||=Ks``R_UJSPGy3e}ou1)Va9=NL#M#%E0sqWBcz!?5>V;Fq$+>nI*t=l<6FajwpEh zv^baF0)hJ%0EZJ_TQFY<*r>N3H`|}6Kxd$h&Zv(!rkQl&HR#J@H)>tRBHRc&B$Fzs7G@gMxw(ji~lN z!*^7;qqgI^n%3(6Q+02^vdb`Ns*VPSM8H_)D@uU&x4;FPgo5{$JeUp-KZ{^b_vN>b z3DE5qWE|BRzB0~)`p5kRiz#+G>OJ_a09DE&Tna?X~;-rhc;8T{vW0ATOD!!e{^ku~#K z9tiL4?R#(RAH-T=mj}qd7BaUf2ZNK2vynvIDY$$SNp80Za&Z<0a#46g>HhyC-e+HR zXo(~Nz9{{Qtoy?xkiiH=d~MtxI?%maQPGW--)&Gj-{Q7m6a~0K5S-KlkwAY7Bk4zkC482a2U0em+xx%e=$%}qF_q65eqB?sUQp!C?lr!PbLbeJWKLHZS0|1m-O_ju|n9`E|- zEtL*L1vc?p=)`*lqz}z7m{t-R+y8!=?gCFfJSN_AyWjqGCM<)!PK2yq`W0CxW=U|F zh?}}JLkA;!Pf?D-V#WHs?`*#WA@vZFK26&rM?z66Vc)}rUthy;*vf&nN9k8&HRLLR z@dh@id&ze8Io7-QqxQFKs)S{~kjpp!t9wgNv-h}rLpgN%8%~!4@CFcid*z-YXk`&> z81Y2<6yZMYFAjo zuX_Qr3;GF@fS8)|-}AP8mydkvE+Pw`AweA$c?$}WIRDVbBaj;K^}Eb$3+&yX6MR9% zRANnCgUqE2ilg~l$p$q%{L$av=3DPHP*=fNX$5u7Rt{=^eBv%M!$KwCBd`5!(zMT^ zmxIs?3R%*x$a;J?2YHaul$}d))oMnY{PTocKF~haZ<_eu-KUO;FTu)}GW)Ox=T1Qa z+Bebb7zZ~#Bb{9@_Dlwo=6D+~Sa3EX2Av1p3AJ2&DZD2ng|K=`3&h8lq*-A0x%WH= zc?6!H$(SscBF>n}%1bUxwDM=VsSwRBs--Fy!V57%qlv2)SMAFGX*8FvAsA}@2T#CU AZ2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/META-INF/rewrite/jmockit.yml b/src/main/resources/META-INF/rewrite/jmockit.yml index 4178ebcd4..a15136715 100644 --- a/src/main/resources/META-INF/rewrite/jmockit.yml +++ b/src/main/resources/META-INF/rewrite/jmockit.yml @@ -36,6 +36,9 @@ recipeList: - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: mockit.integration.junit5.JMockitExtension newFullyQualifiedTypeName: org.mockito.junit.jupiter.MockitoExtension + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: mockit.integration.junit4.JMockit + newFullyQualifiedTypeName: org.mockito.junit.MockitoJUnitRunner - org.openrewrite.java.dependencies.AddDependency: groupId: org.mockito artifactId: mockito-core diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index 54d26e64c..fc03f7aef 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -17,29 +17,17 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; class JMockitExpectationsToMockitoTest implements RewriteTest { + @Override public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion() - .logCompilationWarningsAndErrors(true) - .classpathFromResources(new InMemoryExecutionContext(), - "junit-jupiter-api-5.9", - "jmockit-1.49", - "mockito-core-3.12", - "mockito-junit-jupiter-3.12" - )) - .recipeFromResource( - "/META-INF/rewrite/jmockit.yml", - "org.openrewrite.java.testing.jmockit.JMockitToMockito" - ); + setDefaultParserSettings(spec); } @DocumentExample diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java new file mode 100644 index 000000000..6abe677a7 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java @@ -0,0 +1,1086 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.MOCKITO_CORE_DEPENDENCY; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setParserSettings; + +class JMockitNonStrictExpectationsToMockitoTest implements RewriteTest { + + private static final String JUNIT_4_DEPENDENCY = "junit-4.13.2"; + private static final String LEGACY_JMOCKIT_DEPENDENCY = "jmockit-1.22"; + + @Override + public void defaults(RecipeSpec spec) { + setParserSettings(spec, JUNIT_4_DEPENDENCY, LEGACY_JMOCKIT_DEPENDENCY, MOCKITO_CORE_DEPENDENCY); + } + + @Test + void whenNullResult() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField(); + result = null; + }}; + assertNull(myObject.getSomeField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertNull; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField()).thenReturn(null); + assertNull(myObject.getSomeField()); + } + } + """ + ) + ); + } + + @Test + void whenIntResult() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public int getSomeField() { + return 0; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField(); + result = 10; + }}; + assertEquals(10, myObject.getSomeField()); + new NonStrictExpectations() {{ + myObject.getSomeField(); + this.result = 100; + }}; + assertEquals(100, myObject.getSomeField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField()).thenReturn(10); + assertEquals(10, myObject.getSomeField()); + lenient().when(myObject.getSomeField()).thenReturn(100); + assertEquals(100, myObject.getSomeField()); + } + } + """ + ) + ); + } + + @Test + void whenStringResult() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField(String s) { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField(anyString); + result = "foo"; + }}; + assertEquals("foo", myObject.getSomeField("bar")); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField(anyString())).thenReturn("foo"); + assertEquals("foo", myObject.getSomeField("bar")); + } + } + """ + ) + ); + } + + @Test + void whenVariableResult() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + String expected = "expected"; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField(); + result = expected; + }}; + assertEquals(expected, myObject.getSomeField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + String expected = "expected"; + + void test() { + lenient().when(myObject.getSomeField()).thenReturn(expected); + assertEquals(expected, myObject.getSomeField()); + } + } + """ + ) + ); + } + + @Test + void whenNewClassResult() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public Object getSomeField() { + return null; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertNotNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField(); + result = new Object(); + }}; + assertNotNull(myObject.getSomeField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertNotNull; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField()).thenReturn(new Object()); + assertNotNull(myObject.getSomeField()); + } + } + """ + ) + ); + } + + @Test + void whenExceptionResult() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() throws RuntimeException { + new NonStrictExpectations() {{ + myObject.getSomeField(); + result = new RuntimeException(); + }}; + myObject.getSomeField(); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() throws RuntimeException { + lenient().when(myObject.getSomeField()).thenThrow(new RuntimeException()); + myObject.getSomeField(); + } + } + """ + ) + ); + } + + @Test + void whenReturns() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() throws RuntimeException { + new NonStrictExpectations() {{ + myObject.getSomeField(); + returns("foo", "bar"); + }}; + assertEquals("foo", myObject.getSomeField()); + assertEquals("bar", myObject.getSomeField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() throws RuntimeException { + lenient().when(myObject.getSomeField()).thenReturn("foo", "bar"); + assertEquals("foo", myObject.getSomeField()); + assertEquals("bar", myObject.getSomeField()); + } + } + """ + ) + ); + } + + @Test + void whenClassArgumentMatcher() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + class MyObject { + public String getSomeField(List input) { + return "X"; + } + public String getSomeOtherField(Object input) { + return "Y"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField((List) any); + result = null; + myObject.getSomeOtherField((Object) any); + result = null; + }}; + assertNull(myObject.getSomeField(new ArrayList<>())); + assertNull(myObject.getSomeOtherField(new Object())); + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertNull; + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField(anyList())).thenReturn(null); + lenient().when(myObject.getSomeOtherField(any(Object.class))).thenReturn(null); + assertNull(myObject.getSomeField(new ArrayList<>())); + assertNull(myObject.getSomeOtherField(new Object())); + } + } + """ + ) + ); + } + + @Test + void whenNoArguments() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeField(); + result = null; + }}; + assertNull(myObject.getSomeField()); + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertNull; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField()).thenReturn(null); + assertNull(myObject.getSomeField()); + } + } + """ + ) + ); + } + + @DocumentExample + @Test + void whenMixedArgumentMatcher() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + class MyObject { + public String getSomeField(String s, String s2, String s3, long l1) { + return "X"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + String bazz = "bazz"; + new NonStrictExpectations() {{ + myObject.getSomeField("foo", anyString, bazz, 10L); + result = null; + }}; + assertNull(myObject.getSomeField("foo", "bar", bazz, 10L)); + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertNull; + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + String bazz = "bazz"; + lenient().when(myObject.getSomeField(eq("foo"), anyString(), eq(bazz), eq(10L))).thenReturn(null); + assertNull(myObject.getSomeField("foo", "bar", bazz, 10L)); + } + } + """ + ) + ); + } + + @Test + void whenSetupStatements() { + //language=java + rewriteRun( + java( + """ + class MyObject { + + public String getSomeField(String s) { + return "X"; + } + public String getString() { + return "Y"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + String a = "a"; + String s = "s"; + + new NonStrictExpectations() {{ + myObject.getSomeField(anyString); + result = s; + + myObject.getString(); + result = a; + }}; + + assertEquals("s", myObject.getSomeField("foo")); + assertEquals("a", myObject.getString()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + String a = "a"; + String s = "s"; + lenient().when(myObject.getSomeField(anyString())).thenReturn(s); + lenient().when(myObject.getString()).thenReturn(a); + + assertEquals("s", myObject.getSomeField("foo")); + assertEquals("a", myObject.getString()); + } + } + """ + ) + ); + } + + @Test + void whenSetupStatements2() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField(String s) { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + String a = "a"; + new NonStrictExpectations() {{ + myObject.getSomeField(anyString); + String s = "s"; + String b = "b"; + result = s; + }}; + + assertEquals("s", myObject.getSomeField("foo")); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + String a = "a"; + String s = "s"; + String b = "b"; + lenient().when(myObject.getSomeField(anyString())).thenReturn(s); + + assertEquals("s", myObject.getSomeField("foo")); + } + } + """ + ) + ); + } + + @Test + void whenSpy() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Tested; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + + @RunWith(JMockit.class) + class MyTest { + @Tested + MyObject myObject; + + void test() { + new NonStrictExpectations(myObject) {{ + myObject.getSomeField(); + result = "foo"; + }}; + assertEquals("foo", myObject.getSomeField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.InjectMocks; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @InjectMocks + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeField()).thenReturn("foo"); + assertEquals("foo", myObject.getSomeField()); + } + } + """ + ) + ); + } + + @Test + void whenMultipleStatements() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeStringField(String input, long otherInput) { + return "X"; + } + public int getSomeIntField() { + return 0; + } + public Object getSomeObjectField() { + return new Object(); + } + public void doSomething() {} + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + Object myObject; + + @Mocked + MyObject myOtherObject; + + void test() { + new NonStrictExpectations() {{ + myObject.hashCode(); + result = 10; + myOtherObject.getSomeObjectField(); + result = null; + myObject.wait(anyLong, anyInt); + myOtherObject.getSomeStringField(anyString, anyLong); + result = "foo"; + }}; + assertEquals(10, myObject.hashCode()); + assertNull(myOtherObject.getSomeObjectField()); + myObject.wait(10L, 10); + assertEquals("foo", myOtherObject.getSomeStringField("bar", 10L)); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNull; + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + Object myObject; + + @Mock + MyObject myOtherObject; + + void test() { + lenient().when(myObject.hashCode()).thenReturn(10); + lenient().when(myOtherObject.getSomeObjectField()).thenReturn(null); + lenient().when(myOtherObject.getSomeStringField(anyString(), anyLong())).thenReturn("foo"); + assertEquals(10, myObject.hashCode()); + assertNull(myOtherObject.getSomeObjectField()); + myObject.wait(10L, 10); + assertEquals("foo", myOtherObject.getSomeStringField("bar", 10L)); + } + } + """ + ) + ); + } + + @Test + void whenMultipleExpectations() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeStringField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.getSomeStringField(); + result = "a"; + }}; + assertEquals("a", myObject.getSomeStringField()); + new NonStrictExpectations() {{ + myObject.getSomeStringField(); + result = "b"; + }}; + assertEquals("b", myObject.getSomeStringField()); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNull; + import static org.mockito.Mockito.lenient; + import static org.mockito.Mockito.when; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + lenient().when(myObject.getSomeStringField()).thenReturn("a"); + assertEquals("a", myObject.getSomeStringField()); + lenient().when(myObject.getSomeStringField()).thenReturn("b"); + assertEquals("b", myObject.getSomeStringField()); + } + } + """ + ) + ); + } + + @Test + void whenNoResultsNoTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNull; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.wait(anyLong); + }}; + myObject.wait(1L); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.junit.Assert.assertEquals; + import static org.junit.Assert.assertNull; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(1L); + } + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java new file mode 100644 index 000000000..0b21832ab --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; + +public class JMockitTestUtils { + + static final String MOCKITO_CORE_DEPENDENCY = "mockito-core-3.12"; + static final String JUNIT_5_JUPITER_DEPENDENCY = "junit-jupiter-api-5.9"; + static final String JMOCKIT_DEPENDENCY = "jmockit-1.49"; + static final String MOCKITO_JUPITER_DEPENDENCY = "mockito-junit-jupiter-3.12"; + + static void setDefaultParserSettings(RecipeSpec spec) { + setParserSettings(spec, JUNIT_5_JUPITER_DEPENDENCY, + JMOCKIT_DEPENDENCY, + MOCKITO_CORE_DEPENDENCY, + MOCKITO_JUPITER_DEPENDENCY); + } + + static void setParserSettings(RecipeSpec spec, String... javaParserTestDependencies) { + spec.parser(JavaParser.fromJavaVersion() + .logCompilationWarningsAndErrors(true) + .classpathFromResources(new InMemoryExecutionContext(), + javaParserTestDependencies + )) + .recipeFromResource( + "/META-INF/rewrite/jmockit.yml", + "org.openrewrite.java.testing.jmockit.JMockitToMockito" + ); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java index 23022dcb5..faaff8edb 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -17,30 +17,17 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; import org.openrewrite.test.TypeValidation; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; class JMockitVerificationsToMockitoTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion() - .logCompilationWarningsAndErrors(true) - .classpathFromResources(new InMemoryExecutionContext(), - "junit-jupiter-api-5.9", - "jmockit-1.49", - "mockito-core-3.12", - "mockito-junit-jupiter-3.12" - )) - .recipeFromResource( - "/META-INF/rewrite/jmockit.yml", - "org.openrewrite.java.testing.jmockit.JMockitToMockito" - ); + setDefaultParserSettings(spec); } @DocumentExample From 33c97a2fc39e323b5cd7abb6819254efb9d57fdf Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sat, 6 Jul 2024 22:08:20 +0200 Subject: [PATCH 014/118] Correctly replace Date and Instant hamcrest assertions to AssertJ Fixes https://github.com/openrewrite/rewrite-testing-frameworks/issues/526 --- .../hamcrest/HamcrestMatcherToAssertJ.java | 6 +-- .../resources/META-INF/rewrite/hamcrest.yml | 34 ++++++++++++++ .../MigrateHamcrestToAssertJTest.java | 44 +++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java b/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java index 2003876fb..8f0a6958c 100644 --- a/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java +++ b/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java @@ -37,21 +37,21 @@ @AllArgsConstructor public class HamcrestMatcherToAssertJ extends Recipe { - @Option(displayName = "Hamcrest Matcher", + @Option(displayName = "Hamcrest matcher", description = "The Hamcrest `Matcher` to migrate to JUnit5.", example = "equalTo", required = false) @Nullable String matcher; - @Option(displayName = "AssertJ Assertion", + @Option(displayName = "AssertJ assertion", description = "The AssertJ method to migrate to.", example = "isEqualTo", required = false) @Nullable String assertion; - @Option(displayName = "Argument Type", + @Option(displayName = "Argument type", description = "The type of the argument to the Hamcrest `Matcher`.", example = "java.math.BigDecimal", required = false) diff --git a/src/main/resources/META-INF/rewrite/hamcrest.yml b/src/main/resources/META-INF/rewrite/hamcrest.yml index 1bcb7a12e..2271ea278 100644 --- a/src/main/resources/META-INF/rewrite/hamcrest.yml +++ b/src/main/resources/META-INF/rewrite/hamcrest.yml @@ -67,6 +67,40 @@ recipeList: matcher: comparesEqualTo assertion: isEqualByComparingTo + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: lessThan + assertion: isBefore + argumentType: java.util.Date + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: lessThanOrEqualTo + assertion: isBeforeOrEqualTo + argumentType: java.util.Date + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: greaterThan + assertion: isAfter + argumentType: java.util.Date + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: greaterThanOrEqualTo + assertion: isAfterOrEqualTo + argumentType: java.util.Date + + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: lessThan + assertion: isBefore + argumentType: java.time.Instant + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: lessThanOrEqualTo + assertion: isBeforeOrEqualTo + argumentType: java.time.Instant + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: greaterThan + assertion: isAfter + argumentType: java.time.Instant + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: + matcher: greaterThanOrEqualTo + assertion: isAfterOrEqualTo + argumentType: java.time.Instant + - org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ: matcher: equalTo assertion: isEqualTo diff --git a/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java b/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java index 5b44a19c1..b0229562f 100644 --- a/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java +++ b/src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java @@ -21,6 +21,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; import org.openrewrite.Issue; @@ -793,4 +794,47 @@ void bar(List list) { ) ); } + + @ParameterizedTest + @ValueSource( + strings = { + "java.util.Date", + "java.time.Instant" + } + ) + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/526") + void greaterThanOrEqualToDate(String type){ + rewriteRun( + java( + """ + import static org.hamcrest.MatcherAssert.assertThat; + import static org.hamcrest.Matchers.greaterThan; + import static org.hamcrest.Matchers.greaterThanOrEqualTo; + import static org.hamcrest.Matchers.lessThan; + import static org.hamcrest.Matchers.lessThanOrEqualTo; + + class Foo { + void bar(%1$s type) { + assertThat(type, lessThan(type)); + assertThat(type, lessThanOrEqualTo(type)); + assertThat(type, greaterThan(type)); + assertThat(type, greaterThanOrEqualTo(type)); + } + } + """.formatted(type), + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Foo { + void bar(%1$s type) { + assertThat(type).isBefore(type); + assertThat(type).isBeforeOrEqualTo(type); + assertThat(type).isAfter(type); + assertThat(type).isAfterOrEqualTo(type); + } + } + """.formatted(type) + ) + ); + } } From f1fda26d2df40129156af3954f1b0b6e2383dfaa Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 8 Jul 2024 13:13:29 +0200 Subject: [PATCH 015/118] Delegate to the Mockito 4 upgrade from JUnit 5 upgrade Fixes https://github.com/openrewrite/rewrite-testing-frameworks/issues/541 --- src/main/resources/META-INF/rewrite/junit5.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 82396b90b..8dc44613d 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -122,18 +122,7 @@ recipeList: onlyIfUsing: org.junit.jupiter.params.ParameterizedTest acceptTransitive: true scope: test - - org.openrewrite.java.dependencies.UpgradeDependencyVersion: - groupId: org.mockito - artifactId: "*" - newVersion: 3.x - overrideManagedVersion: false - - org.openrewrite.java.dependencies.AddDependency: - groupId: org.mockito - artifactId: mockito-junit-jupiter - version: 3.x - onlyIfUsing: org.mockito..* - acceptTransitive: true - scope: test + - org.openrewrite.java.testing.mockito.Mockito1to4Migration - org.openrewrite.maven.UpgradePluginVersion: groupId: org.apache.maven.plugins artifactId: maven-surefire-plugin From dc5e68943c277c1f52acf77087a87a41691145ab Mon Sep 17 00:00:00 2001 From: Marvin Date: Mon, 8 Jul 2024 18:41:26 +0000 Subject: [PATCH 016/118] More best pratices for AssertJ (#548) * Added ChainedAssertions for Iterator hasNext Signed-off-by: Marvin Froeder * Create dedicated test for IsEqualToEmptyString * AssertJ has a more idiomatic way of asserting that a boolean is true. This recipe will find instances of: -`assertThat(boolean).isEqualTo(true)` and replace them with `isTrue()`. -`assertThat(boolean).isEqualTo(false)` and replace them with `isFalse()`. Signed-off-by: Marvin Froeder * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Apply formatter * Add missing `@Test` annotations --------- Signed-off-by: Marvin Froeder Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../testing/assertj/IsEqualToBoolean.java | 74 +++++++++++ .../resources/META-INF/rewrite/assertj.yml | 11 ++ .../testing/assertj/IsEqualToBooleanTest.java | 86 ++++++++++++ .../assertj/IsEqualToEmptyStringTest.java | 61 +++++++++ .../MigrateChainedAssertToAssertJTest.java | 123 ++++++++++++------ 5 files changed, 314 insertions(+), 41 deletions(-) create mode 100644 src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java create mode 100644 src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java create mode 100644 src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java diff --git a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java new file mode 100644 index 000000000..e0a9bcc7e --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java @@ -0,0 +1,74 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.J.MethodInvocation; +import org.openrewrite.java.tree.JavaType.Method; + +import java.util.Collections; + +/** + * AssertJ has a more idiomatic way of asserting that a boolean is true. This + * recipe will find instances of: + *

    + * -`assertThat(boolean).isEqualTo(true)` and replace them with `isTrue()`. + * -`assertThat(boolean).isEqualTo(false)` and replace them with `isFalse()`. + */ +public class IsEqualToBoolean extends Recipe { + + private static final MethodMatcher IS_EQUAL_TO = new MethodMatcher( + "org.assertj.core.api.AbstractBooleanAssert isEqualTo(boolean)"); + + @Override + public String getDisplayName() { + return "Convert `assertThat(String).isEqualTo(true)` to `isTrue()` and `isEqualTo(false)` to `isFalse()`"; + } + + @Override + public String getDescription() { + return "Adopt idiomatic AssertJ assertion for true booleans."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesMethod<>(IS_EQUAL_TO), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (IS_EQUAL_TO.matches(mi)) { + String methodName; + if (J.Literal.isLiteralValue(mi.getArguments().get(0), true)) { + methodName = "isTrue"; + } else { + methodName = "isFalse"; + } + Method isBooleanMethod = mi.getMethodType().withName(methodName); + return mi.withName(mi.getName().withSimpleName(methodName).withType(isBooleanMethod)) + .withMethodType(isBooleanMethod).withArguments(Collections.emptyList()); + } + return mi; + } + }); + } +} diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 2695a5dd0..f7ed519c6 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -25,6 +25,7 @@ recipeList: - org.openrewrite.java.testing.hamcrest.MigrateHamcrestToAssertJ - org.openrewrite.java.testing.assertj.JUnitToAssertj - org.openrewrite.java.testing.assertj.StaticImports + - org.openrewrite.java.testing.assertj.IsEqualToBoolean - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions - org.openrewrite.java.testing.assertj.IsEqualToEmptyString @@ -337,6 +338,16 @@ recipeList: assertToReplace: isSameAs dedicatedAssertion: containsSame requiredType: java.util.Optional + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: hasNext + assertToReplace: isTrue + dedicatedAssertion: hasNext + requiredType: java.util.Iterator + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: hasNext + assertToReplace: isFalse + dedicatedAssertion: isExhausted + requiredType: java.util.Iterator --- type: specs.openrewrite.org/v1beta/recipe diff --git a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java new file mode 100644 index 000000000..8202f1ff0 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class IsEqualToBooleanTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) + .recipe(new IsEqualToBoolean()); + } + + @DocumentExample + @Test + void convertsIsEqualToTrue() { + rewriteRun( + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(true).isEqualTo(true); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(true).isTrue(); + } + } + """ + ) + ); + } + + @Test + void convertsIsEqualToFalse() { + rewriteRun( + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(false).isEqualTo(false); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(false).isFalse(); + } + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java new file mode 100644 index 000000000..61a41413e --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class IsEqualToEmptyStringTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) + .recipe(new IsEqualToEmptyString()); + } + + @DocumentExample + @Test + void convertsIsEqualToEmptyString() { + rewriteRun( + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat("test").isEqualTo(""); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat("test").isEmpty(); + } + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java b/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java index 0f54f4f47..99bb27790 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java @@ -56,31 +56,33 @@ void stringIsEmptyExample() { rewriteRun( //language=java java( - """ - import org.junit.jupiter.api.Test; - - import static org.assertj.core.api.Assertions.assertThat; - - class MyTest { - @Test - void testMethod() { - String s = "hello world"; - assertThat(s.isEmpty()).isTrue(); - } - } - """, """ - import org.junit.jupiter.api.Test; - - import static org.assertj.core.api.Assertions.assertThat; - - class MyTest { - @Test - void testMethod() { - String s = "hello world"; - assertThat(s).isEmpty(); - } - } - """) + """ + import org.junit.jupiter.api.Test; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + @Test + void testMethod() { + String s = "hello world"; + assertThat(s.isEmpty()).isTrue(); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + @Test + void testMethod() { + String s = "hello world"; + assertThat(s).isEmpty(); + } + } + """ + ) ); } @@ -105,9 +107,9 @@ void stringReplacements(String chainedAssertion, String assertToReplace, String //language=java String template = """ import org.junit.jupiter.api.Test; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void test() { @@ -161,9 +163,9 @@ void fileReplacements(String chainedAssertion, String assertToReplace, String de String template = """ import org.junit.jupiter.api.Test; import java.io.File; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void test() { @@ -210,9 +212,9 @@ void pathReplacements(String chainedAssertion, String assertToReplace, String de import org.junit.jupiter.api.Test; import java.nio.file.Path; import java.nio.file.Paths; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void test() { @@ -258,9 +260,9 @@ void collectionReplacements(String chainedAssertion, String assertToReplace, Str //language=java String template = """ import java.util.Collection; - + import static org.assertj.core.api.Assertions.assertThat; - + class A { void test(Collection collection, Collection otherCollection) { String something = ""; @@ -303,9 +305,9 @@ void mapReplacements(String chainedAssertion, String assertToReplace, String ded import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void test() { @@ -343,9 +345,9 @@ void mapHasSameSizeAs() { """ import org.junit.jupiter.api.Test; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void testMethod() { @@ -358,9 +360,9 @@ void testMethod() { """ import org.junit.jupiter.api.Test; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void testMethod() { @@ -392,9 +394,9 @@ void optionalReplacements(String chainedAssertion, String assertToReplace, Strin String template = """ import org.junit.jupiter.api.Test; import java.util.Optional; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { @Test void test() { @@ -414,4 +416,43 @@ void test() { rewriteRun(java(before, after)); } } + + @Nested + class Iterators { + private static Stream collectionReplacements() { + return Stream.of( + Arguments.arguments("hasNext", "isTrue", "hasNext"), + Arguments.arguments("hasNext", "isFalse", "isExhausted") + ); + } + + @ParameterizedTest + @MethodSource("collectionReplacements") + void collectionReplacements(String chainedAssertion, String assertToReplace, String dedicatedAssertion) { + //language=java + String template = """ + import java.util.Iterator; + + import static org.assertj.core.api.Assertions.assertThat; + + class A { + void test(Iterator iterator, Iterator otherIterator) { + String something = ""; + %s + } + } + """; + String assertBefore = "assertThat(iterator.%s()).%s();"; + String assertAfter = "assertThat(iterator).%s();"; + + String formattedAssertBefore = assertBefore.formatted(chainedAssertion, assertToReplace); + + String before = String.format(template, formattedAssertBefore); + String after = String.format(template, assertAfter.formatted(dedicatedAssertion)); + + rewriteRun( + java(before, after) + ); + } + } } From a79dc453839c09d7d7b3f5a6c49ed1edd714fd0b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 10 Jul 2024 22:46:03 +0200 Subject: [PATCH 017/118] Prevent incorrect change from IsEqualToBoolean --- .../testing/assertj/IsEqualToBoolean.java | 4 +++- .../testing/assertj/IsEqualToBooleanTest.java | 23 ++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java index e0a9bcc7e..d5dec1d0c 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java @@ -60,8 +60,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu String methodName; if (J.Literal.isLiteralValue(mi.getArguments().get(0), true)) { methodName = "isTrue"; - } else { + } else if (J.Literal.isLiteralValue(mi.getArguments().get(0), false)) { methodName = "isFalse"; + } else { + return mi; } Method isBooleanMethod = mi.getMethodType().withName(methodName); return mi.withName(mi.getName().withSimpleName(methodName).withType(isBooleanMethod)) diff --git a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java index 8202f1ff0..e00d2d055 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java @@ -72,11 +72,28 @@ void test() { } } """, - """ + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(false).isFalse(); + } + } + """ + ) + ); + } + + @Test + void noChangeOnVariable() { + rewriteRun( + // language=java + java( + """ import static org.assertj.core.api.Assertions.assertThat; class Test { - void test() { - assertThat(false).isFalse(); + void test(boolean b) { + assertThat(false).isEqualTo(b); } } """ From 5a2d83492b0532a8223ac84cf521d44e5aa5dc48 Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Thu, 11 Jul 2024 20:53:23 +1000 Subject: [PATCH 018/118] JMockit NonStrictExpectations with times should be migrated to default when without lenient(), refactor (#549) * Add migration of JMockit NonStrictExpectations blocks as well as JMockit junit 4 runner * Add unit tests for NonStrictExpectations, all passing, refactor to reduce code duplication * Add missing copyright clause * Remove @Nullable annotation because using javax or open rewrite internal annotation is not recommended as per code review * Add missing nullable annotations * When putting times in NonStrictExpectations ensure it is strict stubbing and add test cases, also refactor * Refactor logic for imports to make it cleaner * Qualify `rewriteFailed` consistently --------- Co-authored-by: Tim te Beek --- .../testing/jmockit/JMockitBlockRewriter.java | 99 ++++++++-------- .../JMockitExpectationsToMockitoTest.java | 106 +++++++++++++++++- ...kitNonStrictExpectationsToMockitoTest.java | 102 +++++++++++++++++ 3 files changed, 257 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java index 0e9829b4d..5544bb5d3 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java @@ -75,7 +75,7 @@ boolean isRewriteFailed() { this.newExpectations = newExpectations; this.bodyStatementIndex = bodyStatementIndex; this.blockType = blockType; - nextStatementCoordinates = newExpectations.getCoordinates().replace(); + this.nextStatementCoordinates = newExpectations.getCoordinates().replace(); } J.Block rewriteMethodBody() { @@ -125,37 +125,30 @@ private void rewriteMethodInvocation(List statementsToRewrite) { final MockInvocationResults mockInvocationResults = buildMockInvocationResults(statementsToRewrite); if (mockInvocationResults == null) { // invalid block, cannot rewrite - rewriteFailed = true; + this.rewriteFailed = true; return; } J.MethodInvocation invocation = (J.MethodInvocation) statementsToRewrite.get(0); boolean hasResults = !mockInvocationResults.getResults().isEmpty(); + boolean hasTimes = mockInvocationResults.hasAnyTimes(); if (hasResults) { - rewriteResult(invocation, mockInvocationResults.getResults()); + rewriteResult(invocation, mockInvocationResults.getResults(), hasTimes); } - if (blockType == NonStrictExpectations) { - // no verify for NonStrictExpectations + if (!hasResults && !hasTimes && (this.blockType == JMockitBlockType.Expectations || this.blockType == Verifications)) { + rewriteVerify(invocation, null, ""); return; } - - boolean hasTimes = false; if (mockInvocationResults.getTimes() != null) { - hasTimes = true; rewriteVerify(invocation, mockInvocationResults.getTimes(), "times"); } if (mockInvocationResults.getMinTimes() != null) { - hasTimes = true; rewriteVerify(invocation, mockInvocationResults.getMinTimes(), "atLeast"); } if (mockInvocationResults.getMaxTimes() != null) { - hasTimes = true; rewriteVerify(invocation, mockInvocationResults.getMaxTimes(), "atMost"); } - if (!hasResults && !hasTimes) { - rewriteVerify(invocation, null, ""); - } } private void removeBlock() { @@ -163,18 +156,15 @@ private void removeBlock() { .javaParser(JavaParser.fromJavaVersion()) .build() .apply(new Cursor(visitor.getCursor(), methodBody), nextStatementCoordinates); - if (bodyStatementIndex == 0) { - nextStatementCoordinates = methodBody.getCoordinates().firstStatement(); - } else { - setNextStatementCoordinates(0); - } + setNextStatementCoordinates(0); } - private void rewriteResult(J.MethodInvocation invocation, List results) { - String template = getWhenTemplate(results); + private void rewriteResult(J.MethodInvocation invocation, List results, boolean hasTimes) { + boolean lenient = this.blockType == NonStrictExpectations && !hasTimes; + String template = getWhenTemplate(results, lenient); if (template == null) { // invalid template, cannot rewrite - rewriteFailed = true; + this.rewriteFailed = true; return; } @@ -182,17 +172,16 @@ private void rewriteResult(J.MethodInvocation invocation, List resul templateParams.add(invocation); templateParams.addAll(results); this.rewriteFailed = !rewriteTemplate(template, templateParams, nextStatementCoordinates); - if (!this.rewriteFailed) { - this.rewriteFailed = true; - setNextStatementCoordinates(++numStatementsAdded); - // do this last making sure rewrite worked and specify hasReference=false because framework cannot find static - // reference for when method invocation when lenient is added. - boolean hasReferencesForWhen = true; - if (this.blockType == NonStrictExpectations) { - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "lenient"); - hasReferencesForWhen = false; - } - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "when", hasReferencesForWhen); + if (this.rewriteFailed) { + return; + } + + setNextStatementCoordinates(++numStatementsAdded); + // do this last making sure rewrite worked and specify onlyifReferenced=false because framework cannot find static + // reference for when method invocation when another static mockit reference is added + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "when", false); + if (lenient) { + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "lenient"); } } @@ -218,29 +207,37 @@ private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression t verifyCoordinates = methodBody.getCoordinates().lastStatement(); } this.rewriteFailed = !rewriteTemplate(verifyTemplate, templateParams, verifyCoordinates); - if (!this.rewriteFailed) { - if (this.blockType == Verifications) { - setNextStatementCoordinates(++numStatementsAdded); // for Expectations, verify statements added to end of method - } + if (this.rewriteFailed) { + return; + } - // do this last making sure rewrite worked and specify hasReference=false because in verify case framework - // cannot find the static reference - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "verify", false); - if (!verificationMode.isEmpty()) { - visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, verificationMode); - } + if (this.blockType == Verifications) { + setNextStatementCoordinates(++numStatementsAdded); // for Expectations, verify statements added to end of method + } + + // do this last making sure rewrite worked and specify onlyifReferenced=false because framework cannot find the + // static reference to verify when another static mockit reference is added + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "verify", false); + if (!verificationMode.isEmpty()) { + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, verificationMode); } } private void setNextStatementCoordinates(int numStatementsAdded) { + if (numStatementsAdded <= 0 && bodyStatementIndex == 0) { + nextStatementCoordinates = methodBody.getCoordinates().firstStatement(); + return; + } + // the next statement coordinates are directly after the most recently written statement, calculated by // subtracting the removed jmockit block - int nextStatementIdx = bodyStatementIndex + numStatementsAdded - 1; - if (nextStatementIdx >= this.methodBody.getStatements().size()) { - rewriteFailed = true; - } else { - this.nextStatementCoordinates = this.methodBody.getStatements().get(nextStatementIdx).getCoordinates().after(); + int lastStatementIdx = bodyStatementIndex + numStatementsAdded - 1; + if (lastStatementIdx >= this.methodBody.getStatements().size()) { + this.rewriteFailed = true; + return; } + + this.nextStatementCoordinates = this.methodBody.getStatements().get(lastStatementIdx).getCoordinates().after(); } private boolean rewriteTemplate(String template, List templateParams, JavaCoordinates @@ -258,10 +255,10 @@ private boolean rewriteTemplate(String template, List templateParams, Ja return methodBody.getStatements().size() > numStatementsBefore; } - private @Nullable String getWhenTemplate(List results) { + private @Nullable String getWhenTemplate(List results, boolean lenient) { boolean buildingResults = false; StringBuilder templateBuilder = new StringBuilder(); - if (this.blockType == NonStrictExpectations) { + if (lenient) { templateBuilder.append(LENIENT_TEMPLATE_PREFIX); } templateBuilder.append(WHEN_TEMPLATE_PREFIX); @@ -422,5 +419,9 @@ private static class MockInvocationResults { private void addResult(Expression result) { results.add(result); } + + private boolean hasAnyTimes() { + return times != null || minTimes != null || maxTimes != null; + } } } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index fc03f7aef..fcc8bece2 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -30,6 +30,61 @@ public void defaults(RecipeSpec spec) { setDefaultParserSettings(spec); } + @DocumentExample + @Test + void whenTimesAndResult() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.toString(); + result = "foo"; + times = 2; + }}; + assertEquals("foo", myObject.toString()); + assertEquals("foo", myObject.toString()); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + when(myObject.toString()).thenReturn("foo"); + assertEquals("foo", myObject.toString()); + assertEquals("foo", myObject.toString()); + verify(myObject, times(2)).toString(); + } + } + """ + ) + ); + } + @DocumentExample @Test void whenNoResultNoTimes() { @@ -77,7 +132,6 @@ void test() { ); } - @DocumentExample @Test void whenNoResultNoTimesNoArgs() { //language=java @@ -124,6 +178,56 @@ void test() { ); } + @Test + void whenHasResultNoTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.toString(); + result = "foo"; + }}; + assertEquals("foo", myObject.toString()); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + when(myObject.toString()).thenReturn("foo"); + assertEquals("foo", myObject.toString()); + } + } + """ + ) + ); + } + @Test void whenNullResult() { //language=java diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java index 6abe677a7..bc186bb48 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java @@ -1083,4 +1083,106 @@ void test() { ) ); } + + @Test + void whenTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.wait(anyLong, anyInt); + times = 3; + }}; + myObject.wait(10L, 10); + myObject.wait(10L, 10); + myObject.wait(10L, 10); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + myObject.wait(10L, 10); + verify(myObject, times(3)).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenTimesAndResult() { + //language=java + rewriteRun( + java( + """ + import mockit.NonStrictExpectations; + import mockit.Mocked; + import mockit.integration.junit4.JMockit; + import org.junit.runner.RunWith; + + @RunWith(JMockit.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new NonStrictExpectations() {{ + myObject.toString(); + result = "foo"; + times = 2; + }}; + myObject.toString(); + myObject.toString(); + } + } + """, + """ + import org.junit.runner.RunWith; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnitRunner; + + import static org.mockito.Mockito.*; + + @RunWith(MockitoJUnitRunner.class) + class MyTest { + @Mock + Object myObject; + + void test() { + when(myObject.toString()).thenReturn("foo"); + myObject.toString(); + myObject.toString(); + verify(myObject, times(2)).toString(); + } + } + """ + ) + ); + } } From 3eb8e8765805a2281e1d7b546a2f03eda83e476f Mon Sep 17 00:00:00 2001 From: Shannon Pamperl Date: Thu, 11 Jul 2024 12:06:11 -0500 Subject: [PATCH 019/118] refactor: Update Gradle wrapper (#551) Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.gradle.UpdateGradleWrapper?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 4 +++- gradlew.bat | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 8703 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 Ojj7^59?Sdh$^Qpp*~F>< delta 8662 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index acacbc504..3bc9bad7e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612 +distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab diff --git a/gradlew b/gradlew index b740cf133..f3b75f3b0 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 7101f8e46..9b42019c7 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## From 399931b9106fd70ca38c09b95db73f12cdc86432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20Schn=C3=A9ider?= Date: Tue, 16 Jul 2024 22:28:47 +0000 Subject: [PATCH 020/118] refactor: Move `@Nullable` method annotations to the return type Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.staticanalysis.NullableOnMethodReturnType?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .../testing/junit5/JUnitParamsRunnerToParameterized.java | 9 +++------ .../testing/mockito/PowerMockitoMockStaticToMockito.java | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java b/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java index f4bb84386..420046147 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java @@ -137,8 +137,7 @@ public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ct return anno; } - @Nullable - private String getLiteralAnnotationArgumentValue(J.Annotation anno) { + private @Nullable String getLiteralAnnotationArgumentValue(J.Annotation anno) { String annotationArgumentValue = null; if (anno.getArguments() != null && anno.getArguments().size() == 1 && anno.getArguments().get(0) instanceof J.Literal) { J.Literal literal = (J.Literal) anno.getArguments().get(0); @@ -147,8 +146,7 @@ private String getLiteralAnnotationArgumentValue(J.Annotation anno) { return annotationArgumentValue; } - @Nullable - private String getAnnotationArgumentForInitMethod(J.Annotation anno, String... variableNames) { + private @Nullable String getAnnotationArgumentForInitMethod(J.Annotation anno, String... variableNames) { String value = null; if (anno.getArguments() != null && anno.getArguments().size() == 1 && anno.getArguments().get(0) instanceof J.Assignment @@ -292,8 +290,7 @@ private J.Annotation maybeReplaceParametersAnnotation(Cursor anno, String method return anno.getValue(); } - @Nullable - private String getAnnotationArgumentValueForMethodTemplate(J.Annotation anno) { + private @Nullable String getAnnotationArgumentValueForMethodTemplate(J.Annotation anno) { String annotationArgumentValue = null; if (anno.getArguments() != null && anno.getArguments().size() == 1) { Expression annoArg = anno.getArguments().get(0); diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index a0450c661..edec2dd80 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -210,8 +210,7 @@ private static boolean isFieldAlreadyDefined(J.Block classBody, String fieldName return false; } - @Nullable - private static J.MethodDeclaration getFirstTestMethod(List methods) { + private static @Nullable J.MethodDeclaration getFirstTestMethod(List methods) { for (J.MethodDeclaration methodDeclaration : methods) { for (J.Annotation annotation : methodDeclaration.getLeadingAnnotations()) { if ("Test".equals(annotation.getSimpleName())) { @@ -559,8 +558,7 @@ private J.MethodInvocation modifyWhenMethodInvocation(J.MethodInvocation whenMet return whenMethod; } - @Nullable - private String getDeclaringClassName(J.MethodInvocation mi) { + private @Nullable String getDeclaringClassName(J.MethodInvocation mi) { JavaType.Method methodType = mi.getMethodType(); if (methodType != null) { JavaType.FullyQualified declaringType = methodType.getDeclaringType(); @@ -569,8 +567,7 @@ private String getDeclaringClassName(J.MethodInvocation mi) { return null; } - @Nullable - private J.Identifier getFieldIdentifier(String fieldName) { + private @Nullable J.Identifier getFieldIdentifier(String fieldName) { return getMockedTypesFields().keySet().stream() .filter(identifier -> identifier.getSimpleName().equals(fieldName)).findFirst() .orElseGet(() -> { From c2e4fba4b7061b7d4ebac0a7a2fbde7438b7b4f9 Mon Sep 17 00:00:00 2001 From: Marvin Date: Wed, 24 Jul 2024 09:28:01 +0000 Subject: [PATCH 021/118] Simplify toString assertion (#554) * Simplify toString assertion Instead of using: ``` assertThat(cat.toString()).isEqualTo("animal"); ``` Could use: ``` assertThat(cat).hasToString("animal"); ``` Signed-off-by: Marvin Froeder * Update src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java * Minor fixes --------- Signed-off-by: Marvin Froeder Co-authored-by: Tim te Beek Co-authored-by: Tim te Beek --- .../resources/META-INF/rewrite/assertj.yml | 5 +++ .../resources/META-INF/rewrite/junit5.yml | 6 ++-- .../MigrateChainedAssertToAssertJTest.java | 36 +++++++++++++++++++ .../testing/junit5/CleanupAssertionsTest.java | 9 +++-- .../testing/junit5/UseXMLUnitLegacyTest.java | 6 +--- 5 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index f7ed519c6..68358ba0c 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -348,6 +348,11 @@ recipeList: assertToReplace: isFalse dedicatedAssertion: isExhausted requiredType: java.util.Iterator + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: toString + assertToReplace: isEqualTo + dedicatedAssertion: hasToString + requiredType: java.lang.Object --- type: specs.openrewrite.org/v1beta/recipe diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 8dc44613d..6d889a85a 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -247,7 +247,7 @@ recipeList: type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.junit5.UpgradeOkHttpMockWebServer displayName: Use OkHttp 3 MockWebServer for JUnit 5 -description: Migrates OkHttp 3 `MockWebServer` to enable JUnit Jupiter Extension support +description: Migrates OkHttp 3 `MockWebServer` to enable JUnit Jupiter Extension support. tags: - testing - junit @@ -266,7 +266,7 @@ recipeList: type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.junit5.CleanupAssertions displayName: Clean Up Assertions -description: Simplifies JUnit Jupiter assertions to their most-direct equivalents +description: Simplifies JUnit Jupiter assertions to their most-direct equivalents. tags: - testing - junit @@ -286,7 +286,7 @@ recipeList: type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.junit5.UseXMLUnitLegacy displayName: Use XMLUnit Legacy for JUnit 5 -description: Migrates XMLUnit 1.x to XMLUnit legacy 2.x +description: Migrates XMLUnit 1.x to XMLUnit legacy 2.x. tags: - testing - junit diff --git a/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java b/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java index 99bb27790..51d071685 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java @@ -455,4 +455,40 @@ void test(Iterator iterator, Iterator otherIterator) { ); } } + + @Nested + class Objects { + @Test + void objectoToStringReplacement() { + rewriteRun( + //language=java + java( + """ + import org.junit.jupiter.api.Test; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void testMethod(Object argument) { + String s = "hello world"; + assertThat(argument.toString()).isEqualTo("value"); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void testMethod(Object argument) { + String s = "hello world"; + assertThat(argument).hasToString("value"); + } + } + """ + ) + ); + } + } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/CleanupAssertionsTest.java b/src/test/java/org/openrewrite/java/testing/junit5/CleanupAssertionsTest.java index 0553fe906..1d4a95426 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/CleanupAssertionsTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/CleanupAssertionsTest.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.config.Environment; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -44,7 +43,7 @@ void assertTrueComparisonNullToAssertNull() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class ExampleTest { @Test void test() { @@ -105,7 +104,7 @@ void assertFalseNegatedEqualsNullToAssertNull() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class ExampleTest { @Test void test() { @@ -136,7 +135,7 @@ void assertNotEqualsInverted() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class A { class B {} @@ -151,7 +150,7 @@ public void FlippedParams(){ """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class A { class B {} diff --git a/src/test/java/org/openrewrite/java/testing/junit5/UseXMLUnitLegacyTest.java b/src/test/java/org/openrewrite/java/testing/junit5/UseXMLUnitLegacyTest.java index 902f8fa99..5cefde039 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/UseXMLUnitLegacyTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/UseXMLUnitLegacyTest.java @@ -16,7 +16,6 @@ package org.openrewrite.java.testing.junit5; import org.junit.jupiter.api.Test; -import org.openrewrite.config.Environment; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -27,10 +26,7 @@ class UseXMLUnitLegacyTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec - .recipe(Environment.builder() - .scanRuntimeClasspath() - .build() - .activateRecipes("org.openrewrite.java.testing.junit5.UseXMLUnitLegacy")); + .recipeFromResources("org.openrewrite.java.testing.junit5.UseXMLUnitLegacy"); } @Test From d067547b1513e8124c5433dd1e00089c0e1ed012 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 24 Jul 2024 20:36:16 +0200 Subject: [PATCH 022/118] ExpectedExceptionToAssertThrows should not wrap single statement (#555) --- .../testing/junit5/ExpectedExceptionToAssertThrows.java | 7 +++++-- .../junit5/ExpectedExceptionToAssertThrowsTest.java | 5 ++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index f4e66f5fb..ea09f6f06 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -160,8 +160,11 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl Object expectedExceptionParam = (expectMethodInvocation == null || isExpectArgAMatcher) ? "Exception.class" : expectMethodInvocation.getArguments().get(0); - String templateString = expectedExceptionParam instanceof String ? "#{}assertThrows(#{}, () -> #{});" : "#{}assertThrows(#{any()}, () -> #{});"; + String templateString = expectedExceptionParam instanceof String ? "#{}assertThrows(#{}, () -> #{any()});" : "#{}assertThrows(#{any()}, () -> #{any()});"; + Statement statement = bodyWithoutExpectedExceptionCalls.getStatements().size() == 1 && + !(bodyWithoutExpectedExceptionCalls.getStatements().get(0) instanceof J.Throw) ? + bodyWithoutExpectedExceptionCalls.getStatements().get(0) : bodyWithoutExpectedExceptionCalls; m = JavaTemplate.builder(templateString) .contextSensitive() .javaParser(javaParser(ctx)) @@ -172,7 +175,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl m.getCoordinates().replaceBody(), exceptionDeclParam, expectedExceptionParam, - bodyWithoutExpectedExceptionCalls + statement ); maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows"); diff --git a/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java b/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java index 0b61092b8..97503ff00 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java @@ -25,6 +25,7 @@ import static org.openrewrite.java.Assertions.java; +@SuppressWarnings({"deprecation", "JUnitMalformedDeclaration", "JUnit3StyleTestMethodInJUnit4Class", "Convert2MethodRef"}) class ExpectedExceptionToAssertThrowsTest implements RewriteTest { @Override @@ -105,9 +106,7 @@ class MyTest { @Test public void testEmptyPath() { - Throwable exception = assertThrows(IllegalArgumentException.class, () -> { - foo(); - }); + Throwable exception = assertThrows(IllegalArgumentException.class, () -> foo()); assertTrue(exception.getMessage().contains("Invalid location: gs://")); } void foo() { From 533f37d91f27f395e44e1db7e1025cfe6033f9b5 Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Sun, 4 Aug 2024 23:18:27 +1000 Subject: [PATCH 023/118] Add unit tests for JMockit Delegate to mockito migration. Also add test case for comments (#557) * Add unit tests for JMockit Delegate to mockito migration. Also add one test case for comments for JMockit Expectations proving that comments are not preserved. * Update JMockitDelegateToMockitoTest.java Modify test cases so that the tests fail with expected output of Delegate migration * Update JMockitExpectationsToMockitoTest.java Modify test to prove that comments migration is not supported within expectations, and this may be useful for someone who is adding this feature later. Disable test. * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update JMockitDelegateToMockitoTest.java Modify tests to account for stubbing void methods using doAnswer instead of thenAnswer. Remove unnecessary imports * Tag tests with associated issue --------- Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../jmockit/JMockitDelegateToMockitoTest.java | 366 ++++++++++++++++++ .../JMockitExpectationsToMockitoTest.java | 106 ++++- 2 files changed, 455 insertions(+), 17 deletions(-) create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java new file mode 100644 index 000000000..e4ad77bbd --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java @@ -0,0 +1,366 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.Issue; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; + +/** + * At the moment, JMockit Delegates are not migrated to mockito. What I'm seeing is that they are being trashed + * with the template being printed out. These tests were written to try to replicate this issue, however I was unable to. + * They may help anyone who wants to add Delegate migration. + */ +@Disabled +@Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/522") +class JMockitDelegateToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } + + @DocumentExample + @Test + void whenNoArgsVoidMethod() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Delegate; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(); + result = new Delegate() { + public void wait() { + System.out.println("foo"); + } + }; + }}; + myObject.wait(); + } + } + """, + """ + import mockit.Delegate; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + doAnswer(invocation -> { + System.out.println("foo"); + return null; + }).when(myObject).wait(); + myObject.wait(); + } + } + """ + ) + ); + } + + @Test + void whenHasArgsVoidMethod() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Delegate; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(anyLong); + result = new Delegate() { + void wait(long timeoutMs) { + System.out.println("foo"); + System.out.println("bar"); + } + }; + }}; + myObject.wait(); + } + } + """, + """ + import mockit.Delegate; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.anyLong; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + doAnswer(invocation -> { + System.out.println("foo"); + System.out.println("bar"); + return null; + }).when(myObject).wait(anyLong()); + myObject.wait(); + } + } + """ + ) + ); + } + + @Test + void whenNoArgsNonVoidMethod() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Delegate; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.toString(); + result = new Delegate() { + String toString() { + String a = "foo"; + return a + "bar"; + } + }; + }}; + assertEquals("foobar", myObject.toString()); + } + } + """, + """ + import mockit.Delegate; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + when(myObject.toString()).thenAnswer(invocation -> { + String a = "foo"; + return a + "bar"; + }); + assertEquals("foobar", myObject.toString()); + } + } + """ + ) + ); + } + + @Test + void whenMultipleStatementsWithAnnotation() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Delegate; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.hashCode(); + result = 100; + myObject.toString(); + result = new Delegate() { + @SuppressWarnings("unused") + String toString() { + String a = "foo"; + return a + "bar"; + } + }; + }}; + assertEquals(100, myObject.hashCode()); + assertEquals("foobar", myObject.toString()); + } + } + """, + """ + import mockit.Delegate; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + when(myObject.hashCode()).thenReturn(100); + when(myObject.toString()).thenAnswer(invocation -> { + String a = "foo"; + return a + "bar"; + }); + assertEquals(100, myObject.hashCode()); + assertEquals("foobar", myObject.toString()); + } + } + """ + ) + ); + } + + @Test + void whenClassArgumentMatcher() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + class MyObject { + public String getSomeField(List input) { + return "X"; + } + public String getSomeOtherField(Object input) { + return "Y"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Delegate; + import mockit.Mocked; + import mockit.Expectations; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new Expectations() {{ + myObject.getSomeField((List) any); + result = new Delegate() { + String getSomeOtherField(List input) { + input.add("foo"); + return input.toString(); + } + }; + }}; + myObject.getSomeField(new ArrayList<>()); + myObject.getSomeOtherField(new Object()); + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Delegate; + + import static org.mockito.Mockito.anyList; + import static org.mockito.Mockito.when; + + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + when(myObject.getSomeField(anyList())).thenAnswer(invocation -> { + List input = invocation.getArgument(0); + input.add("foo"); + return input.toString(); + }); + myObject.getSomeField(new ArrayList<>()); + myObject.getSomeOtherField(new Object()); + } + } + """ + ) + ); + } + +} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index fcc8bece2..c39233d20 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -15,6 +15,7 @@ */ package org.openrewrite.java.testing.jmockit; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.test.RecipeSpec; @@ -41,7 +42,7 @@ void whenTimesAndResult() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(JMockitExtension.class) @@ -188,8 +189,8 @@ void whenHasResultNoTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - - import static org.junit.jupiter.api.Assertions.assertEquals; + + import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(JMockitExtension.class) class MyTest { @@ -209,8 +210,8 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - - import static org.junit.jupiter.api.Assertions.assertEquals; + + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -1064,7 +1065,7 @@ void whenMinTimes() { //language=java rewriteRun( java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; @@ -1074,7 +1075,7 @@ void whenMinTimes() { class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1084,7 +1085,7 @@ void test() { } } """, - """ + """ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -1095,7 +1096,7 @@ void test() { class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(2)).wait(anyLong(), anyInt()); @@ -1111,7 +1112,7 @@ void whenMaxTimes() { //language=java rewriteRun( java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; @@ -1121,7 +1122,7 @@ void whenMaxTimes() { class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1131,7 +1132,7 @@ void test() { } } """, - """ + """ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -1142,7 +1143,7 @@ void test() { class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atMost(5)).wait(anyLong(), anyInt()); @@ -1158,7 +1159,7 @@ void whenMinTimesMaxTimes() { //language=java rewriteRun( java( - """ + """ import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; @@ -1168,7 +1169,7 @@ void whenMinTimesMaxTimes() { class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1179,7 +1180,7 @@ void test() { } } """, - """ + """ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -1190,7 +1191,7 @@ void test() { class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(1)).wait(anyLong(), anyInt()); @@ -1474,4 +1475,75 @@ void test() { ) ); } + + @Disabled // comment migration not supported yet + @Test + void whenComments() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getSomeStringField() { + return "X"; + } + } + """ + ), + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new Expectations() {{ + // comments for this line below + myObject.getSomeStringField(); + result = "a"; + }}; + assertEquals("a", myObject.getSomeStringField()); + new Expectations() {{ + myObject.getSomeStringField(); + result = "b"; + }}; + assertEquals("b", myObject.getSomeStringField()); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + // comments for this line below + when(myObject.getSomeStringField()).thenReturn("a"); + assertEquals("a", myObject.getSomeStringField()); + when(myObject.getSomeStringField()).thenReturn("b"); + assertEquals("b", myObject.getSomeStringField()); + } + } + """ + ) + ); + } } From 60acc32231d7f236695d93cf52d83485a3053ea5 Mon Sep 17 00:00:00 2001 From: Laurens-W Date: Mon, 5 Aug 2024 18:45:17 +0200 Subject: [PATCH 024/118] Convert `assertTrue(false, String)` and `assertFalse(true, String)` with `fail(String)` (#558) * Initial setup * Refactor to refaster recipe * Refactor adjust test cases as @UseImportPolicy is not taken into account * Merge tests * Remove the generated class --------- Co-authored-by: Laurens Westerlaken Co-authored-by: Tim te Beek --- .gitignore | 1 + build.gradle.kts | 8 ++ .../cleanup/AssertLiteralBooleanToFail.java | 49 ++++++++ .../AssertLiteralBooleanToFailTest.java | 117 ++++++++++++++++++ 4 files changed, 175 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFail.java create mode 100644 src/test/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFailTest.java diff --git a/.gitignore b/.gitignore index d213cf5c9..d622dc1d1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ out/ bin/ *.log .vscode/ +src/main/generated/ \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index e7ccd9904..c1a91eafc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,6 +37,8 @@ dependencies { implementation("org.openrewrite.recipe:rewrite-static-analysis:$rewriteVersion") runtimeOnly("org.openrewrite:rewrite-java-17") + compileOnly("org.junit.jupiter:junit-jupiter-engine:latest.release") + compileOnly("org.projectlombok:lombok:latest.release") annotationProcessor("org.projectlombok:lombok:latest.release") @@ -47,6 +49,12 @@ dependencies { testImplementation("org.openrewrite:rewrite-kotlin:$rewriteVersion") testImplementation("org.openrewrite.gradle.tooling:model:$rewriteVersion") + annotationProcessor("org.openrewrite:rewrite-templating:${rewriteVersion}") + implementation("org.openrewrite:rewrite-templating:${rewriteVersion}") + compileOnly("com.google.errorprone:error_prone_core:2.19.1:with-dependencies") { + exclude("com.google.auto.service", "auto-service-annotations") + } + testRuntimeOnly("org.gradle:gradle-tooling-api:latest.release") testRuntimeOnly("com.tngtech.archunit:archunit:0.23.1") diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFail.java b/src/main/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFail.java new file mode 100644 index 000000000..e1e53aea7 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFail.java @@ -0,0 +1,49 @@ +/* + * Copyright 2021 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.cleanup; + +import com.google.errorprone.refaster.annotation.AfterTemplate; +import com.google.errorprone.refaster.annotation.BeforeTemplate; +import com.google.errorprone.refaster.annotation.UseImportPolicy; +import org.openrewrite.java.template.RecipeDescriptor; + +import static com.google.errorprone.refaster.ImportPolicy.STATIC_IMPORT_ALWAYS; +import static org.junit.jupiter.api.Assertions.*; + +@RecipeDescriptor( + name = "Replace JUnit `assertTrue(false, \"reason\")` and `assertFalse(true, \"reason\")` with `fail(\"reason\")`", + description = "Using fail is more direct and clear." +) +public class AssertLiteralBooleanToFail { + + @BeforeTemplate + void assertFalseBefore(String message) { + assertFalse(true, message); + } + + @BeforeTemplate + void assertTrueBefore(String message) { + assertTrue(false, message); + } + + @AfterTemplate + // This annotation does not get taken into account + // resulting in Assertions.fail(message) being outputted + @UseImportPolicy(value = STATIC_IMPORT_ALWAYS) + void after(String message) { + fail(message); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFailTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFailTest.java new file mode 100644 index 000000000..da773f4b1 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/cleanup/AssertLiteralBooleanToFailTest.java @@ -0,0 +1,117 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.cleanup; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class AssertLiteralBooleanToFailTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9")) + .recipe(new AssertLiteralBooleanToFailRecipe()); + } + + @Test + @DocumentExample + @SuppressWarnings("SimplifiableAssertion") + void assertWithStaticImports() { + //language=java + rewriteRun( + java( + """ + import static org.junit.jupiter.api.Assertions.assertFalse; + import static org.junit.jupiter.api.Assertions.assertTrue; + + public class Test { + void test() { + assertFalse(true, "assert false true"); + assertTrue(false, "assert true false"); + } + } + """, + """ + import org.junit.jupiter.api.Assertions; + + public class Test { + void test() { + Assertions.fail("assert false true"); + Assertions.fail("assert true false"); + } + } + """ + ) + ); + } + + @Test + @SuppressWarnings("SimplifiableAssertion") + void assertWithAssertionsImport() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Assertions; + + public class Test { + void test() { + Assertions.assertFalse(true, "assert false true"); + Assertions.assertTrue(false, "assert true false"); + } + } + """, + """ + import org.junit.jupiter.api.Assertions; + + public class Test { + void test() { + Assertions.fail("assert false true"); + Assertions.fail("assert true false"); + } + } + """ + ) + ); + } + + @Test + void noChangeWhenNotLiteral() { + //language=java + rewriteRun( + java( + """ + import static org.junit.jupiter.api.Assertions.assertFalse; + import static org.junit.jupiter.api.Assertions.assertTrue; + + public class Test { + void test(boolean a, Object b) { + assertTrue(a, "message"); + assertFalse(b.equals("foo"), "message"); + } + } + """ + ) + ); + } +} From 05c20949d0534d58de4c3714f077bab2a0923f74 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 5 Aug 2024 18:51:21 +0200 Subject: [PATCH 025/118] Add AssertLiteralBooleanToFailRecipe to JUnit5BestPractices --- src/main/resources/META-INF/rewrite/junit5.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 6d889a85a..bb7521451 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -25,6 +25,7 @@ recipeList: - org.openrewrite.java.testing.junit5.JUnit4to5Migration - org.openrewrite.java.testing.junit5.StaticImports - org.openrewrite.java.testing.junit5.CleanupAssertions + - org.openrewrite.java.testing.cleanup.AssertLiteralBooleanToFailRecipe - org.openrewrite.java.testing.cleanup.RemoveTestPrefix - org.openrewrite.java.testing.cleanup.TestsShouldNotBePublic - org.openrewrite.java.testing.junit5.AddParameterizedTestAnnotation From ad847c63392350018e0a3206f58e04fe32be71ca Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 7 Aug 2024 16:47:59 +0200 Subject: [PATCH 026/118] Fix TestsShouldIncludeAssertions docs as pointed out --- .../java/testing/cleanup/TestsShouldIncludeAssertions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java index 4fe0b0f09..de89e78f6 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java @@ -68,7 +68,7 @@ public String getDisplayName() { @Override public String getDescription() { - return "For tests not having any assertions, wrap the statements with JUnit Jupiter's `Assertions#assertThrowDoesNotThrow(..)`."; + return "For tests not having any assertions, wrap the statements with JUnit Jupiter's `Assertions#assertDoesNotThrow(..)`."; } @Override From 519ebcb4bd23654aa82ede2000ed45f009894ae8 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 7 Aug 2024 19:25:11 +0200 Subject: [PATCH 027/118] Avoid duplicate before/after annotations in JUnit 3 to 5 (#562) --- .../testing/junit5/MigrateJUnitTestCase.java | 6 +- .../junit5/MigrateJUnitTestCaseTest.java | 96 ++++++++++++++----- 2 files changed, 74 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java index ab3036f0b..ea1e1870c 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java @@ -36,6 +36,8 @@ public class MigrateJUnitTestCase extends Recipe { private static final AnnotationMatcher JUNIT_TEST_ANNOTATION_MATCHER = new AnnotationMatcher("@org.junit.Test"); + private static final AnnotationMatcher JUNIT_AFTER_ANNOTATION_MATCHER = new AnnotationMatcher("@org.junit.*After*"); + private static final AnnotationMatcher JUNIT_BEFORE_ANNOTATION_MATCHER = new AnnotationMatcher("@org.junit.*Before*"); private static boolean isSupertypeTestCase(@Nullable JavaType.FullyQualified fullyQualified) { if (fullyQualified == null || fullyQualified.getSupertype() == null || "java.lang.Object".equals(fullyQualified.getFullyQualifiedName())) { @@ -123,9 +125,9 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex updateCursor(md); if (md.getSimpleName().startsWith("test") && md.getLeadingAnnotations().stream().noneMatch(JUNIT_TEST_ANNOTATION_MATCHER::matches)) { md = updateMethodDeclarationAnnotationAndModifier(md, "@Test", "org.junit.jupiter.api.Test", ctx); - } else if ("setUp".equals(md.getSimpleName())) { + } else if ("setUp".equals(md.getSimpleName()) && md.getLeadingAnnotations().stream().noneMatch(JUNIT_BEFORE_ANNOTATION_MATCHER::matches)) { md = updateMethodDeclarationAnnotationAndModifier(md, "@BeforeEach", "org.junit.jupiter.api.BeforeEach", ctx); - } else if ("tearDown".equals(md.getSimpleName())) { + } else if ("tearDown".equals(md.getSimpleName()) && md.getLeadingAnnotations().stream().noneMatch(JUNIT_AFTER_ANNOTATION_MATCHER::matches)) { md = updateMethodDeclarationAnnotationAndModifier(md, "@AfterEach", "org.junit.jupiter.api.AfterEach", ctx); } return md; diff --git a/src/test/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCaseTest.java b/src/test/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCaseTest.java index 80084d858..ecf9c1fa2 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCaseTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCaseTest.java @@ -42,25 +42,25 @@ void convertTestCase() { java( """ import junit.framework.TestCase; - + public class MathTest extends TestCase { protected long value1; protected long value2; - + @Override protected void setUp() { super.setUp(); value1 = 2; value2 = 3; } - + public void testAdd() { setName("primitive test"); long result = value1 + value2; assertEquals(5, result); fail("some Failure message"); } - + @Override protected void tearDown() { super.tearDown(); @@ -73,19 +73,19 @@ protected void tearDown() { import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.*; public class MathTest { protected long value1; protected long value2; - + @BeforeEach public void setUp() { value1 = 2; value2 = 3; } - + @Test public void testAdd() { //setName("primitive test"); @@ -93,7 +93,7 @@ public void testAdd() { assertEquals(5, result); fail("some Failure message"); } - + @AfterEach public void tearDown() { value1 = 0; @@ -116,7 +116,7 @@ void convertExtendedTestCase() { public abstract class CTest extends TestCase { @Override public void setUp() {} - + @Override public void tearDown() {} } @@ -125,11 +125,11 @@ public void tearDown() {} package com.abc; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; - + public abstract class CTest { @BeforeEach public void setUp() {} - + @AfterEach public void tearDown() {} } @@ -143,18 +143,18 @@ public void tearDown() {} public class MathTest extends CTest { protected long value1; protected long value2; - + @Override protected void setUp() { value1 = 2; value2 = 3; } - + public void testAdd() { long result = value1 + value2; assertEquals(5, result); } - + @Override protected void tearDown() { value1 = 0; @@ -168,25 +168,25 @@ protected void tearDown() { import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertEquals; public class MathTest extends CTest { protected long value1; protected long value2; - + @BeforeEach public void setUp() { value1 = 2; value2 = 3; } - + @Test public void testAdd() { long result = value1 + value2; assertEquals(5, result); } - + @AfterEach public void tearDown() { value1 = 0; @@ -205,9 +205,9 @@ void notTestCaseHasTestCaseAssertion() { java( """ import org.junit.Test; - + import static junit.framework.TestCase.assertTrue; - + class AaTest { @Test public void someTest() { @@ -220,9 +220,9 @@ private boolean isSameStuff(String stuff) { """, """ import org.junit.Test; - + import static org.junit.jupiter.api.Assertions.assertTrue; - + class AaTest { @Test public void someTest() { @@ -244,9 +244,9 @@ void notTestCaseHasAssertAssertion() { java( """ import org.junit.Test; - + import static junit.framework.Assert.assertTrue; - + class AaTest { @Test public void someTest() { @@ -259,9 +259,9 @@ private boolean isSameStuff(String stuff) { """, """ import org.junit.Test; - + import static org.junit.jupiter.api.Assertions.assertTrue; - + class AaTest { @Test public void someTest() { @@ -293,4 +293,48 @@ public void testSomeNumberStuff() { ) ); } + + @Test + void avoidDuplicateAnnotations(){ + rewriteRun( + spec -> spec.recipes( + new MigrateJUnitTestCase(), + new UpdateBeforeAfterAnnotations() + ), + //language=java + java( + """ + import junit.framework.TestCase; + import org.junit.After; + import org.junit.Before; + + public class MathTest extends TestCase { + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + } + """, + """ + import org.junit.jupiter.api.AfterEach; + import org.junit.jupiter.api.BeforeEach; + + public class MathTest { + + @BeforeEach + public void setUp() { + } + + @AfterEach + public void tearDown() { + } + } + """ + ) + ); + } } From ebd24fe7ccc25c073ce7aa7fdf53faaf59470a7d Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 8 Aug 2024 13:33:54 +0200 Subject: [PATCH 028/118] Remove throws from method that adopts `assertThrows` (#564) * Remove throws from method that adopts `assertThrows` * Just remove the entire throws for tests * Just remove the entire throws for tests * Remove thrown exceptions in ExpectedExceptionToAssertThrows --- .../ExpectedExceptionToAssertThrows.java | 13 +- .../testing/junit5/UpdateTestAnnotation.java | 2 + .../ExpectedExceptionToAssertThrowsTest.java | 51 +++++- .../junit5/UpdateTestAnnotationTest.java | 171 ++++++++++++------ 4 files changed, 172 insertions(+), 65 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index ea09f6f06..2e04cc991 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -15,10 +15,7 @@ */ package org.openrewrite.java.testing.junit5; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; @@ -27,6 +24,7 @@ import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.*; +import java.util.Collections; import java.util.List; /** @@ -178,6 +176,13 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl statement ); + // Clear out any declared thrown exceptions + List thrown = m.getThrows(); + if (thrown != null && !thrown.isEmpty()) { + assert m.getBody() != null; + m = m.withBody(m.getBody().withPrefix(thrown.get(0).getPrefix())).withThrows(Collections.emptyList()); + } + maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows"); if (expectMessageMethodInvocation != null && !isExpectMessageArgAMatcher && m.getBody() != null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java index dd603a9bc..da3a0eb6f 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java @@ -27,6 +27,7 @@ import org.openrewrite.java.tree.*; import org.openrewrite.marker.Markup; +import java.util.Collections; import java.util.Comparator; import java.util.Set; @@ -149,6 +150,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex .staticImports("org.junit.jupiter.api.Assertions.assertThrows") .build() .apply(updateCursor(m), m.getCoordinates().replaceBody(), cta.expectedException, lambda); + m = m.withThrows(Collections.emptyList()); maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows"); } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java b/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java index 97503ff00..55f7ae2a9 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java @@ -37,7 +37,6 @@ public void defaults(RecipeSpec spec) { .recipe(new ExpectedExceptionToAssertThrows()); } - @DocumentExample @Test void leavesOtherRulesAlone() { //language=java @@ -71,6 +70,7 @@ class MyTest { ); } + @DocumentExample @Test void expectedExceptionRule() { //language=java @@ -420,4 +420,53 @@ public void expectExceptionUseCases() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/563") + void expectedCheckedExceptionThrowsRemoved() { + //language=java + rewriteRun( + java( + """ + import java.io.IOException; + + import org.junit.Rule; + import org.junit.Test; + import org.junit.rules.ExpectedException; + + class MyTest { + + @Rule + ExpectedException thrown = ExpectedException.none(); + + @Test + public void testEmptyPath() throws IOException{ + this.thrown.expect(IOException.class); + foo(); + } + void foo() throws IOException { + throw new IOException(); + } + } + """, + """ + import java.io.IOException; + + import static org.junit.jupiter.api.Assertions.assertThrows; + import org.junit.Test; + + class MyTest { + + @Test + public void testEmptyPath() { + assertThrows(IOException.class, () -> foo()); + } + void foo() throws IOException { + throw new IOException(); + } + } + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java b/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java index 22228547c..79f76ad3c 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java @@ -43,9 +43,9 @@ void expectedNoneToAssertDoesNotThrow() { java( """ import org.junit.Test; - + public class MyTest { - + @Test(expected = Test.None.class) public void test_printLine() { int arr = new int[]{0}[0]; @@ -54,11 +54,11 @@ public void test_printLine() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - + public class MyTest { - + @Test public void test_printLine() { assertDoesNotThrow(() -> { @@ -78,9 +78,9 @@ void assertThrowsSingleLine() { java( """ import org.junit.Test; - + public class MyTest { - + @Test(expected = IllegalArgumentException.class) public void test() { throw new IllegalArgumentException("boom"); @@ -89,11 +89,11 @@ public void test() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + public class MyTest { - + @Test public void test() { assertThrows(IllegalArgumentException.class, () -> { @@ -125,11 +125,11 @@ public void test() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + public class MyTest { - + @Test public void test() { assertThrows(IndexOutOfBoundsException.class, () -> { @@ -149,9 +149,9 @@ void assertThrowsMultiLine() { java( """ import org.junit.Test; - + public class MyTest { - + @Test(expected = IllegalArgumentException.class) public void test() { String foo = "foo"; @@ -161,11 +161,11 @@ public void test() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + public class MyTest { - + @Test public void test() { assertThrows(IllegalArgumentException.class, () -> { @@ -186,9 +186,9 @@ void noTestAnnotationValues() { java( """ import org.junit.Test; - + public class MyTest { - + @Test public void test() { } @@ -196,9 +196,9 @@ public void test() { """, """ import org.junit.jupiter.api.Test; - + public class MyTest { - + @Test public void test() { } @@ -224,20 +224,20 @@ void preservesComments() { """ import org.junit.Test; import org.openrewrite.Issue; - + public class MyTest { - + // some comments @Issue("some issue") @Test public void test() { } - + // some comments @Test public void test1() { } - + @Test // some comments public void test2() { @@ -247,20 +247,20 @@ public void test2() { """ import org.junit.jupiter.api.Test; import org.openrewrite.Issue; - + public class MyTest { - + // some comments @Issue("some issue") @Test public void test() { } - + // some comments @Test public void test1() { } - + @Test // some comments public void test2() { @@ -279,9 +279,9 @@ void annotationWithTimeout() { java( """ import org.junit.Test; - + public class MyTest { - + @Test(timeout = 500) public void test() { } @@ -290,11 +290,11 @@ public void test() { """ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; - + import java.util.concurrent.TimeUnit; - + public class MyTest { - + @Test @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) public void test() { @@ -323,9 +323,9 @@ public MyException(String message) { """ import com.abc.MyException; import org.junit.Test; - + public class MyTest { - + @Test(expected = MyException.class) public void test() { throw new MyException("my exception"); @@ -335,11 +335,11 @@ public void test() { """ import com.abc.MyException; import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + public class MyTest { - + @Test public void test() { assertThrows(MyException.class, () -> { @@ -359,9 +359,9 @@ void annotationWithTimeoutAndException() { java( """ import org.junit.Test; - + public class MyTest { - + @Test(expected = IllegalArgumentException.class, timeout = 500) public void test() { throw new IllegalArgumentException("boom"); @@ -371,13 +371,13 @@ public void test() { """ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; - + import java.util.concurrent.TimeUnit; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + public class MyTest { - + @Test @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) public void test() { @@ -398,7 +398,7 @@ void preservesVisibilityOnTestMethodThatIsAnOverride() { java( """ package com.test; - + public interface Foo { void foo(); } @@ -407,11 +407,11 @@ public interface Foo { java( """ package com.test; - + import org.junit.Test; - + public class FooTest implements Foo { - + @Test public void foo() { } @@ -419,11 +419,11 @@ public void foo() { """, """ package com.test; - + import org.junit.jupiter.api.Test; - + public class FooTest implements Foo { - + @Test public void foo() { } @@ -447,7 +447,7 @@ public class MyTest { """, """ import org.junit.jupiter.api.Test; - + public class MyTest { Object o = Test.class; } @@ -463,7 +463,7 @@ void usedInJavadoc() { java( """ import org.junit.Test; - + /** @see org.junit.Test */ public class MyTest { @Test @@ -473,7 +473,7 @@ public void test() { """, """ import org.junit.jupiter.api.Test; - + /** @see org.junit.jupiter.api.Test */ public class MyTest { @Test @@ -499,7 +499,7 @@ public void feature1() { """, """ import org.junit.jupiter.api.Test; - + public class MyTest { @org.junit.jupiter.api.Test public void feature1() { @@ -521,7 +521,7 @@ public class MyTest { @org.junit.Test public void feature1() { } - + @Test public void feature2() { } @@ -529,12 +529,12 @@ public void feature2() { """, """ import org.junit.jupiter.api.Test; - + public class MyTest { @org.junit.jupiter.api.Test public void feature1() { } - + @Test public void feature2() { } @@ -543,4 +543,55 @@ public void feature2() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/563") + void removeThrowsCheckedException() { + //language=java + rewriteRun( + java( + """ + import org.junit.Test; + import java.io.IOException; + + public class MyTest { + + @Test(expected = IOException.class) + public void testWithThrows() throws IOException { + foo(); + // Second call shows why we wrap the entire method body in the lambda + foo(); + } + + void foo() throws IOException { + throw new IOException(); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import java.io.IOException; + + import static org.junit.jupiter.api.Assertions.assertThrows; + + public class MyTest { + + @Test + public void testWithThrows() { + assertThrows(IOException.class, () -> { + foo(); + // Second call shows why we wrap the entire method body in the lambda + foo(); + }); + } + + void foo() throws IOException { + throw new IOException(); + } + } + """ + ) + ); + } } From ba9e3674ecbccab51ba021e09b1b8213cb0f3761 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Thu, 8 Aug 2024 16:09:30 +0200 Subject: [PATCH 029/118] Dont convert try catch fail when return (#566) * Solves https://github.com/openrewrite/rewrite-testing-frameworks/issues/547 * Apply org.openrewrite.recipes.OpenRewriteBestPractices * Polish: strip unnecessary elements, add highlighting, consistent new lines * Illustrate missed scenario with added test * Fix failing scenario with a nested visitor --------- Co-authored-by: Laurens Westerlaken Co-authored-by: Tim te Beek --- .../junit5/RemoveTryCatchFailBlocks.java | 25 +++-- .../junit5/RemoveTryCatchFailBlocksTest.java | 106 +++++++++++++----- 2 files changed, 95 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocks.java b/src/main/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocks.java index 7e17762f6..eba2eca36 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocks.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocks.java @@ -19,16 +19,14 @@ import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; -import org.openrewrite.java.JavaVisitor; -import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.*; import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.*; import java.util.Collections; import java.util.Objects; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Stream; public class RemoveTryCatchFailBlocks extends Recipe { @@ -67,6 +65,19 @@ public J visitTry(J.Try jtry, ExecutionContext ctx) { return try_; } + // Skip if any return is found, since we can't return from `assertDoesNotThrow` + AtomicBoolean returnFound = new AtomicBoolean(false); + new JavaIsoVisitor() { + @Override + public J.Return visitReturn(J.Return _return, AtomicBoolean atomicBoolean) { + atomicBoolean.set(true); + return _return; + } + }.visit(try_, returnFound, getCursor().getParentOrThrow()); + if (returnFound.get()) { + return try_; + } + /* Only one statement in the catch block, which is a fail(), with no or a simple String argument. We would not want to convert for instance fail(cleanUpAndReturnMessage()) might still have side @@ -81,9 +92,9 @@ We would not want to convert for instance fail(cleanUpAndReturnMessage()) might return try_; } J.MethodInvocation failCall = (J.MethodInvocation) statement; - if (!ASSERT_FAIL_NO_ARG.matches(failCall) - && !ASSERT_FAIL_STRING_ARG.matches(failCall) - && !ASSERT_FAIL_THROWABLE_ARG.matches(failCall)) { + if (!ASSERT_FAIL_NO_ARG.matches(failCall) && + !ASSERT_FAIL_STRING_ARG.matches(failCall) && + !ASSERT_FAIL_THROWABLE_ARG.matches(failCall)) { return try_; } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocksTest.java b/src/test/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocksTest.java index 70afbcac4..0c68d508e 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocksTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/RemoveTryCatchFailBlocksTest.java @@ -45,7 +45,7 @@ void removeTryCatchBlock() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -60,7 +60,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -83,7 +83,7 @@ void removeStaticImportFail() { import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.fail; - + class MyTest { @Test public void testMethod() { @@ -98,7 +98,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -120,7 +120,7 @@ void removeTryCatchBlockWithoutMessage() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -135,7 +135,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -157,7 +157,7 @@ void removeTryCatchBlockWithFailString() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -172,7 +172,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -194,7 +194,7 @@ void failMethodArgIsNotGetMessage() { """ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; - + class MyTest { @Test void aTest() { @@ -204,7 +204,7 @@ void aTest() { Assertions.fail(cleanUpAndReturnMessage()); } } - + String cleanUpAndReturnMessage() { System.out.println("clean up code"); return "Oh no!"; @@ -223,7 +223,7 @@ void doesNotRunWithMultipleCatchBlocks() { """ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; - + class MyTest { @Test void aTest() { @@ -249,7 +249,7 @@ void catchHasMultipleStatements() { """ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; - + class MyTest { @Test void aTest() { @@ -275,7 +275,7 @@ void doesNotRunOnTryWithResources() { import org.junit.jupiter.api.Test; import java.io.PrintWriter; import org.junit.jupiter.api.Assertions; - + class MyTest { @Test void aTest() { @@ -299,7 +299,7 @@ void statementsBeforeAndAfterTryBlock() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -320,7 +320,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -348,7 +348,7 @@ void failWithStringThrowableArgs() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test void testMethod() { @@ -363,7 +363,7 @@ void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test void testMethod() { @@ -386,7 +386,7 @@ void failWithSupplierStringAsIdentifier() { import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.function.Supplier; - + class MyTest { @Test void testMethod() { @@ -412,7 +412,7 @@ void failWithSupplierStringAsLambda() { import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.util.function.Supplier; - + class MyTest { @Test void testMethod() { @@ -436,7 +436,7 @@ void failWithThrowable() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test void testMethod() { @@ -451,7 +451,7 @@ void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test void testMethod() { @@ -473,7 +473,7 @@ void multipleTryCatchBlocks() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -493,7 +493,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -518,7 +518,7 @@ void failHasBinaryWithException() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -533,7 +533,7 @@ public void testMethod() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -555,7 +555,7 @@ void failHasBinaryWithMethodCall() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -565,7 +565,7 @@ public void testMethod() { Assertions.fail("The error is: " + anotherMethod()); } } - + public String anotherMethod() { return "anotherMethod"; } @@ -602,7 +602,7 @@ public void testMethod() { import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import java.io.FileOutputStream; - + class MyTest { @Test public void testMethod() { @@ -625,7 +625,7 @@ void doesNotRunonTryFinally() { """ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; - + class MyTest { @Test public void testMethod() { @@ -642,4 +642,52 @@ public void testMethod() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/547") + void noChangeOnDirectReturn() { + //language=java + rewriteRun( + java( + """ + import static org.junit.jupiter.api.Assertions.fail; + + class Foo { + String getFoo() { + try { + return "foo"; + } catch (RuntimeException e) { + fail(); + } + } + } + """ + ) + ); + } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/547") + void noChangeOnNestedReturn() { + //language=java + rewriteRun( + java( + """ + import static org.junit.jupiter.api.Assertions.fail; + + class Foo { + String getBar(boolean b) { + try { + if (b) { + return "bar"; + } + } catch (RuntimeException e) { + fail(); + } + } + } + """ + ) + ); + } } From 37e96677055d68f00c6eefea91874b5664b7a107 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 11 Aug 2024 16:37:28 +0200 Subject: [PATCH 030/118] Use error-prone-contrib AssertJ recipes (#559) --- build.gradle.kts | 1 + src/main/resources/META-INF/rewrite/assertj.yml | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index c1a91eafc..f49cd8098 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { implementation("org.openrewrite.recipe:rewrite-static-analysis:$rewriteVersion") runtimeOnly("org.openrewrite:rewrite-java-17") + runtimeOnly("tech.picnic.error-prone-support:error-prone-contrib:latest.release:recipes") compileOnly("org.junit.jupiter:junit-jupiter-engine:latest.release") compileOnly("org.projectlombok:lombok:latest.release") diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 68358ba0c..e07c9bfb6 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -29,6 +29,22 @@ recipeList: - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions - org.openrewrite.java.testing.assertj.IsEqualToEmptyString + - tech.picnic.errorprone.refasterrules.AssertJBigDecimalRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJBigIntegerRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJBooleanRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJByteRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJCharSequenceRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJDoubleRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJFloatRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJIntegerRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJLongRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJNumberRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJPrimitiveRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJShortRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes + - tech.picnic.errorprone.refasterrules.AssertJThrowingCallableRulesRecipes + --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.StaticImports @@ -381,3 +397,4 @@ recipeList: version: 3.x onlyIfUsing: org.assertj.core.api.Assertions acceptTransitive: true + - tech.picnic.errorprone.refasterrules.JUnitToAssertJRulesRecipes From 8a037e86a611ec4de6bb34d8816184d4df76f0ed Mon Sep 17 00:00:00 2001 From: Marvin Date: Sun, 11 Aug 2024 19:50:32 +0000 Subject: [PATCH 031/118] Chained AssertJ assertions should be simplified to the corresponding dedicated assertion (#556) * Chained AssertJ assertions should be simplified to the corresponding dedicated assertion * Adopt Traits.methodAccess and match overrides * Apply formatter to SonarDedicatedAssertions * Fix imports * Group IsEqualTo* Logic into reusable ShortenChainedAssertJAssertion * Apply formatter * Rename to have differences stand out more * Clear out empty lines * Cover one additional case * Rename class to reflect tested recipe * Fix expectations around Path * Enable one more case after updating expected outcome * Update documented options for clarity * Move test to illustrate reliance on recipe order * Remove unnecessary classpath entry --------- Co-authored-by: Tim te Beek --- .../testing/assertj/IsEqualToBoolean.java | 76 ----- .../testing/assertj/IsEqualToEmptyString.java | 68 ----- .../assertj/SimplifyAssertJAssertion.java | 105 +++++++ .../SimplifyChainedAssertJAssertion.java | 76 ++--- .../resources/META-INF/rewrite/assertj.yml | 61 +++- .../assertj/AssertJBestPracticesTest.java | 267 +++++++++++++++++- .../testing/assertj/IsEqualToBooleanTest.java | 103 ------- .../assertj/IsEqualToEmptyStringTest.java | 61 ---- .../assertj/SimplifyAssertJAssertionTest.java | 166 +++++++++++ .../SimplifyChainedAssertJAssertionTest.java | 252 ++++++++--------- ...ainedAssertJAssertionWithOptionalTest.java | 129 --------- ...SimplifyChainedAssertJAssertionsTest.java} | 40 +-- 12 files changed, 749 insertions(+), 655 deletions(-) delete mode 100644 src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java delete mode 100644 src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java create mode 100644 src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java delete mode 100644 src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java delete mode 100644 src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java create mode 100644 src/test/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertionTest.java delete mode 100644 src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionWithOptionalTest.java rename src/test/java/org/openrewrite/java/testing/assertj/{MigrateChainedAssertToAssertJTest.java => SimplifyChainedAssertJAssertionsTest.java} (94%) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java deleted file mode 100644 index d5dec1d0c..000000000 --- a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToBoolean.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.assertj; - -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesMethod; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.J.MethodInvocation; -import org.openrewrite.java.tree.JavaType.Method; - -import java.util.Collections; - -/** - * AssertJ has a more idiomatic way of asserting that a boolean is true. This - * recipe will find instances of: - *

    - * -`assertThat(boolean).isEqualTo(true)` and replace them with `isTrue()`. - * -`assertThat(boolean).isEqualTo(false)` and replace them with `isFalse()`. - */ -public class IsEqualToBoolean extends Recipe { - - private static final MethodMatcher IS_EQUAL_TO = new MethodMatcher( - "org.assertj.core.api.AbstractBooleanAssert isEqualTo(boolean)"); - - @Override - public String getDisplayName() { - return "Convert `assertThat(String).isEqualTo(true)` to `isTrue()` and `isEqualTo(false)` to `isFalse()`"; - } - - @Override - public String getDescription() { - return "Adopt idiomatic AssertJ assertion for true booleans."; - } - - @Override - public TreeVisitor getVisitor() { - return Preconditions.check(new UsesMethod<>(IS_EQUAL_TO), new JavaIsoVisitor() { - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - MethodInvocation mi = super.visitMethodInvocation(method, ctx); - if (IS_EQUAL_TO.matches(mi)) { - String methodName; - if (J.Literal.isLiteralValue(mi.getArguments().get(0), true)) { - methodName = "isTrue"; - } else if (J.Literal.isLiteralValue(mi.getArguments().get(0), false)) { - methodName = "isFalse"; - } else { - return mi; - } - Method isBooleanMethod = mi.getMethodType().withName(methodName); - return mi.withName(mi.getName().withSimpleName(methodName).withType(isBooleanMethod)) - .withMethodType(isBooleanMethod).withArguments(Collections.emptyList()); - } - return mi; - } - }); - } -} diff --git a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java b/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java deleted file mode 100644 index fb014fd94..000000000 --- a/src/main/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyString.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.assertj; - -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesMethod; -import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.JavaType; - -import java.util.Collections; - -/** - * AssertJ has a more idiomatic way of asserting that a String is empty. - * This recipe will find instances of `assertThat(String).isEqualTo("")` and replace them with `isEmpty()`. - */ -public class IsEqualToEmptyString extends Recipe { - - private static final MethodMatcher IS_EQUAL_TO = new MethodMatcher("org.assertj.core.api.AbstractStringAssert isEqualTo(java.lang.String)"); - - @Override - public String getDisplayName() { - return "Convert `assertThat(String).isEqualTo(\"\")` to `isEmpty()`"; - } - - @Override - public String getDescription() { - return "Adopt idiomatic AssertJ assertion for empty Strings."; - } - - @Override - public TreeVisitor getVisitor() { - return Preconditions.check( - new UsesMethod<>(IS_EQUAL_TO), - new JavaIsoVisitor() { - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); - if (IS_EQUAL_TO.matches(mi) && J.Literal.isLiteralValue(mi.getArguments().get(0), "")) { - JavaType.Method isEmptyMethodType = mi.getMethodType().withName("isEmpty"); - return mi - .withName(mi.getName().withSimpleName("isEmpty").withType(isEmptyMethodType)) - .withMethodType(isEmptyMethodType) - .withArguments(Collections.emptyList()); - } - return mi; - } - } - ); - } -} diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java new file mode 100644 index 000000000..391a9e3f4 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java @@ -0,0 +1,105 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Option; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.lang.Nullable; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.TypeUtils; + +@AllArgsConstructor +@NoArgsConstructor +public class SimplifyAssertJAssertion extends Recipe { + + @Option(displayName = "AssertJ assertion", + description = "The assertion method that should be replaced.", + example = "hasSize", + required = false) + @Nullable + String assertToReplace; + + @Option(displayName = "Assertion argument literal", + description = "The literal argument passed into the assertion to replace; use \"null\" for `null`.", + example = "0") + String literalArgument; + + @Option(displayName = "Dedicated assertion", + description = "The zero argument assertion to adopt instead.", + example = "isEmpty") + String dedicatedAssertion; + + @Option(displayName = "Required type", + description = "The type of the actual assertion argument.", + example = "java.lang.String") + String requiredType; + + @Override + public String getDisplayName() { + return "Simplify AssertJ assertions with literal arguments"; + } + + @Override + public String getDescription() { + return "Simplify AssertJ assertions by replacing them with more expressiove dedicated assertions."; + } + + @Override + public TreeVisitor getVisitor() { + return new ShorthenChainedAssertJAssertionsVisitor(); + } + + private class ShorthenChainedAssertJAssertionsVisitor extends JavaIsoVisitor { + private final MethodMatcher ASSERT_THAT_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); + private final MethodMatcher ASSERT_TO_REPLACE = new MethodMatcher("org.assertj.core.api.* " + assertToReplace + "(..)"); + + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); + + // Match the end of the chain first, then the select to avoid matching the wrong method chain + if (!ASSERT_TO_REPLACE.matches(mi) || !ASSERT_THAT_MATCHER.matches(mi.getSelect())) { + return mi; + } + + // Compare argument with passed in literal + if (!(mi.getArguments().get(0) instanceof J.Literal) || + !literalArgument.equals(((J.Literal) mi.getArguments().get(0)).getValueSource())) { // Implies "null" is `null` + return mi; + } + + // Check argument type of assertThat + if (!TypeUtils.isAssignableTo(requiredType, ((J.MethodInvocation) mi.getSelect()).getArguments().get(0).getType())) { + return mi; + } + + // Assume zero argument replacement method + return JavaTemplate.builder(dedicatedAssertion + "()") + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replaceMethod()); + } + } +} diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java index 881bce47a..d84b1179a 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java @@ -38,29 +38,29 @@ @AllArgsConstructor @NoArgsConstructor public class SimplifyChainedAssertJAssertion extends Recipe { - @Option(displayName = "AssertJ Assertion", + @Option(displayName = "AssertJ chained assertion", description = "The chained AssertJ assertion to move to dedicated assertion.", example = "equals", required = false) @Nullable String chainedAssertion; - @Option(displayName = "AssertJ Assertion", + @Option(displayName = "AssertJ replaced assertion", description = "The AssertJ assert that should be replaced.", example = "isTrue", required = false) @Nullable String assertToReplace; - @Option(displayName = "AssertJ Assertion", + @Option(displayName = "AssertJ replacement assertion", description = "The AssertJ method to migrate to.", example = "isEqualTo", required = false) @Nullable String dedicatedAssertion; - @Option(displayName = "Required Type", - description = "Specifies the type the recipe should run on.", + @Option(displayName = "Required type", + description = "The type of the actual assertion argument.", example = "java.lang.String", required = false) @Nullable @@ -120,11 +120,6 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocat List arguments = new ArrayList<>(); arguments.add(actual); - // Special case for more expressive assertions: assertThat(x.size()).isEqualTo(0) -> isEmpty() - if ("size".equals(chainedAssertion) && "isEqualTo".equals(assertToReplace) && hasZeroArgument(mi)) { - return applyTemplate("assertThat(#{any()}).isEmpty()", arguments, mi, ctx); - } - String template = getStringTemplateAndAppendArguments(assertThatArg, mi, arguments); return applyTemplate(String.format(template, dedicatedAssertion), arguments, mi, ctx); } @@ -136,38 +131,38 @@ private J.MethodInvocation applyTemplate(String formattedTemplate, List arguments) { - Expression assertThatArgument = assertThatArg.getArguments().get(0); - Expression methodToReplaceArgument = methodToReplace.getArguments().get(0); - boolean assertThatArgumentIsEmpty = assertThatArgument instanceof J.Empty; - boolean methodToReplaceArgumentIsEmpty = methodToReplaceArgument instanceof J.Empty; + private String getStringTemplateAndAppendArguments(J.MethodInvocation assertThatArg, J.MethodInvocation methodToReplace, List arguments) { + Expression assertThatArgument = assertThatArg.getArguments().get(0); + Expression methodToReplaceArgument = methodToReplace.getArguments().get(0); + boolean assertThatArgumentIsEmpty = assertThatArgument instanceof J.Empty; + boolean methodToReplaceArgumentIsEmpty = methodToReplaceArgument instanceof J.Empty; - // If both arguments are empty, then the select is already added to the arguments list, and we use a minimal template - if (assertThatArgumentIsEmpty && methodToReplaceArgumentIsEmpty) { - return "assertThat(#{any()}).%s()"; - } - - // If both arguments are not empty, then we add both to the arguments to the arguments list, and return a template with two arguments - if (!assertThatArgumentIsEmpty && !methodToReplaceArgumentIsEmpty) { - // This should only happen for map assertions using a key and value - arguments.add(assertThatArgument); - arguments.add(methodToReplaceArgument); - return "assertThat(#{any()}).%s(#{any()}, #{any()})"; - } + // If both arguments are empty, then the select is already added to the arguments list, and we use a minimal template + if (assertThatArgumentIsEmpty && methodToReplaceArgumentIsEmpty) { + return "assertThat(#{any()}).%s()"; + } - // If either argument is empty, we choose which one to add to the arguments list, and optionally extract the select - arguments.add(extractEitherArgument(assertThatArgumentIsEmpty, assertThatArgument, methodToReplaceArgument)); + // If both arguments are not empty, then we add both to the arguments to the arguments list, and return a template with two arguments + if (!assertThatArgumentIsEmpty && !methodToReplaceArgumentIsEmpty) { + // This should only happen for map assertions using a key and value + arguments.add(assertThatArgument); + arguments.add(methodToReplaceArgument); + return "assertThat(#{any()}).%s(#{any()}, #{any()})"; + } - // Special case for Path.of() assertions - if ("java.nio.file.Path".equals(requiredType) && dedicatedAssertion.contains("Raw") - && TypeUtils.isAssignableTo("java.lang.String", assertThatArgument.getType())) { - return "assertThat(#{any()}).%s(Path.of(#{any()}))"; - } + // If either argument is empty, we choose which one to add to the arguments list, and optionally extract the select + arguments.add(extractEitherArgument(assertThatArgumentIsEmpty, assertThatArgument, methodToReplaceArgument)); - return "assertThat(#{any()}).%s(#{any()})"; + // Special case for Path.of() assertions + if ("java.nio.file.Path".equals(requiredType) && dedicatedAssertion.contains("Raw") + && TypeUtils.isAssignableTo("java.lang.String", assertThatArgument.getType())) { + maybeAddImport("java.nio.file.Path"); + return "assertThat(#{any()}).%s(Path.of(#{any()}))"; + } + return "assertThat(#{any()}).%s(#{any()})"; + } } private static Expression extractEitherArgument(boolean assertThatArgumentIsEmpty, Expression assertThatArgument, Expression methodToReplaceArgument) { @@ -183,13 +178,4 @@ private static Expression extractEitherArgument(boolean assertThatArgumentIsEmpt } return assertThatArgument; } - - private boolean hasZeroArgument(J.MethodInvocation method) { - List arguments = method.getArguments(); - if (arguments.size() == 1 && arguments.get(0) instanceof J.Literal) { - J.Literal literalArg = (J.Literal) arguments.get(0); - return literalArg.getValue() != null && literalArg.getValue().equals(0); - } - return false; - } } diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index e07c9bfb6..7dcfc91b9 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -25,9 +25,8 @@ recipeList: - org.openrewrite.java.testing.hamcrest.MigrateHamcrestToAssertJ - org.openrewrite.java.testing.assertj.JUnitToAssertj - org.openrewrite.java.testing.assertj.StaticImports - - org.openrewrite.java.testing.assertj.IsEqualToBoolean - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions - - org.openrewrite.java.testing.assertj.IsEqualToEmptyString + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertions - tech.picnic.errorprone.refasterrules.AssertJBigDecimalRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJBigIntegerRulesRecipes @@ -67,7 +66,7 @@ recipeList: type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions displayName: Simplify AssertJ chained assertions -description: Replace AssertJ chained assertions with dedicated assertions that function the same. +description: Replace AssertJ assertions where a method is called on the actual value with a dedicated assertion. tags: - testing - assertj @@ -364,11 +363,67 @@ recipeList: assertToReplace: isFalse dedicatedAssertion: isExhausted requiredType: java.util.Iterator + # Object assertions - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: chainedAssertion: toString assertToReplace: isEqualTo dedicatedAssertion: hasToString requiredType: java.lang.Object + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: equals + assertToReplace: isTrue + dedicatedAssertion: isEqualTo + requiredType: java.lang.Object + +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.testing.assertj.SimplifyAssertJAssertions +displayName: Shorten AssertJ assertions +description: Replace AssertJ assertions where a dedicated assertion is available for the same actual value. +tags: + - testing + - assertj +recipeList: + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: isEqualTo + literalArgument: "null" + dedicatedAssertion: isNull + requiredType: java.lang.Object + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: isEqualTo + literalArgument: true + dedicatedAssertion: isTrue + requiredType: java.lang.Boolean + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: isEqualTo + literalArgument: '""' + dedicatedAssertion: isEmpty + requiredType: java.lang.String + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: isEqualTo + literalArgument: false + dedicatedAssertion: isFalse + requiredType: java.lang.Boolean + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: hasSize + literalArgument: 0 + dedicatedAssertion: isEmpty + requiredType: java.lang.String + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: hasSize + literalArgument: 0 + dedicatedAssertion: isEmpty + requiredType: java.io.File + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: hasSize + literalArgument: 0 + dedicatedAssertion: isEmpty + requiredType: java.util.Collection + - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: + assertToReplace: hasSize + literalArgument: 0 + dedicatedAssertion: isEmpty + requiredType: java.util.Map --- type: specs.openrewrite.org/v1beta/recipe diff --git a/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java index 4252b33ff..f96060d54 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java @@ -15,29 +15,39 @@ */ package org.openrewrite.java.testing.assertj; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import java.util.stream.Stream; + +import static org.junit.jupiter.params.provider.Arguments.arguments; import static org.openrewrite.java.Assertions.java; class AssertJBestPracticesTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) + spec.parser( + JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) .recipeFromResources("org.openrewrite.java.testing.assertj.Assertj"); } @DocumentExample @Test + @SuppressWarnings("DataFlowIssue") void convertsIsEqualToEmptyString() { rewriteRun( - //language=java + // language=java java( """ import static org.assertj.core.api.Assertions.assertThat; @@ -58,4 +68,255 @@ void test() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/398") + void sizeIsEqualToZeroToIsEmpty() { + //language=java + rewriteRun( + java( + """ + import java.util.List; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void testMethod(List list) { + assertThat(list.size()).isEqualTo(0); + } + } + """, + """ + import java.util.List; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void testMethod(List list) { + assertThat(list).isEmpty(); + } + } + """ + ) + ); + } + + /** + * Chained AssertJ assertions should be simplified to the corresponding dedicated assertion, as + * per java:S5838 + */ + @Nested + class SonarDedicatedAssertions { + private static Stream replacements() { + return Stream.of( + // Related to Object + arguments("Object", "assertThat(x).isEqualTo(null)", "assertThat(x).isNull()"), + arguments("Boolean", "assertThat(x).isEqualTo(true)", "assertThat(x).isTrue()"), + arguments("Boolean", "assertThat(x).isEqualTo(false)", "assertThat(x).isFalse()"), + arguments("Object", "assertThat(x.equals(y)).isTrue()", "assertThat(x).isEqualTo(y)"), +// arguments("Object", "assertThat(x == y).isTrue()", "assertThat(x).isSameAs(y)"), +// arguments("Object", "assertThat(x == null).isTrue()", "assertThat(x).isNull()"), + arguments( + "Object", + "assertThat(x.toString()).isEqualTo(\"y\")", + "assertThat(x).hasToString(\"y\")"), +// arguments( +// "Object", +// "assertThat(x.hashCode()).isEqualTo(y.hashCode())", +// "assertThat(x).hasSameHashCodeAs(y)"), +// arguments( +// "Object", +// "assertThat(x instanceof String).isTrue()", +// "assertThat(x).isInstanceOf(String.class)"), + // Related to Comparable +// arguments( +// "java.math.BigDecimal", +// "assertThat(x.compareTo(y)).isZero()", +// "assertThat(x).isEqualByComparingTo(y)"), +// arguments( +// "int", "assertThat(x >= y).isTrue()", "assertThat(x).isGreaterThanOrEqualTo(y)"), +// arguments("long", "assertThat(x > y).isTrue()", "assertThat(x).isGreaterThan(y)"), +// arguments( +// "double", "assertThat(x <= y).isTrue()", "assertThat(x).isLessThanOrEqualTo(y)"), +// arguments("float", "assertThat(x < y).isTrue()", "assertThat(x).isLessThan(y)"), + // Related to String + arguments("String", "assertThat(x.isEmpty()).isTrue()", "assertThat(x).isEmpty()"), + arguments("String", "assertThat(x).hasSize(0)", "assertThat(x).isEmpty()"), + arguments("String", "assertThat(x.equals(y)).isTrue()", "assertThat(x).isEqualTo(y)"), + arguments( + "String", + "assertThat(x.equalsIgnoreCase(y)).isTrue()", + "assertThat(x).isEqualToIgnoringCase(y)"), + arguments("String", "assertThat(x.contains(y)).isTrue()", "assertThat(x).contains(y)"), + arguments( + "String", "assertThat(x.startsWith(y)).isTrue()", "assertThat(x).startsWith(y)"), + arguments("String", "assertThat(x.endsWith(y)).isTrue()", "assertThat(x).endsWith(y)"), + arguments("String", "assertThat(x.matches(y)).isTrue()", "assertThat(x).matches(y)"), + arguments("String", "assertThat(x.trim()).isEmpty()", "assertThat(x).isBlank()"), + arguments("String", "assertThat(x.length()).isEqualTo(5)", "assertThat(x).hasSize(5)"), +// arguments("String", "assertThat(x).hasSize(y.length())", "assertThat(x).hasSameSizeAs(y)"), + // Related to File + arguments("java.io.File", "assertThat(x).hasSize(0)", "assertThat(x).isEmpty()"), + arguments("java.io.File", "assertThat(x.length()).isZero()", "assertThat(x).isEmpty()"), + arguments( + "java.io.File", "assertThat(x.length()).isEqualTo(3)", "assertThat(x).hasSize(3)"), + arguments("java.io.File", "assertThat(x.canRead()).isTrue()", "assertThat(x).canRead()"), + arguments( + "java.io.File", "assertThat(x.canWrite()).isTrue()", "assertThat(x).canWrite()"), + arguments("java.io.File", "assertThat(x.exists()).isTrue()", "assertThat(x).exists()"), + arguments( + "java.io.File", + "assertThat(x.getName()).isEqualTo(\"a\")", + "assertThat(x).hasName(\"a\")"), + arguments( + "java.io.File", + "assertThat(x.getParent()).isEqualTo(\"b\")", + "assertThat(x).hasParent(\"b\")"), + arguments( + "java.io.File", + "assertThat(x.getParentFile()).isNull()", + "assertThat(x).hasNoParent()"), + arguments( + "java.io.File", "assertThat(x.isAbsolute()).isTrue()", "assertThat(x).isAbsolute()"), + arguments( + "java.io.File", "assertThat(x.isAbsolute()).isFalse()", "assertThat(x).isRelative()"), + arguments( + "java.io.File", + "assertThat(x.isDirectory()).isTrue()", + "assertThat(x).isDirectory()"), + arguments("java.io.File", "assertThat(x.isFile()).isTrue()", "assertThat(x).isFile()"), + arguments( + "java.io.File", "assertThat(x.list()).isEmpty()", "assertThat(x).isEmptyDirectory()"), + // Related to Path + arguments( + "java.nio.file.Path", + "assertThat(x.startsWith(\"x\")).isTrue()", + "assertThat(x).startsWithRaw(Path.of(\"x\"))"), + arguments( + "java.nio.file.Path", + "assertThat(x.endsWith(\"y\")).isTrue()", + "assertThat(x).endsWithRaw(Path.of(\"y\"))"), + arguments( + "java.nio.file.Path", + "assertThat(x.getParent()).isEqualTo(y)", + "assertThat(x).hasParentRaw(y)"), + arguments( + "java.nio.file.Path", + "assertThat(x.getParent()).isNull()", + "assertThat(x).hasNoParentRaw()"), + arguments( + "java.nio.file.Path", + "assertThat(x.isAbsolute()).isTrue()", + "assertThat(x).isAbsolute()"), + arguments( + "java.nio.file.Path", + "assertThat(x.isAbsolute()).isFalse()", + "assertThat(x).isRelative()"), + // Related to Array +// arguments("Object[]", "assertThat(x.length).isZero()", "assertThat(x).isEmpty()"), +// arguments("String[]", "assertThat(x.length).isEqualTo(7)", "assertThat(x).hasSize(7)"), +// arguments( +// "int[]", +// "assertThat(x.length).isEqualTo(y.length)", +// "assertThat(x).hasSameSizeAs(y)"), +// arguments( +// "boolean[]", +// "assertThat(x.length).isLessThanOrEqualTo(2)", +// "assertThat(x).hasSizeLessThanOrEqualTo(2)"), +// arguments( +// "double[]", "assertThat(x.length).isLessThan(5)", "assertThat(x).hasSizeLessThan(5)"), +// arguments( +// "long[]", +// "assertThat(x.length).isGreaterThan(4)", +// "assertThat(x).hasSizeGreaterThan(4)"), +// arguments( +// "char[]", +// "assertThat(x.length).isGreaterThanOrEqualTo(1)", +// "assertThat(x).hasSizeGreaterThanOrEqualTo(1)"), + // Related to Collection + arguments( + "java.util.Collection", + "assertThat(x.isEmpty()).isTrue()", + "assertThat(x).isEmpty()"), + arguments( + "java.util.Collection", + "assertThat(x.size()).isZero()", + "assertThat(x).isEmpty()"), + arguments( + "java.util.Collection", + "assertThat(x.contains(\"f\")).isTrue()", + "assertThat(x).contains(\"f\")"), + arguments( + "java.util.Collection", + "assertThat(x.containsAll(y)).isTrue()", + "assertThat(x).containsAll(y)"), + // Related to Map +// arguments( +// "java.util.Map", +// "assertThat(x).hasSize(y.size())", +// "assertThat(x).hasSameSizeAs(y)"), + arguments( + "java.util.Map", + "assertThat(x.containsKey(\"b\")).isTrue()", + "assertThat(x).containsKey(\"b\")"), + arguments( + "java.util.Map", + "assertThat(x.keySet()).contains(\"b\")", + "assertThat(x).containsKey(\"b\")"), + arguments( + "java.util.Map", + "assertThat(x.keySet()).containsOnly(\"a\")", + "assertThat(x).containsOnlyKeys(\"a\")"), + arguments( + "java.util.Map", + "assertThat(x.containsValue(value)).isTrue()", + "assertThat(x).containsValue(value)"), + arguments( + "java.util.Map", + "assertThat(x.values()).contains(value)", + "assertThat(x).containsValue(value)"), + arguments( + "java.util.Map", + "assertThat(x.get(\"a\")).isEqualTo(value)", + "assertThat(x).containsEntry(\"a\", value)"), + // Related to Optional + arguments( + "java.util.Optional", + "assertThat(x.isPresent()).isTrue()", + "assertThat(x).isPresent()"), + arguments( + "java.util.Optional", + "assertThat(x.get()).isEqualTo(value)", + "assertThat(x).contains(value)"), + arguments( + "java.util.Optional", + "assertThat(x.get()).isSameAs(value)", + "assertThat(x).containsSame(value)")); + } + + @ParameterizedTest + @MethodSource("replacements") + void sonarReplacements( + String argumentsType, String assertToReplace, String dedicatedAssertion) { + String template = + """ + import %1$s; + import static org.assertj.core.api.Assertions.assertThat; + + class A { + void test(%2$s x, %2$s y, Object value) { + %3$s; + } + } + """; + String imprt = argumentsType + .replaceAll("^([A-Z])", "java.lang.$1") + .replaceAll("<.*>", ""); + rewriteRun( + java( + template.formatted(imprt, argumentsType, assertToReplace), + template.formatted(imprt, argumentsType, dedicatedAssertion))); + } + } } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java deleted file mode 100644 index e00d2d055..000000000 --- a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToBooleanTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.assertj; - -import org.junit.jupiter.api.Test; -import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; - -import static org.openrewrite.java.Assertions.java; - -class IsEqualToBooleanTest implements RewriteTest { - - @Override - public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) - .recipe(new IsEqualToBoolean()); - } - - @DocumentExample - @Test - void convertsIsEqualToTrue() { - rewriteRun( - // language=java - java( - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test() { - assertThat(true).isEqualTo(true); - } - } - """, - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test() { - assertThat(true).isTrue(); - } - } - """ - ) - ); - } - - @Test - void convertsIsEqualToFalse() { - rewriteRun( - // language=java - java( - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test() { - assertThat(false).isEqualTo(false); - } - } - """, - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test() { - assertThat(false).isFalse(); - } - } - """ - ) - ); - } - - @Test - void noChangeOnVariable() { - rewriteRun( - // language=java - java( - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test(boolean b) { - assertThat(false).isEqualTo(b); - } - } - """ - ) - ); - } -} diff --git a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java b/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java deleted file mode 100644 index 61a41413e..000000000 --- a/src/test/java/org/openrewrite/java/testing/assertj/IsEqualToEmptyStringTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.assertj; - -import org.junit.jupiter.api.Test; -import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; - -import static org.openrewrite.java.Assertions.java; - -class IsEqualToEmptyStringTest implements RewriteTest { - - @Override - public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) - .recipe(new IsEqualToEmptyString()); - } - - @DocumentExample - @Test - void convertsIsEqualToEmptyString() { - rewriteRun( - // language=java - java( - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test() { - assertThat("test").isEqualTo(""); - } - } - """, - """ - import static org.assertj.core.api.Assertions.assertThat; - class Test { - void test() { - assertThat("test").isEmpty(); - } - } - """ - ) - ); - } -} diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertionTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertionTest.java new file mode 100644 index 000000000..32ddb3b93 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertionTest.java @@ -0,0 +1,166 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class SimplifyAssertJAssertionTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")); + } + + @Test + void primitiveBooleanIsFalse() { + rewriteRun( + spec -> spec.recipe(new SimplifyAssertJAssertion("isEqualTo", "false", "isFalse", "boolean")), + //language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(false).isEqualTo(false); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat(false).isFalse(); + } + } + """ + ) + ); + } + + @Test + void objectBooleanIsFalse() { + rewriteRun( + spec -> spec.recipe(new SimplifyAssertJAssertion("isEqualTo", "false", "isFalse", "java.lang.Boolean")), + //language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test(Boolean arg) { + assertThat(arg).isEqualTo(false); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test(Boolean arg) { + assertThat(arg).isFalse(); + } + } + """ + ) + ); + } + + + @DocumentExample + @Test + void convertsStringIsEqualToNull() { + rewriteRun( + spec -> spec.recipe(new SimplifyAssertJAssertion("isEqualTo", "null", "isNull", "java.lang.Object")), + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test(String a) { + assertThat(a).isEqualTo(null); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test(String a) { + assertThat(a).isNull(); + } + } + """ + ) + ); + } + + @Test + void convertsObjectIsEqualToNull() { + rewriteRun( + spec -> spec.recipe(new SimplifyAssertJAssertion("isEqualTo", "null", "isNull", "java.lang.Object")), + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test(Object o) { + assertThat(o).isEqualTo(null); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test(Object o) { + assertThat(o).isNull(); + } + } + """ + ) + ); + } + + + @Test + void convertsIsEqualToEmptyString() { + rewriteRun( + spec -> spec.recipe(new SimplifyAssertJAssertion("isEqualTo", "\"\"", "isEmpty", "java.lang.String")), + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat("test").isEqualTo(""); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + class Test { + void test() { + assertThat("test").isEmpty(); + } + } + """ + ) + ); + } + +} diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java index f50cd45f5..8ed5669a3 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java @@ -16,6 +16,7 @@ package org.openrewrite.java.testing.assertj; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; @@ -30,8 +31,7 @@ class SimplifyChainedAssertJAssertionTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec - .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), - "junit-jupiter-api-5.9", "assertj-core-3.24")); + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")); } @DocumentExample @@ -42,24 +42,18 @@ void stringIsEmpty() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat("hello world".isEmpty()).isTrue(); } } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat("hello world").isEmpty(); } @@ -76,18 +70,18 @@ void stringIsEmptyDescribedAs() { spec -> spec.recipe(new SimplifyChainedAssertJAssertion("isEmpty", "isTrue", "isEmpty", "java.lang.String")), //language=java java( - """ + """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod(String actual) { assertThat(actual.isEmpty()).as("Reason").isTrue(); } } """, - """ + """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod(String actual) { assertThat(actual).as("Reason").isEmpty(); @@ -108,32 +102,26 @@ void chainedRecipes() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString().isEmpty()).isTrue(); } - + String getString() { return "hello world"; } } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString()).isEmpty(); } - + String getString() { return "hello world"; } @@ -153,38 +141,30 @@ void chainedRecipesOfDifferingTypes() { //language=java java( """ - import org.junit.jupiter.api.Test; - import java.nio.file.Path; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void string(String actual) { assertThat(actual.startsWith("prefix")).isTrue(); } - @Test void path(Path actual) { assertThat(actual.startsWith("prefix")).isTrue(); } } """, """ - import org.junit.jupiter.api.Test; - import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void string(String actual) { assertThat(actual).startsWith("prefix"); } - @Test void path(Path actual) { assertThat(actual).startsWithRaw(Path.of("prefix")); } @@ -201,34 +181,28 @@ void assertThatArgHasArgument() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { String expected = "hello world"; assertThat(getString().equalsIgnoreCase(expected)).isTrue(); } - + String getString() { return "hello world"; } } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { String expected = "hello world"; assertThat(getString()).isEqualToIgnoringCase(expected); } - + String getString() { return "hello world"; } @@ -245,34 +219,28 @@ void replacementHasArgument() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { int length = 5; assertThat(getString().length()).isEqualTo(length); } - + String getString() { return "hello world"; } } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { int length = 5; assertThat(getString()).hasSize(length); } - + String getString() { return "hello world"; } @@ -290,32 +258,26 @@ void normalCase() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString().trim()).isEmpty(); } - + String getString() { return "hello world"; } } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString()).isBlank(); } - + String getString() { return "hello world"; } @@ -335,12 +297,9 @@ void stringContains() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat("hello world".contains("lo wo")).isTrue(); assertThat("hello world".contains("lll")).isFalse(); @@ -348,12 +307,9 @@ void testMethod() { } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat("hello world").contains("lo wo"); assertThat("hello world").doesNotContain("lll"); @@ -372,40 +328,36 @@ void mapMethodDealsWithTwoArguments() { //language=java java( """ - import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { String key = "key"; String value = "value"; assertThat(getMap().get(key)).isEqualTo(value); } - + Map getMap() { return Collections.emptyMap(); } } """, """ - import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { String key = "key"; String value = "value"; assertThat(getMap()).containsEntry(key, value); } - + Map getMap() { return Collections.emptyMap(); } @@ -422,32 +374,26 @@ void isNotEmptyTest() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString().isEmpty()).isFalse(); } - + String getString() { return "hello world"; } } """, """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString()).isNotEmpty(); } - + String getString() { return "hello world"; } @@ -464,16 +410,13 @@ void doesNoRunOnWrongCombination() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { - @Test void testMethod() { assertThat(getString().isBlank()).isFalse(); } - + String getString() { return "hello world"; } @@ -483,42 +426,83 @@ String getString() { ); } - @Test - @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/398") - void sizeIsEqualToZeroToIsEmpty() { - rewriteRun( - spec -> spec.recipe(new SimplifyChainedAssertJAssertion("size", "isEqualTo", "hasSize", "java.util.List")), - //language=java - java( - """ - import org.junit.jupiter.api.Test; - import java.util.List; - - import static org.assertj.core.api.Assertions.assertThat; - - class MyTest { - @Test - void testMethod() { - List objectIdentifies = List.of(); - assertThat(objectIdentifies.size()).isEqualTo(0); - } - } - """, - """ - import org.junit.jupiter.api.Test; - import java.util.List; - - import static org.assertj.core.api.Assertions.assertThat; - - class MyTest { - @Test - void testMethod() { - List objectIdentifies = List.of(); - assertThat(objectIdentifies).isEmpty(); - } - } - """ - ) - ); + @Nested + class OptionalAssertions { + + @Test + void simplifyPresenceAssertion() { + rewriteRun( + spec -> spec.recipes( + new SimplifyChainedAssertJAssertion("isPresent", "isTrue", "isPresent", "java.util.Optional"), + new SimplifyChainedAssertJAssertion("isEmpty", "isTrue", "isEmpty", "java.util.Optional"), + new SimplifyChainedAssertJAssertion("isPresent", "isFalse", "isNotPresent", "java.util.Optional"), + new SimplifyChainedAssertJAssertion("isEmpty", "isFalse", "isNotEmpty", "java.util.Optional") + ), + //language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + import java.util.Optional; + + class Test { + void simpleTest(Optional o) { + assertThat(o.isPresent()).isTrue(); + assertThat(o.isEmpty()).isTrue(); + assertThat(o.isPresent()).isFalse(); + assertThat(o.isEmpty()).isFalse(); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + import java.util.Optional; + + class Test { + void simpleTest(Optional o) { + assertThat(o).isPresent(); + assertThat(o).isEmpty(); + assertThat(o).isNotPresent(); + assertThat(o).isNotEmpty(); + } + } + """ + ) + ); + } + + @Test + void simplifiyEqualityAssertion() { + rewriteRun( + spec -> spec.recipes( + new SimplifyChainedAssertJAssertion("get", "isEqualTo", "contains", "java.util.Optional"), + new SimplifyChainedAssertJAssertion("get", "isSameAs", "containsSame", "java.util.Optional") + ), + //language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + import java.util.Optional; + + class Test { + void simpleTest(Optional o) { + assertThat(o.get()).isEqualTo("foo"); + assertThat(o.get()).isSameAs("foo"); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + import java.util.Optional; + + class Test { + void simpleTest(Optional o) { + assertThat(o).contains("foo"); + assertThat(o).containsSame("foo"); + } + } + """ + ) + ); + } } } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionWithOptionalTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionWithOptionalTest.java deleted file mode 100644 index 8b515a371..000000000 --- a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionWithOptionalTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.assertj; - -import org.junit.jupiter.api.Test; -import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; - -import static org.openrewrite.java.Assertions.java; - -class SimplifyChainedAssertJAssertionWithOptionalTest implements RewriteTest { - @Override - public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), - "junit-jupiter-api-5.9", "assertj-core-3.24")); - } - - - @DocumentExample - @Test - void simplifyPresenceAssertion() { - rewriteRun( - spec -> spec.recipes( - new SimplifyChainedAssertJAssertion("isPresent", "isTrue", "isPresent", "java.util.Optional"), - new SimplifyChainedAssertJAssertion("isEmpty", "isTrue", "isEmpty", "java.util.Optional"), - new SimplifyChainedAssertJAssertion("isPresent", "isFalse", "isNotPresent", "java.util.Optional"), - new SimplifyChainedAssertJAssertion("isEmpty", "isFalse", "isNotEmpty", "java.util.Optional") - ), - //language=java - java( - """ - import static org.assertj.core.api.Assertions.assertThat; - import java.util.Optional; - import org.junit.jupiter.api.Test; - - class Test { - - @Test - void simpleTest() { - Optional o = Optional.empty(); - assertThat(o.isPresent()).isTrue(); - assertThat(o.isEmpty()).isTrue(); - assertThat(o.isPresent()).isFalse(); - assertThat(o.isEmpty()).isFalse(); - } - } - """, - """ - import static org.assertj.core.api.Assertions.assertThat; - import java.util.Optional; - import org.junit.jupiter.api.Test; - - class Test { - - @Test - void simpleTest() { - Optional o = Optional.empty(); - assertThat(o).isPresent(); - assertThat(o).isEmpty(); - assertThat(o).isNotPresent(); - assertThat(o).isNotEmpty(); - } - } - """ - ) - ); - } - - @Test - void simplifiyEqualityAssertion() { - rewriteRun( - spec -> spec.recipes( - new SimplifyChainedAssertJAssertion("get", "isEqualTo", "contains", "java.util.Optional"), - new SimplifyChainedAssertJAssertion("get", "isSameAs", "containsSame", "java.util.Optional") - ), - //language=java - java( - """ - import static org.assertj.core.api.Assertions.assertThat; - import java.util.Optional; - import org.junit.jupiter.api.Test; - - class Test { - - @Test - void simpleTest() { - Optional o = Optional.empty(); - assertThat(o.get()).isEqualTo("foo"); - assertThat(o.get()).isSameAs("foo"); - } - } - """, - """ - import static org.assertj.core.api.Assertions.assertThat; - import java.util.Optional; - import org.junit.jupiter.api.Test; - - class Test { - - @Test - void simpleTest() { - Optional o = Optional.empty(); - assertThat(o).contains("foo"); - assertThat(o).containsSame("foo"); - } - } - """ - ) - ); - } - -} diff --git a/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java similarity index 94% rename from src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java rename to src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java index 51d071685..874d6480b 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/MigrateChainedAssertToAssertJTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java @@ -34,14 +34,12 @@ import static org.openrewrite.java.Assertions.java; -class MigrateChainedAssertToAssertJTest implements RewriteTest { +class SimplifyChainedAssertJAssertionsTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() - .classpathFromResources(new InMemoryExecutionContext(), - "junit-jupiter-api-5.9", - "assertj-core-3.24")) + .classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) .recipe(Environment.builder() .scanRuntimeClasspath("org.openrewrite.java.testing.assertj") .build() @@ -57,25 +55,19 @@ void stringIsEmptyExample() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void testMethod() { String s = "hello world"; assertThat(s.isEmpty()).isTrue(); } } """, - """ - import org.junit.jupiter.api.Test; - + """ import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void testMethod() { String s = "hello world"; assertThat(s).isEmpty(); @@ -106,12 +98,10 @@ private static Stream stringReplacements() { void stringReplacements(String chainedAssertion, String assertToReplace, String dedicatedAssertion, String firstArg, String secondArg) { //language=java String template = """ - import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void test() { int length = 5; String expected = "hello world"; @@ -161,13 +151,11 @@ private static Stream fileReplacements() { void fileReplacements(String chainedAssertion, String assertToReplace, String dedicatedAssertion, String firstArg, String secondArg) { //language=java String template = """ - import org.junit.jupiter.api.Test; import java.io.File; import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void test() { int length = 5; String name = "hello world"; @@ -209,14 +197,12 @@ private static Stream pathReplacements() { void pathReplacements(String chainedAssertion, String assertToReplace, String dedicatedAssertion, String firstArg, String secondArg) { //language=java String template = """ - import org.junit.jupiter.api.Test; import java.nio.file.Path; import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void test() { Path path = Paths.get(""); %s @@ -302,14 +288,12 @@ private static Stream mapReplacements() { void mapReplacements(String chainedAssertion, String assertToReplace, String dedicatedAssertion, String firstArg, String secondArg) { //language=java String template = """ - import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void test() { Map otherMap = Collections.emptyMap(); String key = "key"; @@ -343,13 +327,11 @@ void mapHasSameSizeAs() { //language=java java( """ - import org.junit.jupiter.api.Test; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void testMethod() { Map mapA = Map.of(); Map mapB = Map.of(); @@ -358,13 +340,11 @@ void testMethod() { } """, """ - import org.junit.jupiter.api.Test; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void testMethod() { Map mapA = Map.of(); Map mapB = Map.of(); @@ -392,13 +372,11 @@ private static Stream optionalReplacements() { void optionalReplacements(String chainedAssertion, String assertToReplace, String dedicatedAssertion, String arg) { //language=java String template = """ - import org.junit.jupiter.api.Test; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; class MyTest { - @Test void test() { String something = "hello world"; Optional helloWorld = Optional.of("hello world"); @@ -455,7 +433,7 @@ void test(Iterator iterator, Iterator otherIterator) { ); } } - + @Nested class Objects { @Test @@ -464,8 +442,6 @@ void objectoToStringReplacement() { //language=java java( """ - import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThat; class MyTest { @@ -475,9 +451,7 @@ void testMethod(Object argument) { } } """, - """ - import org.junit.jupiter.api.Test; - + """ import static org.assertj.core.api.Assertions.assertThat; class MyTest { From b1e8bf08db18b4fc6a4eebc116fe438e262a88db Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 12 Aug 2024 09:59:42 +0200 Subject: [PATCH 032/118] Context free SimplifyAssertJAssertion (#570) * Context free SimplifyAssertJAssertion * Apply suggestions from code review Co-authored-by: Knut Wannheden --------- Co-authored-by: Knut Wannheden --- .../java/testing/assertj/SimplifyAssertJAssertion.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java index 391a9e3f4..56a787bad 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java @@ -95,11 +95,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocat } // Assume zero argument replacement method - return JavaTemplate.builder(dedicatedAssertion + "()") - .contextSensitive() + return JavaTemplate.builder("#{any()}." + dedicatedAssertion + "()") .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply(getCursor(), mi.getCoordinates().replaceMethod()); + .apply(getCursor(), mi.getCoordinates().replace(), mi.getSelect()); } } } From 41f6e03b75b7cefbde8a1d39305b08a3c16befc4 Mon Sep 17 00:00:00 2001 From: Shannon Pamperl Date: Wed, 14 Aug 2024 09:11:45 -0500 Subject: [PATCH 033/118] refactor: Update Gradle wrapper (#576) Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.gradle.UpdateGradleWrapper?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 3990 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3bc9bad7e..7a8b121b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab +distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a From 17b0427564e5fa1d56b29f96469b7aea8c672210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20Schn=C3=A9ider?= Date: Thu, 15 Aug 2024 05:34:40 -0400 Subject: [PATCH 034/118] Migrate to JSpecify from OpenRewrite JSR-305 meta-annotations (#580) * Migrate to JSpecify from OpenRewrite JSR-305 meta-annotations Use this link to re-run the recipe: https://app.moderne.io/builder/gW3xaSLWV?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne * Move nullable annotations on lazy init JavaParser.Builder --------- Co-authored-by: Moderne Co-authored-by: Tim te Beek --- .../testing/assertj/SimplifyAssertJAssertion.java | 2 +- .../assertj/SimplifyChainedAssertJAssertion.java | 2 +- .../java/testing/assertj/package-info.java | 4 ++-- .../java/testing/cleanup/SimplifyTestThrows.java | 2 +- .../cleanup/TestsShouldIncludeAssertions.java | 2 +- .../testing/cleanup/TestsShouldNotBePublic.java | 2 +- .../java/testing/cleanup/package-info.java | 4 ++-- .../testing/hamcrest/HamcrestMatcherToAssertJ.java | 2 +- .../hamcrest/HamcrestNotMatcherToAssertJ.java | 2 +- .../java/testing/hamcrest/package-info.java | 4 ++-- .../java/testing/jmockit/JMockitBlockRewriter.java | 2 +- .../java/testing/jmockit/package-info.java | 4 ++-- .../testing/junit5/AddJupiterDependencies.java | 2 +- .../java/testing/junit5/AddMissingNested.java | 2 +- .../java/testing/junit5/AssertToAssertions.java | 2 +- .../junit5/ExpectedExceptionToAssertThrows.java | 5 ++--- .../java/testing/junit5/GradleUseJunitJupiter.java | 2 +- .../junit5/JUnitParamsRunnerToParameterized.java | 5 ++--- .../java/testing/junit5/MigrateJUnitTestCase.java | 4 ++-- .../junit5/ParameterizedRunnerToParameterized.java | 2 +- .../java/testing/junit5/RunnerToExtension.java | 2 +- .../testing/junit5/TemporaryFolderToTempDir.java | 14 +++++++------- .../java/testing/junit5/TestRuleToTestInfo.java | 8 +++----- .../java/testing/junit5/UpdateMockWebServer.java | 5 ++--- .../java/testing/junit5/UpdateTestAnnotation.java | 9 ++++----- .../java/testing/junit5/UseTestMethodOrder.java | 6 +++--- .../java/testing/junit5/package-info.java | 4 ++-- .../java/testing/mockito/AnyToNullable.java | 2 +- .../testing/mockito/CleanupMockitoImports.java | 2 +- .../mockito/PowerMockitoMockStaticToMockito.java | 6 +++--- .../java/testing/mockito/package-info.java | 4 ++-- .../java/testing/testcontainers/package-info.java | 4 ++-- 32 files changed, 58 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java index 56a787bad..1d3685955 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java @@ -17,11 +17,11 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java index d84b1179a..bfbf9fc43 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java @@ -17,11 +17,11 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/assertj/package-info.java b/src/main/java/org/openrewrite/java/testing/assertj/package-info.java index 6f32eb963..44f3754e0 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/package-info.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked package org.openrewrite.java.testing.assertj; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/SimplifyTestThrows.java b/src/main/java/org/openrewrite/java/testing/cleanup/SimplifyTestThrows.java index 2c97e26bf..a33911d34 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/SimplifyTestThrows.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/SimplifyTestThrows.java @@ -15,8 +15,8 @@ */ package org.openrewrite.java.testing.cleanup; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.*; diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java index de89e78f6..82e4290f0 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java @@ -17,8 +17,8 @@ import lombok.EqualsAndHashCode; import lombok.Value; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java index 7ea4850ce..c8dfe2387 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java @@ -19,12 +19,12 @@ import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; import lombok.Value; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Option; import org.openrewrite.ScanningRecipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.ChangeMethodAccessLevelVisitor; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.MethodMatcher; diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/package-info.java b/src/main/java/org/openrewrite/java/testing/cleanup/package-info.java index 100496815..59fc9b2c0 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/package-info.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked package org.openrewrite.java.testing.cleanup; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java b/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java index 8f0a6958c..345373b61 100644 --- a/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java +++ b/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java @@ -17,8 +17,8 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestNotMatcherToAssertJ.java b/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestNotMatcherToAssertJ.java index eaa9b8dbe..1f235ea35 100644 --- a/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestNotMatcherToAssertJ.java +++ b/src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestNotMatcherToAssertJ.java @@ -17,8 +17,8 @@ import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/hamcrest/package-info.java b/src/main/java/org/openrewrite/java/testing/hamcrest/package-info.java index 7f9f59ac6..e6e451241 100644 --- a/src/main/java/org/openrewrite/java/testing/hamcrest/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/hamcrest/package-info.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked @NonNullFields package org.openrewrite.java.testing.hamcrest; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; import org.openrewrite.internal.lang.NonNullFields; diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java index 5544bb5d3..4dc1df56f 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java @@ -18,9 +18,9 @@ import lombok.AccessLevel; import lombok.Data; import lombok.Setter; +import org.jspecify.annotations.Nullable; import org.openrewrite.Cursor; import org.openrewrite.ExecutionContext; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.JavaVisitor; diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java b/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java index 85365fe33..af3338fa5 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/package-info.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked package org.openrewrite.java.testing.jmockit; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java b/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java index 928a7646f..889ec1a9d 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java @@ -17,12 +17,12 @@ import lombok.EqualsAndHashCode; import lombok.Value; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.gradle.marker.GradleDependencyConfiguration; import org.openrewrite.gradle.marker.GradleProject; import org.openrewrite.groovy.GroovyIsoVisitor; import org.openrewrite.groovy.tree.G; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.dependencies.AddDependency; import org.openrewrite.maven.MavenIsoVisitor; import org.openrewrite.maven.tree.ResolvedDependency; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java b/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java index 547b25a08..844d832e4 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java @@ -17,11 +17,11 @@ import lombok.EqualsAndHashCode; import lombok.Value; +import org.jspecify.annotations.NonNull; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.lang.NonNull; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AssertToAssertions.java b/src/main/java/org/openrewrite/java/testing/junit5/AssertToAssertions.java index 497713472..4c9f4caaa 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AssertToAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AssertToAssertions.java @@ -15,12 +15,12 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.ChangeMethodTargetToStatic; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.search.UsesType; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index 2e04cc991..fd62333f7 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -15,9 +15,9 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; @@ -58,8 +58,7 @@ public TreeVisitor getVisitor() { public static class ExpectedExceptionToAssertThrowsVisitor extends JavaIsoVisitor { - @Nullable - private JavaParser.Builder javaParser; + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java b/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java index 995408803..8fbe83308 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java @@ -17,6 +17,7 @@ import lombok.EqualsAndHashCode; import lombok.Value; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; @@ -25,7 +26,6 @@ import org.openrewrite.groovy.GroovyIsoVisitor; import org.openrewrite.groovy.tree.G; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.MethodMatcher; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java b/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java index 420046147..5c0e2e3ac 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java @@ -15,9 +15,9 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.Expression; @@ -176,8 +176,7 @@ public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ct */ private static class ParametersNoArgsImplicitMethodSource extends JavaIsoVisitor { - @Nullable - private JavaParser.Builder javaParser; + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java index ea1e1870c..0e07eed51 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java @@ -15,12 +15,12 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.FindAnnotations; import org.openrewrite.java.search.UsesType; @@ -39,7 +39,7 @@ public class MigrateJUnitTestCase extends Recipe { private static final AnnotationMatcher JUNIT_AFTER_ANNOTATION_MATCHER = new AnnotationMatcher("@org.junit.*After*"); private static final AnnotationMatcher JUNIT_BEFORE_ANNOTATION_MATCHER = new AnnotationMatcher("@org.junit.*Before*"); - private static boolean isSupertypeTestCase(@Nullable JavaType.FullyQualified fullyQualified) { + private static boolean isSupertypeTestCase(JavaType.@Nullable FullyQualified fullyQualified) { if (fullyQualified == null || fullyQualified.getSupertype() == null || "java.lang.Object".equals(fullyQualified.getFullyQualifiedName())) { return false; } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java b/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java index fa8d51a3e..269390a54 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java @@ -15,9 +15,9 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.*; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/RunnerToExtension.java b/src/main/java/org/openrewrite/java/testing/junit5/RunnerToExtension.java index 660f756b6..90f9f71fc 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/RunnerToExtension.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/RunnerToExtension.java @@ -19,8 +19,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import lombok.EqualsAndHashCode; import lombok.Value; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java index 7137f3ada..d67f5b5a9 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java @@ -15,11 +15,11 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.*; @@ -49,8 +49,8 @@ public TreeVisitor getVisitor() { final AnnotationMatcher classRule = new AnnotationMatcher("@org.junit.ClassRule"); final AnnotationMatcher rule = new AnnotationMatcher("@org.junit.Rule"); - @Nullable - private JavaParser.Builder javaParser; + + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { @@ -157,8 +157,8 @@ private J convertToNewFile(J.MethodInvocation mi, ExecutionContext ctx) { private static class AddNewFolderMethod extends JavaIsoVisitor { private final J.MethodInvocation methodInvocation; - @Nullable - private JavaParser.Builder javaParser; + + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { @@ -236,8 +236,8 @@ private static class TranslateNewFolderMethodInvocation extends JavaVisitor javaParser; + + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java b/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java index 28cef3cad..53e3c4fb0 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java @@ -15,12 +15,12 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; @@ -54,8 +54,7 @@ private static class TestRuleToTestInfoVisitor extends JavaIsoVisitor javaParser; + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { @@ -162,8 +161,7 @@ private static class BeforeMethodToTestInfoVisitor extends JavaIsoVisitor javaParser; + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateMockWebServer.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateMockWebServer.java index 05eb54297..3c6389e1b 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateMockWebServer.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateMockWebServer.java @@ -15,9 +15,9 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.AnnotationMatcher; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; @@ -70,8 +70,7 @@ public TreeVisitor getVisitor() { new UsesType<>("okhttp3.mockwebserver.MockWebServer", false) ), new JavaIsoVisitor() { - @Nullable - private JavaParser.Builder javaParser; + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java index da3a0eb6f..743ccb69d 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java @@ -15,12 +15,12 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.FindImports; import org.openrewrite.java.search.UsesType; @@ -54,8 +54,8 @@ public TreeVisitor getVisitor() { private static class UpdateTestAnnotationVisitor extends JavaIsoVisitor { private static final AnnotationMatcher JUNIT4_TEST = new AnnotationMatcher("@org.junit.Test"); - @Nullable - private JavaParser.Builder javaParser; + + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { @@ -182,8 +182,7 @@ private static class ChangeTestAnnotation extends JavaIsoVisitor javaParser; + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java b/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java index 41e4f8127..5fa7ef266 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java @@ -15,11 +15,11 @@ */ package org.openrewrite.java.testing.junit5; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; @@ -45,8 +45,8 @@ public String getDescription() { public TreeVisitor getVisitor() { return Preconditions.check(new UsesType<>("org.junit.FixMethodOrder", false), new JavaIsoVisitor() { - @Nullable - private JavaParser.Builder javaParser; + + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { if (javaParser == null) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/package-info.java b/src/main/java/org/openrewrite/java/testing/junit5/package-info.java index db2dbd7ea..b05bb236e 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/package-info.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked @NonNullFields package org.openrewrite.java.testing.junit5; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; import org.openrewrite.internal.lang.NonNullFields; diff --git a/src/main/java/org/openrewrite/java/testing/mockito/AnyToNullable.java b/src/main/java/org/openrewrite/java/testing/mockito/AnyToNullable.java index d9a201b17..8595085d2 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/AnyToNullable.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/AnyToNullable.java @@ -15,8 +15,8 @@ */ package org.openrewrite.java.testing.mockito; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.ChangeMethodName; import org.openrewrite.java.ChangeMethodTargetToStatic; import org.openrewrite.java.tree.J; diff --git a/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java b/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java index b8e63c553..2a120e833 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java @@ -15,11 +15,11 @@ */ package org.openrewrite.java.testing.mockito; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index edec2dd80..4c8def8f0 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -15,9 +15,9 @@ */ package org.openrewrite.java.testing.mockito; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.internal.ListUtils; -import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.*; import org.openrewrite.java.search.FindAnnotations; import org.openrewrite.java.search.UsesType; @@ -210,7 +210,7 @@ private static boolean isFieldAlreadyDefined(J.Block classBody, String fieldName return false; } - private static @Nullable J.MethodDeclaration getFirstTestMethod(List methods) { + private static J.@Nullable MethodDeclaration getFirstTestMethod(List methods) { for (J.MethodDeclaration methodDeclaration : methods) { for (J.Annotation annotation : methodDeclaration.getLeadingAnnotations()) { if ("Test".equals(annotation.getSimpleName())) { @@ -567,7 +567,7 @@ private J.MethodInvocation modifyWhenMethodInvocation(J.MethodInvocation whenMet return null; } - private @Nullable J.Identifier getFieldIdentifier(String fieldName) { + private J.@Nullable Identifier getFieldIdentifier(String fieldName) { return getMockedTypesFields().keySet().stream() .filter(identifier -> identifier.getSimpleName().equals(fieldName)).findFirst() .orElseGet(() -> { diff --git a/src/main/java/org/openrewrite/java/testing/mockito/package-info.java b/src/main/java/org/openrewrite/java/testing/mockito/package-info.java index 208941548..3a3ec2512 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/package-info.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked package org.openrewrite.java.testing.mockito; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/org/openrewrite/java/testing/testcontainers/package-info.java b/src/main/java/org/openrewrite/java/testing/testcontainers/package-info.java index 956a3fb3f..4d843dc72 100644 --- a/src/main/java/org/openrewrite/java/testing/testcontainers/package-info.java +++ b/src/main/java/org/openrewrite/java/testing/testcontainers/package-info.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -@NonNullApi +@NullMarked package org.openrewrite.java.testing.testcontainers; -import org.openrewrite.internal.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; From da544f83adab0975be2d4cd841fb1a51d42306c8 Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Fri, 16 Aug 2024 21:43:14 +1000 Subject: [PATCH 035/118] Convert lambda block to expression after adopting `assertThrows` (#582) * Update UpdateTestAnnotationTest.java Test case for inlining valid single line assertthrows * Revert accidental whitespace changes * Also use doAfterVisit LambdaBlockToExpression in ExpectedExceptionToAssertThrows * Pull over commit from parallel PR * Also apply LambdaBlockToExpression after AssertJ migration * Update expected outcome --------- Co-authored-by: Tim te Beek --- ...UnitAssertThrowsToAssertExceptionType.java | 16 ++--- .../ExpectedExceptionToAssertThrows.java | 9 ++- .../testing/junit5/UpdateTestAnnotation.java | 3 + ...AssertThrowsToAssertExceptionTypeTest.java | 15 +++-- .../ExpectedExceptionToAssertThrowsTest.java | 6 +- .../junit5/UpdateTestAnnotationTest.java | 62 +++++++++++++++---- 6 files changed, 77 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java index 07f55f5b1..10eb1b5f2 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java @@ -26,6 +26,7 @@ import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; +import org.openrewrite.staticanalysis.LambdaBlockToExpression; public class JUnitAssertThrowsToAssertExceptionType extends Recipe { @@ -45,18 +46,7 @@ public TreeVisitor getVisitor() { } private static class AssertExceptionTypeVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - private static final MethodMatcher ASSERT_THROWS_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertThrows(..)"); - private static final JavaType THROWING_CALLABLE_TYPE = JavaType.buildType("org.assertj.core.api.ThrowableAssert.ThrowingCallable"); @Override @@ -77,7 +67,7 @@ && getCursor().getParentTreeCursor().getValue() instanceof J.Block) { if (executable != null) { mi = JavaTemplate .builder("assertThatExceptionOfType(#{any(java.lang.Class)}).isThrownBy(#{any(org.assertj.core.api.ThrowableAssert.ThrowingCallable)})") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .staticImports("org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType") .build() .apply( @@ -88,6 +78,8 @@ && getCursor().getParentTreeCursor().getValue() instanceof J.Block) { maybeAddImport("org.assertj.core.api.AssertionsForClassTypes", "assertThatExceptionOfType", false); maybeRemoveImport("org.junit.jupiter.api.Assertions.assertThrows"); maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + doAfterVisit(new LambdaBlockToExpression().getVisitor()); } } return mi; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index fd62333f7..17c4cfd91 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -23,6 +23,7 @@ import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.*; +import org.openrewrite.staticanalysis.LambdaBlockToExpression; import java.util.Collections; import java.util.List; @@ -158,10 +159,6 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl "Exception.class" : expectMethodInvocation.getArguments().get(0); String templateString = expectedExceptionParam instanceof String ? "#{}assertThrows(#{}, () -> #{any()});" : "#{}assertThrows(#{any()}, () -> #{any()});"; - - Statement statement = bodyWithoutExpectedExceptionCalls.getStatements().size() == 1 && - !(bodyWithoutExpectedExceptionCalls.getStatements().get(0) instanceof J.Throw) ? - bodyWithoutExpectedExceptionCalls.getStatements().get(0) : bodyWithoutExpectedExceptionCalls; m = JavaTemplate.builder(templateString) .contextSensitive() .javaParser(javaParser(ctx)) @@ -172,7 +169,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl m.getCoordinates().replaceBody(), exceptionDeclParam, expectedExceptionParam, - statement + bodyWithoutExpectedExceptionCalls ); // Clear out any declared thrown exceptions @@ -225,6 +222,8 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl maybeAddImport("org.hamcrest.MatcherAssert", "assertThat"); } + doAfterVisit(new LambdaBlockToExpression().getVisitor()); + return m; } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java index 743ccb69d..f7f3314b8 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java @@ -26,6 +26,7 @@ import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.*; import org.openrewrite.marker.Markup; +import org.openrewrite.staticanalysis.LambdaBlockToExpression; import java.util.Collections; import java.util.Comparator; @@ -170,6 +171,8 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex maybeAddImport("org.junit.jupiter.api.Test"); } + doAfterVisit(new LambdaBlockToExpression().getVisitor()); + return super.visitMethodDeclaration(m, ctx); } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java b/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java index d9651278b..1b5e7fd24 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java @@ -35,6 +35,7 @@ public void defaults(RecipeSpec spec) { .recipe(new JUnitAssertThrowsToAssertExceptionType()); } + @SuppressWarnings({"Convert2MethodRef", "CodeBlock2Expr"}) @DocumentExample @Test void toAssertExceptionOfType() { @@ -47,9 +48,12 @@ void toAssertExceptionOfType() { public class SimpleExpectedExceptionTest { public void throwsExceptionWithSpecificType() { assertThrows(NullPointerException.class, () -> { - throw new NullPointerException(); + foo(); }); } + void foo() { + throw new NullPointerException(); + } } """, """ @@ -57,9 +61,11 @@ public void throwsExceptionWithSpecificType() { public class SimpleExpectedExceptionTest { public void throwsExceptionWithSpecificType() { - assertThatExceptionOfType(NullPointerException.class).isThrownBy(() -> { - throw new NullPointerException(); - }); + assertThatExceptionOfType(NullPointerException.class).isThrownBy(() -> + foo()); + } + void foo() { + throw new NullPointerException(); } } """ @@ -127,6 +133,7 @@ public void throwsExceptionWithSpecificType() { * A degenerate case showing we need to make sure the assertThrows appears * immediately inside a J.Block. */ + @SuppressWarnings("ThrowableNotThrown") @Test @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/pull/331") void assertThrowsTernaryAssignment() { diff --git a/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java b/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java index 55f7ae2a9..c5b4f7835 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrowsTest.java @@ -106,7 +106,8 @@ class MyTest { @Test public void testEmptyPath() { - Throwable exception = assertThrows(IllegalArgumentException.class, () -> foo()); + Throwable exception = assertThrows(IllegalArgumentException.class, () -> + foo()); assertTrue(exception.getMessage().contains("Invalid location: gs://")); } void foo() { @@ -459,7 +460,8 @@ class MyTest { @Test public void testEmptyPath() { - assertThrows(IOException.class, () -> foo()); + assertThrows(IOException.class, () -> + foo()); } void foo() throws IOException { throw new IOException(); diff --git a/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java b/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java index 79f76ad3c..b6e3c950e 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotationTest.java @@ -106,6 +106,46 @@ public void test() { ); } + @Test + void assertThrowsSingleLineInlined() { + //language=java + rewriteRun( + java( + """ + import org.junit.Test; + + class MyTest { + + @Test(expected = IllegalArgumentException.class) + public void test() { + foo(); + } + private void foo() { + throw new IllegalArgumentException("boom"); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + assertThrows(IllegalArgumentException.class, () -> + foo()); + } + private void foo() { + throw new IllegalArgumentException("boom"); + } + } + """ + ) + ); + } + @SuppressWarnings("ConstantConditions") @Test void assertThrowsSingleStatement() { @@ -113,16 +153,16 @@ void assertThrowsSingleStatement() { rewriteRun( java( """ - import org.junit.Test; - - public class MyTest { - - @Test(expected = IndexOutOfBoundsException.class) - public void test() { - int arr = new int[]{}[0]; - } + import org.junit.Test; + + public class MyTest { + + @Test(expected = IndexOutOfBoundsException.class) + public void test() { + int arr = new int[]{}[0]; } - """, + } + """, """ import org.junit.jupiter.api.Test; @@ -562,7 +602,7 @@ public void testWithThrows() throws IOException { // Second call shows why we wrap the entire method body in the lambda foo(); } - + void foo() throws IOException { throw new IOException(); } @@ -585,7 +625,7 @@ public void testWithThrows() { foo(); }); } - + void foo() throws IOException { throw new IOException(); } From b885d120f522eba1edbc74947da962d4696fc37a Mon Sep 17 00:00:00 2001 From: Fiete <41323592+FieteO@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:14:42 +0200 Subject: [PATCH 036/118] Only add `hamcrest-junit` dependency when using `assertThat` or `assumeThat` (#577) * remove hamcrest-junit dependency when migrating from JUnit 4 to 5 * Only add Hamcrest JUnit dependency when assertThat or assumeThat is used * Create scanner visitors once * Also create scanner visitor once * Add missing trailing newline * No need to scan for AddDependency * Move recipe to fix reference from junit5.yml --------- Co-authored-by: Tim te Beek --- .../junit5/AddHamcrestJUnitDependency.java | 89 ++++++++++++ .../resources/META-INF/rewrite/junit5.yml | 8 +- .../AddHamcrestJUnitDependencyTest.java | 132 ++++++++++++++++++ 3 files changed, 222 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependency.java create mode 100644 src/test/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependencyTest.java diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependency.java b/src/main/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependency.java new file mode 100644 index 000000000..915d17ec1 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependency.java @@ -0,0 +1,89 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.ScanningRecipe; +import org.openrewrite.Tree; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.dependencies.AddDependency; +import org.openrewrite.java.tree.JavaSourceFile; +import org.openrewrite.java.tree.JavaType; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class AddHamcrestJUnitDependency extends ScanningRecipe { + + @Override + public String getDisplayName() { + return "Add Hamcrest JUnit dependency"; + } + + @Override + public String getDescription() { + return "Add Hamcrest JUnit dependency only if JUnit 4's `assertThat` or `assumeThat` is used."; + } + + @Override + public AtomicBoolean getInitialValue(ExecutionContext ctx) { + return new AtomicBoolean(false); + } + + @Override + public TreeVisitor getScanner(AtomicBoolean acc) { + // No need to scan for AddDependency, as we'll unconditionally add the dependency if we find a match below + MethodMatcher methodMatcher = new MethodMatcher("org.junit.Ass* *That(..)"); + return new TreeVisitor() { + @Override + public Tree preVisit(Tree tree, ExecutionContext ctx) { + stopAfterPreVisit(); + if (tree instanceof JavaSourceFile && !acc.get()) { + for (JavaType.Method type : ((JavaSourceFile) tree).getTypesInUse().getUsedMethods()) { + if (methodMatcher.matches(type)) { + acc.set(true); + } + } + } + return tree; + } + }; + } + + @Override + public TreeVisitor getVisitor(AtomicBoolean acc) { + if (acc.get()) { + // We can unconditionally add the dependency here + return new AddDependency( + "org.hamcrest", + "hamcrest-junit", + "2.x", + null, + null, + null, + null, + null, + null, + "test", + null, + null, + null, + true + ).getVisitor(); + } + return TreeVisitor.noop(); + } +} diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index bb7521451..92d44185c 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -65,6 +65,7 @@ recipeList: groupId: org.apache.maven.surefire artifactId: surefire-junit* - org.openrewrite.java.testing.junit5.UpgradeSurefirePlugin + - org.openrewrite.java.testing.junit5.AddHamcrestJUnitDependency - org.openrewrite.java.testing.junit5.UseHamcrestAssertThat - org.openrewrite.java.testing.junit5.MigrateAssumptions - org.openrewrite.java.testing.junit5.UseMockitoExtension @@ -160,13 +161,6 @@ tags: - junit - hamcrest recipeList: - - org.openrewrite.java.dependencies.AddDependency: - groupId: org.hamcrest - artifactId: hamcrest-junit - version: 2.x - scope: test - onlyIfUsing: org.junit.Assume - acceptTransitive: true - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: org.junit.Assume assumeThat(..) fullyQualifiedTargetTypeName: org.hamcrest.junit.MatcherAssume diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependencyTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependencyTest.java new file mode 100644 index 000000000..f4877f12a --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/junit5/AddHamcrestJUnitDependencyTest.java @@ -0,0 +1,132 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.intellij.lang.annotations.Language; +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.maven.Assertions.pomXml; + +class AddHamcrestJUnitDependencyTest implements RewriteTest { + + @Language("xml") + private static final String POM_BEFORE = """ + + org.example + project + 1.0-SNAPSHOT + + + junit + junit + 4.13.2 + test + + + + """; + + @Language("xml") + private static final String POM_AFTER = """ + + org.example + project + 1.0-SNAPSHOT + + + junit + junit + 4.13.2 + test + + + org.hamcrest + hamcrest-junit + 2.0.0.0 + test + + + + """; + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new AddHamcrestJUnitDependency()) + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), + "hamcrest", + "junit-4")); + + } + + @Test + @DocumentExample + void shouldAddWhenUsingAssertThat() { + rewriteRun( + //language=java + java( + """ + class FooTest { + void bar() { + org.junit.Assert.assertThat("a", org.hamcrest.Matchers.is("a")); + } + } + """ + ), + pomXml(POM_BEFORE, POM_AFTER) + ); + } + + @Test + void shouldAddWhenUsingAssumeThat() { + rewriteRun( + //language=java + java( + """ + class FooTest { + void bar() { + org.junit.Assume.assumeThat("a", org.hamcrest.Matchers.is("a")); + } + } + """ + ), + pomXml(POM_BEFORE, POM_AFTER) + ); + } + + @Test + void shouldNotAddWhenUsingAssertTrue() { + rewriteRun( + //language=java + java( + """ + class FooTest { + void bar() { + org.junit.Assume.assumeTrue(true); + org.junit.Assert.assertTrue(true); + } + } + """ + ), + pomXml(POM_BEFORE) + ); + } +} From 3412efbd62dd4d155dd633b1674e54a1cdd023db Mon Sep 17 00:00:00 2001 From: SMIT MALKAN Date: Sun, 18 Aug 2024 01:32:27 +0530 Subject: [PATCH 037/118] Collapse consecutive `assertThat` statements (#373) (#392) * added recipe to collapse consecutive AssertThat statements (#373) * Apply formatter and remove unused builder * fixed formatting (#373) * Fix test indentation and type issues * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/main/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatements.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Apply suggestions from code review * Strip out unnecessary elements from tests * Remove test with compilation error * First round of conventions applied * Apply quick old suggestion * Showcase an issue with incorrect use of `extracting` * Alternative implementation without index or nested visitors just yet * Compare types for the last unit test to pass * Further simplification * Remove need for autoformat * Do not duplicate indent, but guess continuation indent * Make collapse of assertThat part of best practices * Only retain last newline --------- Co-authored-by: Tim te Beek Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- ...llapseConsecutiveAssertThatStatements.java | 130 +++++++ .../resources/META-INF/rewrite/assertj.yml | 2 + ...seConsecutiveAssertThatStatementsTest.java | 320 ++++++++++++++++++ 3 files changed, 452 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatements.java create mode 100644 src/test/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatementsTest.java diff --git a/src/main/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatements.java b/src/main/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatements.java new file mode 100644 index 000000000..478474ef8 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatements.java @@ -0,0 +1,130 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.openrewrite.*; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.SemanticallyEqual; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Incubating(since = "2.17.0") +public class CollapseConsecutiveAssertThatStatements extends Recipe { + private static final MethodMatcher ASSERT_THAT = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); + + @Override + public String getDisplayName() { + return "Collapse consecutive `assertThat` statements"; + } + + @Override + public String getDescription() { + return "Collapse consecutive `assertThat` statements into single `assertThat` chained statement. This recipe ignores `assertThat` statements that have method invocation as parameter."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesMethod<>(ASSERT_THAT), new JavaIsoVisitor() { + @Override + public J.Block visitBlock(J.Block block, ExecutionContext ctx) { + J.Block bl = super.visitBlock(block, ctx); + + List statementsCollapsed = new ArrayList<>(); + for (List group : getGroupedStatements(bl)) { + if (group.size() <= 1) { + statementsCollapsed.addAll(group); + } else { + statementsCollapsed.add(getCollapsedAssertThat(group)); + } + } + + return bl.withStatements(statementsCollapsed); + } + + private List> getGroupedStatements(J.Block bl) { + List originalStatements = bl.getStatements(); + List> groupedStatements = new ArrayList<>(); + Expression currentActual = null; // The actual argument of the current group of assertThat statements + List currentGroup = new ArrayList<>(); + for (Statement statement : originalStatements) { + if (statement instanceof J.MethodInvocation) { + J.MethodInvocation assertion = (J.MethodInvocation) statement; + if (isGroupableAssertion(assertion)) { + J.MethodInvocation assertThat = (J.MethodInvocation) assertion.getSelect(); + assert assertThat != null; + Expression actual = assertThat.getArguments().get(0); + if (currentActual == null || !SemanticallyEqual.areEqual(currentActual, actual)) { + // Conclude the previous group + groupedStatements.add(currentGroup); + currentGroup = new ArrayList<>(); + currentActual = actual; + } + currentGroup.add(statement); + continue; + } + } + + // Conclude the previous group, and start a new group + groupedStatements.add(currentGroup); + currentGroup = new ArrayList<>(); + currentActual = null; + // The current statement should not be grouped with any other statement + groupedStatements.add(Collections.singletonList(statement)); + } + if (!currentGroup.isEmpty()) { + // Conclude the last group + groupedStatements.add(currentGroup); + } + return groupedStatements; + } + + private boolean isGroupableAssertion(J.MethodInvocation assertion) { + // Only match method invocations where the select is an assertThat, containing a non-method call argument + if (ASSERT_THAT.matches(assertion.getSelect())) { + J.MethodInvocation assertThat = (J.MethodInvocation) assertion.getSelect(); + if (assertThat != null && !(assertThat.getArguments().get(0) instanceof MethodCall)) { + return TypeUtils.isOfType(assertThat.getType(), assertion.getType()); + } + } + return false; + } + + private J.MethodInvocation getCollapsedAssertThat(List consecutiveAssertThatStatement) { + assert !consecutiveAssertThatStatement.isEmpty(); + Space originalPrefix = consecutiveAssertThatStatement.get(0).getPrefix(); + String continuationIndent = originalPrefix.getIndent().contains("\t") ? "\t\t" : " "; + Space indentedNewline = Space.format(originalPrefix.getLastWhitespace().replaceAll("^\\s+\n", "\n") + + continuationIndent); + J.MethodInvocation collapsed = null; + for (Statement st : consecutiveAssertThatStatement) { + J.MethodInvocation assertion = (J.MethodInvocation) st; + J.MethodInvocation assertThat = (J.MethodInvocation) assertion.getSelect(); + assert assertThat != null; + J.MethodInvocation newSelect = collapsed == null ? assertThat : collapsed; + collapsed = assertion.getPadding().withSelect(JRightPadded + .build((Expression) newSelect.withPrefix(Space.EMPTY)) + .withAfter(indentedNewline)); + } + return collapsed.withPrefix(originalPrefix); + } + }); + } +} diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 7dcfc91b9..28b7eae0b 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -44,6 +44,8 @@ recipeList: - tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJThrowingCallableRulesRecipes + - org.openrewrite.java.testing.assertj.CollapseConsecutiveAssertThatStatements + --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.StaticImports diff --git a/src/test/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatementsTest.java b/src/test/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatementsTest.java new file mode 100644 index 000000000..fdf25e35a --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/assertj/CollapseConsecutiveAssertThatStatementsTest.java @@ -0,0 +1,320 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class CollapseConsecutiveAssertThatStatementsTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3.24")) + .recipe(new CollapseConsecutiveAssertThatStatements()); + } + + @DocumentExample + @Test + void collapseIfConsecutiveAssertThatPresent() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + assertThat(listA).isNotNull(); + assertThat(listA).hasSize(3); + assertThat(listA).containsExactly("a", "b", "c"); + } + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """, + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + assertThat(listA) + .isNotNull() + .hasSize(3) + .containsExactly("a", "b", "c"); + } + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """ + ) + ); + } + + @Test + void collapseIfMultipleConsecutiveAssertThatPresent() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + // Comment nor whitespace below duplicated + assertThat(listA).isNotNull(); + assertThat(listA).hasSize(3); + assertThat(listA).containsExactly("a", "b", "c"); + + List listB = Arrays.asList("a", "b", "c"); + + assertThat(listB).isNotNull(); + assertThat(listB).hasSize(3); + } + + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """, + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + // Comment nor whitespace below duplicated + assertThat(listA) + .isNotNull() + .hasSize(3) + .containsExactly("a", "b", "c"); + + List listB = Arrays.asList("a", "b", "c"); + + assertThat(listB) + .isNotNull() + .hasSize(3); + } + + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """ + ) + ); + } + + @Test + void collapseIfMultipleConsecutiveAssertThatPresent2() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest2 { + void test() { + List listA = Arrays.asList("a", "b", "c"); + assertThat(listA).isNotNull(); + assertThat(listA).hasSize(3); + List listB = Arrays.asList("a", "b", "c"); + assertThat(listA).containsExactly("a", "b", "c"); + assertThat(listB).isNotNull(); + assertThat(listB).hasSize(3); + } + + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """, + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest2 { + void test() { + List listA = Arrays.asList("a", "b", "c"); + assertThat(listA) + .isNotNull() + .hasSize(3); + List listB = Arrays.asList("a", "b", "c"); + assertThat(listA).containsExactly("a", "b", "c"); + assertThat(listB) + .isNotNull() + .hasSize(3); + } + + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """ + ) + ); + } + + @Test + void ignoreIfAssertThatOnDifferentVariables() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + List listB = Arrays.asList("a", "b", "c"); + assertThat(listA).isNotNull(); + assertThat(listB).containsExactly("a", "b", "c"); + } + + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """ + ) + ); + } + + @Test + void ignoreIfAssertThatOnMethodInvocation() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + assertThat(notification()).isNotNull(); + assertThat(notification()).isTrue(); + } + private boolean notification() { + return true; + } + } + """ + ) + ); + } + + @Test + void ignoreIfAssertThatChainExists() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + assertThat(listA).containsExactly("a", "b", "c"); + assertThat(listA) + .isNotNull() + .hasSize(3); + assertThat(listA).containsExactly("a", "b", "c"); + } + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """ + ) + ); + } + + @Test + void ignoreIfStatementPresentBetweenTwoAssertThat() { + //language=java + rewriteRun( + java( + """ + import java.util.Arrays; + import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void test() { + List listA = Arrays.asList("a", "b", "c"); + assertThat(listA).isNotNull(); + int x=3; + assertThat(listA).hasSize(x); + } + private int[] notification() { + return new int[]{1, 2, 3}; + } + } + """ + ) + ); + } + + @Test + void ignoreIncorrectUseOfExtracting() { + //language=java + rewriteRun( + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Node { Node parent; Node getParent() { return parent; } } + + class MyTest { + // Should not collapse these two, even if `extracting` is used incorrectly + void b(Node node) { + assertThat(node).extracting(Node::getParent); + assertThat(node).isNotNull(); + } + } + """ + ) + ); + } +} From cd481c159bfb6ba77958a1ba1da8dfed805645dd Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 18 Aug 2024 00:11:53 +0200 Subject: [PATCH 038/118] Move `doAfterVisit` to within conditional --- .../java/testing/junit5/UpdateTestAnnotation.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java index f7f3314b8..dbe906653 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java @@ -55,7 +55,6 @@ public TreeVisitor getVisitor() { private static class UpdateTestAnnotationVisitor extends JavaIsoVisitor { private static final AnnotationMatcher JUNIT4_TEST = new AnnotationMatcher("@org.junit.Test"); - private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { @@ -66,7 +65,6 @@ private static class UpdateTestAnnotationVisitor extends JavaIsoVisitor Date: Sun, 18 Aug 2024 08:52:49 +0000 Subject: [PATCH 039/118] refactor: Remove unused imports Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.java.RemoveUnusedImports?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .../testing/jmockit/JMockitAnnotatedArgumentToMockito.java | 2 -- .../java/testing/junit5/ExpectedExceptionToAssertThrows.java | 5 ++++- .../testing/assertj/SimplifyChainedAssertJAssertionTest.java | 1 - .../java/testing/mockito/CleanupMockitoImportsTest.java | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java index a89e16e89..0bc1fe9dd 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockito.java @@ -15,9 +15,7 @@ */ package org.openrewrite.java.testing.jmockit; -import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index 17c4cfd91..1253442bf 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -16,7 +16,10 @@ package org.openrewrite.java.testing.junit5; import org.jspecify.annotations.Nullable; -import org.openrewrite.*; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java index 8ed5669a3..785822116 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java @@ -20,7 +20,6 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; diff --git a/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java b/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java index cf36f76cb..744ce019c 100755 --- a/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/CleanupMockitoImportsTest.java @@ -22,7 +22,6 @@ import org.openrewrite.kotlin.KotlinParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; -import org.openrewrite.test.TypeValidation; import static org.openrewrite.java.Assertions.java; import static org.openrewrite.kotlin.Assertions.kotlin; From 8e001a92c6c9097494db3ac21d70474dcfd2f7ca Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 18 Aug 2024 12:03:49 +0200 Subject: [PATCH 040/118] Do not register a conflict for qualified method calls --- .../testing/cleanup/RemoveTestPrefix.java | 2 +- .../testing/cleanup/RemoveTestPrefixTest.java | 34 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java b/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java index 2cb18b734..30142e99f 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefix.java @@ -127,7 +127,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, new JavaIsoVisitor() { @Override public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, AtomicBoolean atomicBoolean) { - if (method.getName().getSimpleName().equals(newMethodName)) { + if (method.getName().getSimpleName().equals(newMethodName) && method.getSelect() == null) { skip.set(true); } return super.visitMethodInvocation(method, atomicBoolean); diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java index 6cdeae91a..aa7e8e238 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/RemoveTestPrefixTest.java @@ -327,7 +327,7 @@ void tests() { @Test @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/258") - void removeTestPrefixWithClashingMethod() { + void ignoreWhenStaticImportConflicts() { rewriteRun( //language=java java( @@ -345,4 +345,36 @@ void testOf() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/258") + void removeOnQualifiedMethodDespiteConflict() { + rewriteRun( + //language=java + java( + """ + import org.junit.jupiter.api.Test; + import java.util.List; + + class FooTest { + @Test + void testOf() { + List.of(); + } + } + """, + """ + import org.junit.jupiter.api.Test; + import java.util.List; + + class FooTest { + @Test + void of() { + List.of(); + } + } + """ + ) + ); + } } From 671fe03accd83c78dbb407e9262f8208137cfa4f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 20 Aug 2024 10:59:03 +0200 Subject: [PATCH 041/118] Simplify TestsShouldNotBePublic --- .../java/testing/cleanup/TestsShouldNotBePublic.java | 10 ++++++---- .../testing/cleanup/TestsShouldNotBePublicTest.java | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java index c8dfe2387..0a6b4ebb3 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublic.java @@ -18,7 +18,6 @@ import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; -import lombok.Value; import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Option; @@ -154,9 +153,12 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex return m; } - if (m.getModifiers().stream().anyMatch(mod -> (mod.getType() == J.Modifier.Type.Public || (orProtected && mod.getType() == J.Modifier.Type.Protected))) - && Boolean.FALSE.equals(TypeUtils.isOverride(method.getMethodType())) - && hasJUnit5MethodAnnotation(m)) { + if (m.hasModifier(J.Modifier.Type.Abstract) || TypeUtils.isOverride(method.getMethodType())) { + return m; + } + + if ((m.hasModifier(J.Modifier.Type.Public) || (orProtected && m.hasModifier(J.Modifier.Type.Protected))) && + hasJUnit5MethodAnnotation(m)) { // remove public modifier doAfterVisit(new ChangeMethodAccessLevelVisitor<>(new MethodMatcher(method), null)); } diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublicTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublicTest.java index 3d9679549..6e682caac 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublicTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldNotBePublicTest.java @@ -53,7 +53,7 @@ void testMethod() { @Nested public class NestedTestClass { - + @Test void anotherTestMethod() { } @@ -198,9 +198,9 @@ void ignoreOverriddenMethod() { abstract class AbstractTest { public abstract void testMethod(); } - + class BTest extends AbstractTest { - + @Test @Override public void testMethod() { From 52502ed5df78c5cd49abb9759f5e2763594b9d5c Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 21 Aug 2024 12:57:34 +0200 Subject: [PATCH 042/118] Add JUnit Jupiter dependency to the right scope (#586) * Add JUnit Jupiter dependency to the right scope * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../junit5/AddJupiterDependencies.java | 20 ++-- .../junit5/AddJupiterDependenciesTest.java | 104 ++++++++++++++++++ 2 files changed, 114 insertions(+), 10 deletions(-) create mode 100644 src/test/java/org/openrewrite/java/testing/junit5/AddJupiterDependenciesTest.java diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java b/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java index 889ec1a9d..0c9365021 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AddJupiterDependencies.java @@ -26,7 +26,6 @@ import org.openrewrite.java.dependencies.AddDependency; import org.openrewrite.maven.MavenIsoVisitor; import org.openrewrite.maven.tree.ResolvedDependency; -import org.openrewrite.maven.tree.Scope; import org.openrewrite.xml.tree.Xml; import java.util.List; @@ -64,14 +63,14 @@ public TreeVisitor getVisitor(AddDependency.Accumulator acc return new TreeVisitor() { @Override public @Nullable Tree visit(@Nullable Tree tree, ExecutionContext ctx, Cursor parent) { - if(!(tree instanceof SourceFile)) { + if (!(tree instanceof SourceFile)) { return tree; } SourceFile s = (SourceFile) tree; - if(gv.isAcceptable(s, ctx)) { + if (gv.isAcceptable(s, ctx)) { s = (SourceFile) gv.visitNonNull(s, ctx); } - if(mv.isAcceptable(s, ctx)) { + if (mv.isAcceptable(s, ctx)) { s = (SourceFile) mv.visitNonNull(s, ctx); } return s; @@ -81,7 +80,7 @@ public TreeVisitor getVisitor(AddDependency.Accumulator acc private static AddDependency addJupiterDependency() { return new AddDependency("org.junit.jupiter", "junit-jupiter", "5.x", null, - "org.junit..*", null, null, null, null, "test", + "org.junit..*", null, null, null, null, null, null, null, null, null); } @@ -93,16 +92,16 @@ private static class AddJupiterGradle extends GroovyIsoVisitor @Override public G.CompilationUnit visitCompilationUnit(G.CompilationUnit t, ExecutionContext ctx) { Optional maybeGp = t.getMarkers().findFirst(GradleProject.class); - if(!maybeGp.isPresent()) { + if (!maybeGp.isPresent()) { return t; } GradleProject gp = maybeGp.get(); GradleDependencyConfiguration trc = gp.getConfiguration("testRuntimeClasspath"); - if(trc == null) { + if (trc == null) { return t; } ResolvedDependency jupiterApi = trc.findResolvedDependency("org.junit.jupiter", "junit-jupiter-api"); - if(jupiterApi == null) { + if (jupiterApi == null) { t = (G.CompilationUnit) addJupiterDependency().getVisitor(acc) .visitNonNull(t, ctx); } @@ -115,11 +114,12 @@ public G.CompilationUnit visitCompilationUnit(G.CompilationUnit t, ExecutionCont @EqualsAndHashCode(callSuper = false) private static class AddJupiterMaven extends MavenIsoVisitor { AddDependency.Accumulator acc; + @Override public Xml.Document visitDocument(Xml.Document document, ExecutionContext ctx) { Xml.Document d = document; - List jupiterApi = getResolutionResult().findDependencies("org.junit.jupiter", "junit-jupiter-api", Scope.Test); - if(jupiterApi.isEmpty()) { + List jupiterApi = getResolutionResult().findDependencies("org.junit.jupiter", "junit-jupiter-api", null); + if (jupiterApi.isEmpty()) { d = (Xml.Document) addJupiterDependency().getVisitor(acc) .visitNonNull(d, ctx); } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AddJupiterDependenciesTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AddJupiterDependenciesTest.java new file mode 100644 index 000000000..56a46dc7d --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/junit5/AddJupiterDependenciesTest.java @@ -0,0 +1,104 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.intellij.lang.annotations.Language; +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.Issue; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.openrewrite.java.Assertions.*; +import static org.openrewrite.maven.Assertions.pomXml; + +class AddJupiterDependenciesTest implements RewriteTest { + + @Language("java") + private static final String SOME_TEST = """ + import org.junit.jupiter.api.Test; + + class FooTest { + @Test + void bar() { + } + } + """; + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new AddJupiterDependencies()) + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api")); + } + + @DocumentExample + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/585") + void addToTestScope() { + rewriteRun( + mavenProject("project", + srcTestJava(java(SOME_TEST)), + pomXml( + //language=xml + """ + + 4.0.0 + org.example + project + 0.0.1 + + """, + spec -> spec.after(pom -> { + assertThat(pom) + .contains("junit-jupiter") + .contains("test"); + return pom; + }) + ) + ) + ); + } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/585") + void addToCompileScope() { + rewriteRun( + mavenProject("project", + srcMainJava(java(SOME_TEST)), + pomXml( + //language=xml + """ + + 4.0.0 + org.example + project + 0.0.1 + + """, + spec -> spec.after(pom -> { + assertThat(pom) + .contains("junit-jupiter") + .doesNotContain("test"); + return pom; + }) + ) + ) + ); + } +} From 108e7fd3bbe92710a831ed1b125673ee120972fa Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Wed, 21 Aug 2024 23:52:44 +0200 Subject: [PATCH 043/118] Retain Mockito Strictness WARN when switching to JUnit 5 through `@MockitoSettings(strictness = Strictness.WARN)` (#584) * WIP first setup * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * WIP test is failing * Introduce scanning recipe to check for dependency As preconditions only match the exact same file, and there's no guaranteed dependency marker available when visiting compilation units. * Provide more context as to why this recipe exists in the description Correct header year Add comment about limitation of the recipe * Update recipe name, description & target strictness * Update recipe name once again * Also pick up mockito-all --------- Co-authored-by: Laurens Westerlaken Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../testing/mockito/RetainStrictnessWarn.java | 100 +++++++++++++ .../resources/META-INF/rewrite/mockito.yml | 1 + .../mockito/RetainStrictnessWarnTest.java | 139 ++++++++++++++++++ 3 files changed, 240 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java create mode 100644 src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java diff --git a/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java b/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java new file mode 100644 index 000000000..9a5ef294b --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java @@ -0,0 +1,100 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.jspecify.annotations.Nullable; +import org.openrewrite.*; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.RemoveAnnotation; +import org.openrewrite.java.dependencies.DependencyInsight; +import org.openrewrite.java.search.FindAnnotations; +import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.tree.J; + +import java.util.Comparator; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; + +public class RetainStrictnessWarn extends ScanningRecipe { + + private static final String EXTEND_WITH_FQ = "org.junit.jupiter.api.extension.ExtendWith"; + private static final String MOCKITO_EXTENSION_FQ = "org.mockito.junit.jupiter.MockitoExtension"; + private static final String MOCKITO_SETTINGS_FQ = "org.mockito.junit.jupiter.MockitoSettings"; + private static final String MOCKITO_STRICTNESS_FQ = "org.mockito.quality.Strictness"; + + private static final String EXTEND_WITH_MOCKITO_EXTENSION = "@" + EXTEND_WITH_FQ + "(" + MOCKITO_EXTENSION_FQ + ".class)"; + + @Override + public String getDisplayName() { + return "Retain Mockito strictness `WARN` when switching to JUnit 5"; + } + + @Override + public String getDescription() { + return "Migrating from JUnit 4 to 5 [changes the default strictness](https://stackoverflow.com/a/53234137/53444) of the mocks from `WARN` to `STRICT_STUBS`. " + + "To prevent tests from failing we restore the original behavior by adding `@MockitoSettings(strictness = Strictness.WARN)`."; + } + + @Override + public AtomicBoolean getInitialValue(ExecutionContext ctx) { + return new AtomicBoolean(false); + } + + @Override + public TreeVisitor getScanner(AtomicBoolean usingOlderMockito) { + TreeVisitor div = new DependencyInsight("org.mockito", "mockito-*", "[1.1,2.17)").getVisitor(); + return new TreeVisitor() { + @Override + public @Nullable Tree visit(@Nullable Tree tree, ExecutionContext ctx) { + if (!usingOlderMockito.get() && div.visit(tree, ctx) != tree) { + usingOlderMockito.set(true); + } + return tree; + } + }; + } + + @Override + public TreeVisitor getVisitor(AtomicBoolean usingOlderMockito) { + return Preconditions.check(usingOlderMockito.get(), + Preconditions.check( + Preconditions.and( + new UsesType<>(MOCKITO_EXTENSION_FQ, true), + Preconditions.not(new UsesType<>(MOCKITO_SETTINGS_FQ, false)) + ), new JavaIsoVisitor() { + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { + Set annotations = FindAnnotations.find(classDecl, EXTEND_WITH_MOCKITO_EXTENSION); + if (!annotations.isEmpty()) { + maybeAddImport(MOCKITO_SETTINGS_FQ); + maybeAddImport(MOCKITO_STRICTNESS_FQ); + classDecl = JavaTemplate.builder("@MockitoSettings(strictness = Strictness.WARN)") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-junit-jupiter", "mockito-core")) + .imports(MOCKITO_SETTINGS_FQ, MOCKITO_STRICTNESS_FQ) + .build() + .apply(getCursor(), classDecl.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + doAfterVisit(new RemoveAnnotation(EXTEND_WITH_MOCKITO_EXTENSION).getVisitor()); + maybeRemoveImport(EXTEND_WITH_FQ); + maybeRemoveImport(MOCKITO_EXTENSION_FQ); + } + return super.visitClassDeclaration(classDecl, ctx); + } + }) + ); + } +} diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index ca1194067..2c4af52f1 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -133,6 +133,7 @@ recipeList: - org.openrewrite.java.testing.junit5.MockitoJUnitToMockitoExtension # https://github.com/openrewrite/rewrite-testing-frameworks/issues/360 # - org.openrewrite.java.testing.mockito.ReplacePowerMockito + - org.openrewrite.java.testing.mockito.RetainStrictnessWarn - org.openrewrite.java.dependencies.AddDependency: groupId: org.mockito artifactId: mockito-junit-jupiter diff --git a/src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java b/src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java new file mode 100644 index 000000000..1f9fbae59 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java @@ -0,0 +1,139 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.intellij.lang.annotations.Language; +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.maven.Assertions.pomXml; + +class RetainStrictnessWarnTest implements RewriteTest { + + @Language("xml") + private static final String POM_XML_WITH_OLDER_MOCKITO = """ + + 4.0.0 + bla.bla + bla-bla + 1.0.0 + + + org.mockito + mockito-all + 1.1 + test + + + + """; + + @Language("java") + private static final String JAVA_BEFORE = """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + } + """; + + @Language("java") + private static final String JAVA_AFTER = """ + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + + @MockitoSettings(strictness = Strictness.WARN) + class MyTest { + } + """; + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), + "mockito-core", "mockito-junit-jupiter", "junit-jupiter-api")) + .recipe(new RetainStrictnessWarn()); + } + + @Test + @DocumentExample + void shouldAddMockitoSettingsWithLenientStubbing() { + //language=java + rewriteRun( + pomXml(POM_XML_WITH_OLDER_MOCKITO), + java(JAVA_BEFORE, JAVA_AFTER) + ); + } + + @Test + void shouldLeaveExisting() { + //language=java + rewriteRun( + pomXml(POM_XML_WITH_OLDER_MOCKITO), + java( + """ + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + + @MockitoSettings(strictness = Strictness.STRICT_STUBS) + class MyTest { + } + """ + ) + ); + } + + @Test + void shouldRunBeforeMockitoCore2_17() { + rewriteRun( + pomXml(POM_XML_WITH_OLDER_MOCKITO), + java(JAVA_BEFORE, JAVA_AFTER) + ); + } + + @Test + void shouldNotRunOnNewerMockito() { + rewriteRun( + //language=xml + pomXml( + """ + + 4.0.0 + bla.bla + bla-bla + 1.0.0 + + + org.mockito + mockito-core + 2.17.0 + test + + + + """ + ), + java(JAVA_BEFORE) + ); + } +} From 79877ce870259f0a9c8747142e3cbd800c2e1bb9 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Fri, 23 Aug 2024 10:05:24 +0200 Subject: [PATCH 044/118] Add mockito-junit-jupiter for any package usage --- src/main/resources/META-INF/rewrite/mockito.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index 2c4af52f1..0eb563206 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -138,7 +138,7 @@ recipeList: groupId: org.mockito artifactId: mockito-junit-jupiter version: 3.x - onlyIfUsing: org.mockito.junit.jupiter.MockitoExtension + onlyIfUsing: org.mockito.junit.jupiter.* acceptTransitive: true - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: org.mockito From ed5d20e885ef7236a8ce896e44210795cb3e8f0f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 25 Aug 2024 20:59:10 +0200 Subject: [PATCH 045/118] Mark optional field as nullable --- .../java/testing/testcontainers/ExplicitContainerImage.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/openrewrite/java/testing/testcontainers/ExplicitContainerImage.java b/src/main/java/org/openrewrite/java/testing/testcontainers/ExplicitContainerImage.java index 9599ae40a..e368e1e07 100644 --- a/src/main/java/org/openrewrite/java/testing/testcontainers/ExplicitContainerImage.java +++ b/src/main/java/org/openrewrite/java/testing/testcontainers/ExplicitContainerImage.java @@ -16,6 +16,7 @@ package org.openrewrite.java.testing.testcontainers; import lombok.RequiredArgsConstructor; +import org.jspecify.annotations.Nullable; import org.openrewrite.*; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; @@ -45,6 +46,7 @@ public class ExplicitContainerImage extends Recipe { @Option(displayName = "Parse image", description = "Whether to call `DockerImageName.parse(image)`.", required = false) + @Nullable private final Boolean parseImage; @Override From fb81b3ecd212935fb971a345e7a086a9c6d998be Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 26 Aug 2024 15:58:54 +0200 Subject: [PATCH 046/118] Do not pass in `null` values in `ReplacePowerMockito` --- src/main/resources/META-INF/rewrite/powermockito.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/powermockito.yml b/src/main/resources/META-INF/rewrite/powermockito.yml index 84b11e652..003b4cf75 100644 --- a/src/main/resources/META-INF/rewrite/powermockito.yml +++ b/src/main/resources/META-INF/rewrite/powermockito.yml @@ -30,28 +30,18 @@ recipeList: methodPattern: org.powermock.api.mockito.PowerMockito mockStatic(..) fullyQualifiedTargetTypeName: org.mockito.Mockito returnType: org.mockito.MockedStatic - matchOverrides: null - matchUnknownTypes: - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: org.powermock.api.mockito.PowerMockito do*(..) fullyQualifiedTargetTypeName: org.mockito.Mockito - matchOverrides: null - matchUnknownTypes: null - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: org.powermock.api.mockito.PowerMockito mock(..) fullyQualifiedTargetTypeName: org.mockito.Mockito - matchOverrides: null - matchUnknownTypes: null - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: org.powermock.api.mockito.PowerMockito spy(..) fullyQualifiedTargetTypeName: org.mockito.Mockito - matchOverrides: null - matchUnknownTypes: null - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: org.powermock.api.mockito.PowerMockito when(..) fullyQualifiedTargetTypeName: org.mockito.Mockito - matchOverrides: null - matchUnknownTypes: null - org.openrewrite.java.testing.mockito.PowerMockitoMockStaticToMockito - org.openrewrite.java.dependencies.RemoveDependency: groupId: org.powermock From 8145e8be9acfdab3bddaec23cc337969ea1ce8dd Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 26 Aug 2024 16:05:47 +0200 Subject: [PATCH 047/118] Apply formatter to PowerMockitoMockStaticToMockito --- .../PowerMockitoMockStaticToMockito.java | 1 + .../PowerMockitoMockStaticToMockitoTest.java | 151 +++++++++--------- 2 files changed, 77 insertions(+), 75 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index 4c8def8f0..b6d0712d5 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -69,6 +69,7 @@ private static class PowerMockitoToMockitoVisitor extends JavaVisitor mockedCalendar; @BeforeEach @@ -219,38 +219,38 @@ void tearDownMethodOfTestNGHasAnnotationWithArgument() { java( """ import java.util.Calendar; - + import org.testng.annotations.Test; import org.powermock.core.classloader.annotations.PrepareForTest; - + @PrepareForTest({Calendar.class}) public class MyTest { - + @Test void testSomething() { } - + } """, """ import java.util.Calendar; - + import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - + public class MyTest { - + @BeforeMethod void setUpStaticMocks() { } - + @AfterMethod(alwaysRun = true) void tearDownStaticMocks() { } - + @Test void testSomething() { } - + } """ ) @@ -264,41 +264,41 @@ void tearDownMethodOfTestNGWithAnnotationRemainsUntouched() { java( """ import java.util.Calendar; - + import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import org.powermock.core.classloader.annotations.PrepareForTest; - + @PrepareForTest({Calendar.class}) public class MyTest { - + @AfterMethod(groups = "irrelevant") void tearDown() {} - + @Test void testSomething() { } - + } """, """ import java.util.Calendar; - + import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - + public class MyTest { - + @AfterMethod(groups = "irrelevant") void tearDown() {} - + @BeforeMethod void setUpStaticMocks() { } - + @Test void testSomething() { } - + } """ ) @@ -312,22 +312,22 @@ void tearDownMethodOfTestNGHasAnnotationWithSameArgumentsAsTheTestThatCallsMockS java( """ import java.util.Calendar; - + import static org.mockito.Mockito.*; - + import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.powermock.core.classloader.annotations.PrepareForTest; - + @PrepareForTest({Calendar.class}) public class MyTest { - + private Calendar calendarMock; - + @Test(groups = "irrelevant") void testSomethingIrrelevantForCheckin() { } - + @Test(groups = "checkin") void testStaticMethod() { calendarMock = mock(Calendar.class); @@ -338,33 +338,33 @@ void testStaticMethod() { """, """ import java.util.Calendar; - + import static org.mockito.Mockito.*; - + import org.mockito.MockedStatic; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; - + public class MyTest { - + private MockedStatic mockedCalendar; - + private Calendar calendarMock; - + @BeforeMethod(groups = "checkin") void setUpStaticMocks() { mockedCalendar = mockStatic(Calendar.class); } - + @AfterMethod(groups = "checkin") void tearDownStaticMocks() { mockedCalendar.closeOnDemand(); } - + @Test(groups = "irrelevant") void testSomethingIrrelevantForCheckin() { } - + @Test(groups = "checkin") void testStaticMethod() { calendarMock = mock(Calendar.class); @@ -383,19 +383,19 @@ void argumentOfWhenOnStaticMethodWithParametersIsReplacedByLambda() { java( """ import static org.mockito.Mockito.*; - + import java.util.Calendar; import java.util.Locale; - + import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; - + public class MyTest { - + private MockedStatic mockedCalendar; - + private Calendar calendarMock = mock(Calendar.class); - + @Test void testStaticMethod() { when(Calendar.getInstance(Locale.ENGLISH)).thenReturn(calendarMock); @@ -404,19 +404,19 @@ void testStaticMethod() { """, """ import static org.mockito.Mockito.*; - + import java.util.Calendar; import java.util.Locale; - + import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; - + public class MyTest { - + private MockedStatic mockedCalendar; - + private Calendar calendarMock = mock(Calendar.class); - + @Test void testStaticMethod() { mockedCalendar.when(() -> Calendar.getInstance(Locale.ENGLISH)).thenReturn(calendarMock); @@ -434,16 +434,16 @@ void argumentOfWhenOnInstanceMethodsAreNotReplaced() { java( """ import static org.mockito.Mockito.*; - + import java.util.Calendar; import java.util.Locale; - + import org.junit.jupiter.api.Test; - + public class MyTest { - + private Calendar calendarMock = mock(Calendar.class); - + @Test void testStaticMethod() { when(calendarMock.toString()).thenReturn(null); @@ -461,19 +461,19 @@ void argumentOfVerifyOnParameterlessStaticMethodIsReplacedBySimpleLambda() { java( """ import static org.mockito.Mockito.*; - + import java.util.Currency; import java.util.Locale; - + import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; - + public class MyTest { - + private MockedStatic mockedCurrency; - + private Currency currencyMock = mock(Currency.class); - + @Test void testStaticMethod() { verify(Currency.getInstance(Locale.ENGLISH), never()); @@ -483,19 +483,19 @@ void testStaticMethod() { """, """ import static org.mockito.Mockito.*; - + import java.util.Currency; import java.util.Locale; - + import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; - + public class MyTest { - + private MockedStatic mockedCurrency; - + private Currency currencyMock = mock(Currency.class); - + @Test void testStaticMethod() { mockedCurrency.verify(() -> Currency.getInstance(Locale.ENGLISH), never()); @@ -519,13 +519,13 @@ public interface MyInterface { } """) , java( - """ + """ public abstract class MyAbstractClass { - + public boolean isItTrue() { return true; } - + public abstract boolean isItImplemented(); - + } """ )); @@ -537,14 +537,14 @@ void extensionOfPowerMockTestCaseGetsRemoved() { rewriteRun(java( """ package org.powermock.modules.testng; - + public class PowerMockTestCase {} """ ), java( """ import org.powermock.modules.testng.PowerMockTestCase; - + public class MyPowerMockTestCase extends PowerMockTestCase {} """, """ @@ -560,14 +560,14 @@ void extensionOfPowerMockConfigurationGetsRemoved() { java( """ package org.powermock.configuration; - + public class PowerMockConfiguration {} """ ), java( """ import org.powermock.configuration.PowerMockConfiguration; - + public class MyPowerMockConfiguration extends PowerMockConfiguration {} """, """ @@ -608,6 +608,7 @@ void doesNotExplodeOnTopLevelMethodDeclaration() { rewriteRun( groovy( "def myFun() { }" - )); + ) + ); } } From cb3c8c04009423854fb47759b63dc6ca235e6faa Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 28 Aug 2024 09:47:04 +0200 Subject: [PATCH 048/118] Only convert when `actual` is of type boolean too Fixes https://github.com/openrewrite/rewrite-testing-frameworks/issues/587 --- .../AssertEqualsBooleanToAssertBoolean.java | 3 ++- ...ssertEqualsBooleanToAssertBooleanTest.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBoolean.java b/src/main/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBoolean.java index dd0f354cc..0ebbd75db 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBoolean.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBoolean.java @@ -57,7 +57,8 @@ public TreeVisitor getVisitor() { @Override public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation mi = (J.MethodInvocation) super.visitMethodInvocation(method, ctx); - if (ASSERT_EQUALS.matches(mi) && isBooleanLiteral(mi)) { + if (ASSERT_EQUALS.matches(mi) && isBooleanLiteral(mi) && + JavaType.Primitive.Boolean.equals(mi.getArguments().get(1).getType())) { StringBuilder sb = new StringBuilder(); String assertMethod = Boolean.parseBoolean(((J.Literal) mi.getArguments().get(0)).getValueSource()) ? "assertTrue" : "assertFalse"; diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBooleanTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBooleanTest.java index 4d39ff54e..13bbaf4ae 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBooleanTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/AssertEqualsBooleanToAssertBooleanTest.java @@ -105,4 +105,23 @@ void test() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/587") + void assertTrueWithNonBoolean() { + rewriteRun( + spec -> spec.recipe(new AssertEqualsBooleanToAssertBoolean()), + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertEquals; + class Main { + void foo() { + assertEquals(true, new Object()); + } + } + """ + ) + ); + } } From b64182bc89e27c25cc28189bfde70f682d809670 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 29 Aug 2024 17:37:05 +0000 Subject: [PATCH 049/118] LICENSE using Apache License Version 2.0 Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.text.CreateTextFile?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- LICENSE | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 8ff3b85fe..261eeb9e9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,15 +178,15 @@ Apache License APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate - comment syntax for the file formatPrefix. We also recommend that a + comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 2621b6411277b6c0ac4e4e3985a9c4bd6bb4f69c Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Mon, 2 Sep 2024 16:47:10 +0200 Subject: [PATCH 050/118] `PowerMockitoMockStaticToMockito` duplicates variables and methods when static nested class is involved (#588) * Setup testcase that shows the issue * This will fix it for now but we may need a more structural solution to sanitize variable names * Apply suggestions from code review --------- Co-authored-by: Laurens Westerlaken Co-authored-by: Tim te Beek --- .../PowerMockitoMockStaticToMockito.java | 6 +- .../PowerMockitoMockStaticToMockitoTest.java | 79 +++++++++++++++++++ 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index b6d0712d5..c1f7d2133 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -43,8 +43,8 @@ public String getDescription() { public TreeVisitor getVisitor() { return Preconditions.check( Preconditions.or( - new UsesType<>("org.powermock..*", false), - new UsesType<>("org.mockito..*", false) + new UsesType<>("org.powermock..*", false), + new UsesType<>("org.mockito..*", false) ), new PowerMockitoToMockitoVisitor() ); @@ -446,7 +446,7 @@ private J.ClassDeclaration addFieldDeclarationForMockedTypes(J.ClassDeclaration new Cursor(getCursor().getParentOrThrow(), classDecl), classDecl.getBody().getCoordinates().firstStatement(), classlessTypeName, - classlessTypeName + classlessTypeName.replace(".", "_") ); J.VariableDeclarations mockField = (J.VariableDeclarations) classDecl.getBody().getStatements().get(0); diff --git a/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java index a48c3c306..a9fa9a0cb 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java @@ -602,6 +602,85 @@ void testTryWithResource() { ); } + @Test + void shouldNotDuplicateVarsAndMethods() { + //language=java + rewriteRun( + java( + """ + package test; + + public class A { + public static class B { + public static String helloWorld() { + return "Hello World"; + } + } + } + """ + ), + java( + """ + import org.junit.Before; + import org.junit.Test; + import org.mockito.Mockito; + import org.powermock.core.classloader.annotations.PrepareForTest; + import test.A; + + @PrepareForTest({ A.B.class }) + public class MyTest { + + private static final String TEST_MESSAGE = "this is a test message"; + + @Before + void setUp() { + Mockito.mockStatic(A.B.class); + } + + @Test + public void testStaticMethod() { + } + } + """, + + """ + import org.junit.Before; + import org.junit.Test; + import org.junit.jupiter.api.AfterEach; + import org.junit.jupiter.api.BeforeEach; + import org.mockito.MockedStatic; + import org.mockito.Mockito; + import test.A; + + public class MyTest { + + private MockedStatic mockedA_B; + + private static final String TEST_MESSAGE = "this is a test message"; + + @Before + void setUp() { + } + + @BeforeEach + void setUpStaticMocks() { + mockedA_B = Mockito.mockStatic(A.B.class); + } + + @AfterEach + void tearDownStaticMocks() { + mockedA_B.closeOnDemand(); + } + + @Test + public void testStaticMethod() { + } + } + """ + ) + ); + } + @Test @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/358") void doesNotExplodeOnTopLevelMethodDeclaration() { From 996709b9757390664535a45eab11011335d951f5 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 3 Sep 2024 11:57:23 +0200 Subject: [PATCH 051/118] Add Mockito best practices to clear out MockitoSettings Fixes https://github.com/openrewrite/rewrite-testing-frameworks/issues/589 --- .../resources/META-INF/rewrite/mockito.yml | 12 +++ .../mockito/RemoveMockitoSettingsTest.java | 73 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index 0eb563206..b1ddde300 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -15,6 +15,18 @@ # --- type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.testing.mockito.MockitoBestPractices +displayName: Mockito best practices +description: . +tags: + - testing + - mockito +recipeList: + - org.openrewrite.java.testing.mockito.Mockito1to5Migration + - org.openrewrite.java.RemoveAnnotation: + annotationPattern: "@org.mockito.junit.jupiter.MockitoSettings(strictness=org.mockito.quality.Strictness.WARN)" +--- +type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.Mockito1to5Migration displayName: Mockito 5.x upgrade description: Upgrade Mockito from 1.x to 5.x. diff --git a/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java b/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java new file mode 100644 index 000000000..0a5a10fd6 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java @@ -0,0 +1,73 @@ +package org.openrewrite.java.testing.mockito; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class RemoveMockitoSettingsTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), + "mockito-core", "mockito-junit-jupiter", "junit-jupiter-api")) + .recipeFromResource("/META-INF/rewrite/mockito.yml", "org.openrewrite.java.testing.mockito.MockitoBestPractices"); + } + + @Test + @DocumentExample + void removeMockitoSettings() { + rewriteRun( + //language=java + java( + """ + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + @MockitoSettings(strictness = Strictness.WARN) + class A {} + """, + """ + class A {} + """ + ) + ); + } + + @Test + void removeMockitoSettingsFullyQualified() { + rewriteRun( + //language=java + java( + """ + import org.mockito.junit.jupiter.MockitoSettings; + @MockitoSettings(strictness = org.mockito.quality.Strictness.WARN) + class A {} + """, + """ + class A {} + """ + ) + ); + } + + @Test + void retainMisMatchedArgument() { + rewriteRun( + //language=java + java( + """ + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + @MockitoSettings(strictness = Strictness.LENIENT) + class A {} + """ + ) + ); + } +} From 922ced3ac40c9886eacd95ee61a6be46fca83c62 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 3 Sep 2024 12:28:32 +0200 Subject: [PATCH 052/118] Add missing license header --- .../mockito/RemoveMockitoSettingsTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java b/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java index 0a5a10fd6..92a177991 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.openrewrite.java.testing.mockito; import org.junit.jupiter.api.Test; From 60700fd38ed259f828c7401184bc8a789b6eaa0c Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Wed, 4 Sep 2024 16:20:36 +0200 Subject: [PATCH 053/118] Add JUnitStories to JupiterStories declarative (#591) Co-authored-by: Laurens Westerlaken --- src/main/resources/META-INF/rewrite/junit5.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 92d44185c..264c646e1 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -134,6 +134,9 @@ recipeList: artifactId: maven-failsafe-plugin newVersion: 3.1.x - org.openrewrite.java.testing.junit5.GradleUseJunitJupiter + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.jbehave.core.junit.JUnitStories + newFullyQualifiedTypeName: org.jbehave.core.junit.JupiterStories --- type: specs.openrewrite.org/v1beta/recipe From 81d5c9874fc3b851e676344cfad7417539a11f74 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 4 Sep 2024 18:30:27 +0200 Subject: [PATCH 054/118] Update mockito.yml --- src/main/resources/META-INF/rewrite/mockito.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index b1ddde300..18d8382b4 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -17,7 +17,7 @@ type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.MockitoBestPractices displayName: Mockito best practices -description: . +description: Applies best practices for Mockito tests. tags: - testing - mockito From cea706a5570e1b465968a7cc824300f2db991307 Mon Sep 17 00:00:00 2001 From: Sam Snyder Date: Wed, 4 Sep 2024 11:16:05 -0700 Subject: [PATCH 055/118] Also remove powermock-core --- src/main/resources/META-INF/rewrite/powermockito.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/powermockito.yml b/src/main/resources/META-INF/rewrite/powermockito.yml index 003b4cf75..79aa8d35f 100644 --- a/src/main/resources/META-INF/rewrite/powermockito.yml +++ b/src/main/resources/META-INF/rewrite/powermockito.yml @@ -46,3 +46,6 @@ recipeList: - org.openrewrite.java.dependencies.RemoveDependency: groupId: org.powermock artifactId: powermock-api-mockito* + - org.openrewrite.java.dependencies.RemoveDependency: + groupId: org.powermock + artifactId: powermock-core From fd664b2966e970cecafeaff98d54747db139f8bc Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Thu, 5 Sep 2024 11:17:20 +0200 Subject: [PATCH 056/118] Do not perform `JUnit4to5Migration` where TestNG is used (#592) * Do not perform JUnit4 to 5 migration when testNG is used * Update src/main/resources/META-INF/rewrite/junit5.yml Co-authored-by: Tim te Beek --------- Co-authored-by: Laurens Westerlaken Co-authored-by: Tim te Beek --- src/main/resources/META-INF/rewrite/junit5.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 264c646e1..54f2ca7ab 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -51,6 +51,10 @@ description: Migrates JUnit 4.x tests to JUnit Jupiter. tags: - testing - junit +preconditions: + - org.openrewrite.java.search.DoesNotUseType: + fullyQualifiedTypeName: org.testng..* + includeImplicit: true recipeList: - org.openrewrite.java.testing.junit5.UseWiremockExtension - org.openrewrite.java.testing.junit5.IgnoreToDisabled From 8d8970d386b7b239181ec3061d88fb4616613fa5 Mon Sep 17 00:00:00 2001 From: Arlo O'Keeffe Date: Fri, 6 Sep 2024 19:11:26 +0200 Subject: [PATCH 057/118] Add `MockRestServiceServer.verify` to default assertions (#593) * add MockRestServiceServer.verify to default assertions * Move spring-test to src/test/resources, as it's only needed there --------- Co-authored-by: Tim te Beek --- build.gradle.kts | 1 + .../cleanup/TestsShouldIncludeAssertions.java | 1 + .../TestsShouldIncludeAssertionsTest.java | 24 +++++++++++++++++- .../rewrite/classpath/spring-test-6.1.12.jar | Bin 0 -> 856204 bytes 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/META-INF/rewrite/classpath/spring-test-6.1.12.jar diff --git a/build.gradle.kts b/build.gradle.kts index f49cd8098..bce1547cf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,6 +25,7 @@ recipeDependencies { parserClasspath("org.powermock:powermock-api-mockito:1.7.+") parserClasspath("org.powermock:powermock-core:1.7.+") parserClasspath("com.squareup.okhttp3:mockwebserver:4.10.0") + parserClasspath("org.springframework:spring-test:6.1.12") } val rewriteVersion = rewriteRecipe.rewriteVersion.get() diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java index 82e4290f0..24db0e09c 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java @@ -50,6 +50,7 @@ public class TestsShouldIncludeAssertions extends Recipe { "mockit", "io.restassured", "org.springframework.test.web.servlet.ResultActions", + "org.springframework.test.web.client.MockRestServiceServer.verify", "com.github.tomakehurst.wiremock.client.WireMock", "org.junit.Assert"// rarely, the test annotation is junit 5 but the assert is junit 4 ); diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java index 1b7c5ce82..6b8baa713 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java @@ -34,7 +34,7 @@ class TestsShouldIncludeAssertionsTest implements RewriteTest { public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() - .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13", "junit-jupiter-api-5.9", "mockito-all-1.10", "hamcrest-2.2", "assertj-core-3.24") + .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13", "junit-jupiter-api-5.9", "mockito-all-1.10", "hamcrest-2.2", "assertj-core-3.24", "spring-test-6.1.12") .dependsOn( List.of( //language=java @@ -377,4 +377,26 @@ public void methodTest() { ) ); } + + @Test + void hasMockRestServiceServerVerify() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + import org.springframework.test.web.client.MockRestServiceServer; + + class AaTest { + private MockRestServiceServer mockServer; + + @Test + public void verifyTest() { + mockServer.verify(); + } + } + """ + ) + ); + } } diff --git a/src/test/resources/META-INF/rewrite/classpath/spring-test-6.1.12.jar b/src/test/resources/META-INF/rewrite/classpath/spring-test-6.1.12.jar new file mode 100644 index 0000000000000000000000000000000000000000..df044b40fea9a2013e4a8709cda6415f188b60b7 GIT binary patch literal 856204 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

    rA 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%0A)n7EZQD5^NU#+iNp>!D0 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 IgV4qF|M1MD Date: Sat, 7 Sep 2024 05:42:03 +1000 Subject: [PATCH 058/118] Move Junit 5 assertThrows to last statement in lamdba (#590) * Initial stab at recipe to move assertThrows to last statement in lamdba * Silence the review bot by applying recommended changes * Handle the non-assignment case already * Add a note on another case to check * Handle case where variable is declared with assertThrows * Add test case for assertThrows with error message * Update tests to account for removal of unnecessary curly braces. Also add warning of possible compilation error in description. * Update warning in description --------- Co-authored-by: Tim te Beek --- .../junit5/AssertThrowsOnLastStatement.java | 146 ++++++++++ .../AssertThrowsOnLastStatementTest.java | 255 ++++++++++++++++++ 2 files changed, 401 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java create mode 100644 src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java b/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java new file mode 100644 index 000000000..ffbb0f330 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java @@ -0,0 +1,146 @@ +/* + * Copyright 2021 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.Statement; +import org.openrewrite.staticanalysis.LambdaBlockToExpression; + +import java.util.Collections; +import java.util.List; + +import static java.util.Collections.singletonList; + + +public class AssertThrowsOnLastStatement extends Recipe { + + @Override + public String getDisplayName() { + return "Applies Junit 5 assertThrows on last statement in lamdba block only"; + } + + @Override + public String getDescription() { + return "Applies Junit 5 assertThrows on last statement in lambda block only, in extremely rare cases may cause " + + "compilation errors if lambda uses non final variables."; + } + + @Override + public TreeVisitor getVisitor() { + MethodMatcher assertThrowsMatcher = new MethodMatcher( + "org.junit.jupiter.api.Assertions assertThrows(java.lang.Class, org.junit.jupiter.api.function.Executable, ..)"); + return Preconditions.check(new UsesMethod<>(assertThrowsMatcher), new JavaIsoVisitor() { + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl, ExecutionContext ctx) { + J.MethodDeclaration m = super.visitMethodDeclaration(methodDecl, ctx); + + m = m.withBody(m.getBody().withStatements(ListUtils.flatMap(m.getBody().getStatements(), methodStatement -> { + J statementToCheck = methodStatement; + final J.VariableDeclarations assertThrowsWithVarDec; + final J.VariableDeclarations.NamedVariable assertThrowsVar; + + if (methodStatement instanceof J.VariableDeclarations) { + assertThrowsWithVarDec = (J.VariableDeclarations) methodStatement; + List assertThrowsNamedVars = assertThrowsWithVarDec.getVariables(); + if (assertThrowsNamedVars.size() != 1) { + return methodStatement; + } + + // has variable declaration for assertThrows eg Throwable ex = assertThrows(....) + assertThrowsVar = assertThrowsNamedVars.get(0); + statementToCheck = assertThrowsVar.getInitializer(); + } else { + assertThrowsWithVarDec = null; + assertThrowsVar = null; + } + + if (!(statementToCheck instanceof J.MethodInvocation)) { + return methodStatement; + } + + J.MethodInvocation methodInvocation = (J.MethodInvocation) statementToCheck; + if (!assertThrowsMatcher.matches(methodInvocation)) { + return methodStatement; + } + + List arguments = methodInvocation.getArguments(); + if (arguments.size() <= 1) { + return methodStatement; + } + + Expression arg = arguments.get(1); + if (!(arg instanceof J.Lambda)) { + return methodStatement; + } + + J.Lambda lambda = (J.Lambda) arg; + if (!(lambda.getBody() instanceof J.Block)) { + return methodStatement; + } + + J.Block body = (J.Block) lambda.getBody(); + if (body == null) { + return methodStatement; + } + + List lambdaStatements = body.getStatements(); + if (lambdaStatements.size() <= 1) { + return methodStatement; + } + + // TODO Check to see if last line in lambda does not use a non-final variable + + // move all the statements from the body into before the method invocation, except last one + return ListUtils.map(lambdaStatements, (idx, lambdaStatement) -> { + if (idx < lambdaStatements.size() - 1) { + return lambdaStatement.withPrefix(methodStatement.getPrefix().withComments(Collections.emptyList())); + } + + J.MethodInvocation newAssertThrows = methodInvocation.withArguments( + ListUtils.map(arguments, (argIdx, argument) -> { + if (argIdx == 1) { + // Only retain the last statement in the lambda block + return lambda.withBody(body.withStatements(singletonList(lambdaStatement))); + } + return argument; + }) + ); + + if (assertThrowsWithVarDec == null) { + return newAssertThrows; + } + + J.VariableDeclarations.NamedVariable newAssertThrowsVar = assertThrowsVar.withInitializer(newAssertThrows); + return assertThrowsWithVarDec.withVariables(singletonList(newAssertThrowsVar)); + }); + + }))); + + doAfterVisit(new LambdaBlockToExpression().getVisitor()); + return m; + } + }); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java new file mode 100644 index 000000000..744fed420 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java @@ -0,0 +1,255 @@ +/* + * Copyright 2021 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class AssertThrowsOnLastStatementTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + //.logCompilationWarningsAndErrors(true) + .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9")) + .recipe(new AssertThrowsOnLastStatement()); + } + + @DocumentExample + @Test + void applyToLastStatementWithDeclaringVariableThreeLines() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + Throwable exception = assertThrows(IllegalArgumentException.class, () -> { + foo(); + System.out.println("foo"); + foo(); + }); + assertEquals("Error message", exception.getMessage()); + } + void foo() { + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + foo(); + System.out.println("foo"); + Throwable exception = assertThrows(IllegalArgumentException.class, () -> + foo()); + assertEquals("Error message", exception.getMessage()); + } + void foo() { + } + } + """ + ) + ); + } + + @Test + void applyToLastStatementWithDeclaringVariableThreeLinesHasLineBefore() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + System.out.println("bla"); + Throwable exception = assertThrows(IllegalArgumentException.class, () -> { + foo(); + System.out.println("foo"); + foo(); + }); + assertEquals("Error message", exception.getMessage()); + } + void foo() { + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + System.out.println("bla"); + foo(); + System.out.println("foo"); + Throwable exception = assertThrows(IllegalArgumentException.class, () -> + foo()); + assertEquals("Error message", exception.getMessage()); + } + void foo() { + } + } + """ + ) + ); + } + + @Test + void applyToLastStatementNoDeclaringVariableTwoLinesNoLinesAfter() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + assertThrows(IllegalArgumentException.class, () -> { + System.out.println("foo"); + foo(); + }); + } + void foo() { + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + System.out.println("foo"); + assertThrows(IllegalArgumentException.class, () -> + foo()); + } + void foo() { + } + } + """ + ) + ); + } + + @Test + void applyToLastStatementHasMessage() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + assertThrows(IllegalArgumentException.class, () -> { + System.out.println("foo"); + foo(); + }, "message"); + } + void foo() { + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + System.out.println("foo"); + assertThrows(IllegalArgumentException.class, () -> { + foo(); + }, "message"); + } + void foo() { + } + } + """ + ) + ); + } + + @Test + void makeNoChangesAsOneLine() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertThrows; + + class MyTest { + + @Test + public void test() { + Throwable exception = assertThrows(IllegalArgumentException.class, () -> foo()); + assertEquals("Error message", exception.getMessage()); + } + void foo() { + } + } + """ + ) + ); + } +} From 5c23f0798a6e417658443855b1f356666b333a8d Mon Sep 17 00:00:00 2001 From: Tahanima Chowdhury Date: Sat, 7 Sep 2024 14:49:46 +0600 Subject: [PATCH 059/118] feat: Add recipes for negative variants of startsWith, endsWith, and matches (#594) --- src/main/resources/META-INF/rewrite/assertj.yml | 15 +++++++++++++++ .../SimplifyChainedAssertJAssertionsTest.java | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 28b7eae0b..1ae70b513 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -110,16 +110,31 @@ recipeList: assertToReplace: isTrue dedicatedAssertion: startsWith requiredType: java.lang.String + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: startsWith + assertToReplace: isFalse + dedicatedAssertion: doesNotStartWith + requiredType: java.lang.String - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: chainedAssertion: endsWith assertToReplace: isTrue dedicatedAssertion: endsWith requiredType: java.lang.String + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: endsWith + assertToReplace: isFalse + dedicatedAssertion: doesNotEndWith + requiredType: java.lang.String - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: chainedAssertion: matches assertToReplace: isTrue dedicatedAssertion: matches requiredType: java.lang.String + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: matches + assertToReplace: isFalse + dedicatedAssertion: doesNotMatch + requiredType: java.lang.String - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: chainedAssertion: trim assertToReplace: isEmpty diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java index 874d6480b..cc5bed354 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionsTest.java @@ -85,8 +85,11 @@ private static Stream stringReplacements() { Arguments.arguments("equalsIgnoreCase", "isTrue", "isEqualToIgnoringCase", "expected", ""), Arguments.arguments("contains", "isTrue", "contains", "expected", ""), Arguments.arguments("startsWith", "isTrue", "startsWith", "expected", ""), + Arguments.arguments("startsWith", "isFalse", "doesNotStartWith", "expected", ""), Arguments.arguments("endsWith", "isTrue", "endsWith", "expected", ""), + Arguments.arguments("endsWith", "isFalse", "doesNotEndWith", "expected", ""), Arguments.arguments("matches", "isTrue", "matches", "expected", ""), + Arguments.arguments("matches", "isFalse", "doesNotMatch", "expected", ""), Arguments.arguments("trim", "isEmpty", "isBlank", "", ""), Arguments.arguments("length", "isEqualTo", "hasSize", "", "length"), Arguments.arguments("isEmpty", "isFalse", "isNotEmpty", "", "") From 8bfd44ab6d44a675dab19d578800956e0eb71be3 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 8 Sep 2024 22:21:48 +0200 Subject: [PATCH 060/118] Slight polish to `AssertThrowsOnLastStatement` & include in best practices --- .../junit5/AssertThrowsOnLastStatement.java | 11 ++-- .../resources/META-INF/rewrite/junit5.yml | 1 + .../AssertThrowsOnLastStatementTest.java | 54 +++++++++---------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java b/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java index ffbb0f330..de757861d 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java @@ -38,13 +38,14 @@ public class AssertThrowsOnLastStatement extends Recipe { @Override public String getDisplayName() { - return "Applies Junit 5 assertThrows on last statement in lamdba block only"; + return "Applies JUnit 5 `assertThrows` on last statement in lambda block only"; } @Override public String getDescription() { - return "Applies Junit 5 assertThrows on last statement in lambda block only, in extremely rare cases may cause " + - "compilation errors if lambda uses non final variables."; + return "Applies JUnit 5 `assertThrows` on last statement in lambda block only. " + + "In rare cases may cause compilation errors if the lambda uses effectively non final variables. " + + "In some cases, tests might fail if earlier statements in the lambda block throw exceptions."; } @Override @@ -101,10 +102,6 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl } J.Block body = (J.Block) lambda.getBody(); - if (body == null) { - return methodStatement; - } - List lambdaStatements = body.getStatements(); if (lambdaStatements.size() <= 1) { return methodStatement; diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 54f2ca7ab..a8a38c9cf 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -32,6 +32,7 @@ recipeList: - org.openrewrite.java.testing.junit5.RemoveDuplicateTestTemplates - org.openrewrite.java.testing.junit5.RemoveTryCatchFailBlocks - org.openrewrite.java.testing.junit5.LifecycleNonPrivate + - org.openrewrite.java.testing.junit5.AssertThrowsOnLastStatement --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.junit5.StaticImports diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java index 744fed420..ad8cb779c 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java @@ -43,12 +43,12 @@ void applyToLastStatementWithDeclaringVariableThreeLines() { java( """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { Throwable exception = assertThrows(IllegalArgumentException.class, () -> { @@ -64,12 +64,12 @@ void foo() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { foo(); @@ -93,12 +93,12 @@ void applyToLastStatementWithDeclaringVariableThreeLinesHasLineBefore() { java( """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { System.out.println("bla"); @@ -115,12 +115,12 @@ void foo() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { System.out.println("bla"); @@ -145,11 +145,11 @@ void applyToLastStatementNoDeclaringVariableTwoLinesNoLinesAfter() { java( """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { assertThrows(IllegalArgumentException.class, () -> { @@ -163,11 +163,11 @@ void foo() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { System.out.println("foo"); @@ -189,11 +189,11 @@ void applyToLastStatementHasMessage() { java( """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { assertThrows(IllegalArgumentException.class, () -> { @@ -207,11 +207,11 @@ void foo() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { System.out.println("foo"); @@ -234,12 +234,12 @@ void makeNoChangesAsOneLine() { java( """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; - + class MyTest { - + @Test public void test() { Throwable exception = assertThrows(IllegalArgumentException.class, () -> foo()); From e037d3d9dcf878d7c9b33547b362e607ce9fcc96 Mon Sep 17 00:00:00 2001 From: Shannon Pamperl Date: Mon, 9 Sep 2024 09:21:01 -0500 Subject: [PATCH 061/118] refactor: Update Gradle wrapper (#595) Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.gradle.UpdateGradleWrapper?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7a8b121b8..cb4e5525f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a +distributionSha256Sum=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 From e9497f1a56e075d5359a10b6356d580dc0ac5874 Mon Sep 17 00:00:00 2001 From: Yurii Date: Tue, 10 Sep 2024 11:53:24 +0200 Subject: [PATCH 062/118] Handle multiple blocks in JMockit Expectations (#596) * Add logic to handle multiple blocks(with curly braces) in one Expectations declaration. This is a rare and bizzare way to "better" readability because it "groups" related statements together, but there's nothing wrong with the syntax. * Add test code for the "multiple blocks in one expectations" case * add redundant curly braces to test bizarre cases * format code * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * follow the right coding convention * Use TypeUtils and apply formatter * Reuse already assigned variable instead of repeat expression --------- Co-authored-by: Sheng Yu Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../java/testing/jmockit/JMockitUtils.java | 9 +-- .../jmockit/SetupStatementsRewriter.java | 31 +++++--- .../JMockitExpectationsToMockitoTest.java | 75 ++++++++++++++++++- 3 files changed, 98 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java index 9d144039f..4c515517d 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java @@ -36,14 +36,11 @@ static Optional getJMockitBlock(Statement s) { J.Identifier clazz = (J.Identifier) nc.getClazz(); // JMockit block should be composed of a block within another block - if (nc.getBody() == null || nc.getBody().getStatements().size() != 1) { + if (nc.getBody() == null || (nc.getBody().getStatements().size() != 1 && + !TypeUtils.isAssignableTo("mockit.Expectations", clazz.getType()))) { return empty(); } - JMockitBlockType blockType = JMockitBlockType.valueOf(clazz.getSimpleName()); - if (blockType != null && TypeUtils.isOfClassType(clazz.getType(), blockType.getFqn())) { - return Optional.of(blockType); - } - return empty(); + return Optional.of(JMockitBlockType.valueOf(clazz.getSimpleName())); } } diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java index fbbc1add3..60fd69ffb 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java @@ -52,18 +52,29 @@ J.Block rewriteMethodBody() { assert nc.getBody() != null; J.Block expectationsBlock = (J.Block) nc.getBody().getStatements().get(0); + // Account for Expectations which may contain multiple blocks + List statementList = new ArrayList<>(); + if (TypeUtils.isAssignableTo("mockit.Expectations", nc.getType())) { + statementList.addAll(nc.getBody().getStatements()); + } else { + statementList.add(expectationsBlock); + } + // statement needs to be moved directly before expectations class instantiation JavaCoordinates coordinates = nc.getCoordinates().before(); List newExpectationsBlockStatements = new ArrayList<>(); - for (Statement expectationStatement : expectationsBlock.getStatements()) { - if (!isSetupStatement(expectationStatement, spies)) { - newExpectationsBlockStatements.add(expectationStatement); - continue; + for (Statement st : statementList) { + for (Statement expectationStatement : ((J.Block) st).getStatements()) { + if (!isSetupStatement(expectationStatement, spies)) { + newExpectationsBlockStatements.add(expectationStatement); + continue; + } + rewriteBodyStatement(expectationStatement, coordinates); + // subsequent setup statements are moved in order + coordinates = expectationStatement.getCoordinates().after(); } - rewriteBodyStatement(expectationStatement, coordinates); - // subsequent setup statements are moved in order - coordinates = expectationStatement.getCoordinates().after(); } + // the new expectations block has the setup statements removed J.Block newExpectationsBlock = expectationsBlock.withStatements(newExpectationsBlockStatements); nc = nc.withBody(nc.getBody().withStatements(Collections.singletonList(newExpectationsBlock))); @@ -128,7 +139,7 @@ private static boolean isNotMockIdentifier(J.Identifier identifier, Set return false; } if (identifier.getType() instanceof JavaType.Method - && TypeUtils.isAssignableTo("mockit.Invocations", + && TypeUtils.isAssignableTo("mockit.Invocations", ((JavaType.Method) identifier.getType()).getDeclaringType())) { return false; } @@ -138,8 +149,8 @@ private static boolean isNotMockIdentifier(J.Identifier identifier, Set } for (JavaType.FullyQualified annotationType : fieldType.getAnnotations()) { if (TypeUtils.isAssignableTo("mockit.Mocked", annotationType) - || TypeUtils.isAssignableTo("mockit.Injectable", annotationType) - || TypeUtils.isAssignableTo("mockit.Tested", annotationType)) { + || TypeUtils.isAssignableTo("mockit.Injectable", annotationType) + || TypeUtils.isAssignableTo("mockit.Tested", annotationType)) { return false; } } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index c39233d20..7ebd6531a 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -1419,7 +1419,80 @@ void test() { } @Test - void whenMultipleExpectationsNoResults() { + void whenMultipleBlockInSingleExpectation() { + //language=java + rewriteRun( + java( + """ + class MyObject { + public String getX() { + return "X"; + } + public String getY() { + return "Y"; + } + } + """ + ), + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + new Expectations() { + { + myObject.getX(); + result = "x1"; + } + { + myObject.getY(); + result = "y1"; + } + }; + assertEquals("x1", myObject.getX()); + assertEquals("y1", myObject.getY()); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + when(myObject.getX()).thenReturn("x1"); + when(myObject.getY()).thenReturn("y1"); + assertEquals("x1", myObject.getX()); + assertEquals("y1", myObject.getY()); + } + } + """ + ) + ); + } + + @Test + void whenMultipleExpectationsNoResults() { //language=java rewriteRun( java( From 52f5318308c1d71c44ab7c7432904339d3b009b6 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Thu, 12 Sep 2024 14:51:50 +0200 Subject: [PATCH 063/118] When upgrading mockito also upgrade potential byte buddy dependencies (#600) * Upgrade byte buddy dependency * Apply glob * Inline variables and adopt `getFirst()` --------- Co-authored-by: Tim te Beek --- .../resources/META-INF/rewrite/mockito.yml | 16 ++- .../mockito/MockitoInlineToCoreTest.java | 127 ++++++++++++------ 2 files changed, 103 insertions(+), 40 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index 18d8382b4..49a5b193a 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -43,6 +43,10 @@ recipeList: groupId: org.mockito artifactId: "*" newVersion: 5.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: net.bytebuddy + artifactId: byte-buddy* + newVersion: 1.15.x - org.openrewrite.maven.RemoveDuplicateDependencies --- @@ -59,6 +63,10 @@ recipeList: groupId: org.mockito artifactId: "*" newVersion: 4.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: net.bytebuddy + artifactId: byte-buddy* + newVersion: 1.12.19 --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.Mockito1to3Migration @@ -143,8 +151,8 @@ recipeList: - org.openrewrite.java.testing.mockito.CleanupMockitoImports - org.openrewrite.java.testing.mockito.MockUtilsToStatic - org.openrewrite.java.testing.junit5.MockitoJUnitToMockitoExtension -# https://github.com/openrewrite/rewrite-testing-frameworks/issues/360 -# - org.openrewrite.java.testing.mockito.ReplacePowerMockito + # https://github.com/openrewrite/rewrite-testing-frameworks/issues/360 + # - org.openrewrite.java.testing.mockito.ReplacePowerMockito - org.openrewrite.java.testing.mockito.RetainStrictnessWarn - org.openrewrite.java.dependencies.AddDependency: groupId: org.mockito @@ -160,3 +168,7 @@ recipeList: oldGroupId: org.mockito oldArtifactId: mockito-all newArtifactId: mockito-core + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: net.bytebuddy + artifactId: byte-buddy* + newVersion: 1.11.13 diff --git a/src/test/java/org/openrewrite/java/testing/mockito/MockitoInlineToCoreTest.java b/src/test/java/org/openrewrite/java/testing/mockito/MockitoInlineToCoreTest.java index a7bdb1998..7e68ccb00 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/MockitoInlineToCoreTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/MockitoInlineToCoreTest.java @@ -16,6 +16,7 @@ package org.openrewrite.java.testing.mockito; import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -29,6 +30,7 @@ public void defaults(RecipeSpec spec) { spec.recipeFromResources("org.openrewrite.java.testing.mockito.Mockito1to5Migration"); } + @DocumentExample @Test void inlineToCore() { rewriteRun( @@ -50,25 +52,22 @@ void inlineToCore() { """, - sourceSpecs -> sourceSpecs.after(after -> { - String version = Pattern.compile("(5.+)").matcher(after).results().reduce((a, b) -> b).orElseThrow().group(1); - return """ - - 4.0.0 - com.example - demo - 0.0.1-SNAPSHOT - - - org.mockito - mockito-core - %s - test - - - - """.formatted(version); - }) + spec -> spec.after(after -> """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + org.mockito + mockito-core + %s + test + + + + """.formatted(Pattern.compile("(5.+)").matcher(after).results().findFirst().orElseThrow().group(1))) ) ); } @@ -100,25 +99,77 @@ void noDuplicates() { """, - sourceSpecs -> sourceSpecs.after(after -> { - String version = Pattern.compile("(5.+)").matcher(after).results().reduce((a, b) -> b).orElseThrow().group(1); - return """ - - 4.0.0 - com.example - demo - 0.0.1-SNAPSHOT - - - org.mockito - mockito-core - %s - test - - - - """.formatted(version); - }) + spec -> spec.after(after -> """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + org.mockito + mockito-core + %s + test + + + + """.formatted(Pattern.compile("(5.+)").matcher(after).results().findFirst().orElseThrow().group(1))) + ) + ); + } + + @Test + void shouldUpdateByteBuddy() { + rewriteRun( + //language=xml + pomXml( + """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + org.mockito + mockito-core + 5.13.0 + test + + + net.bytebuddy + byte-buddy + 1.12.19 + test + + + + """, + spec -> spec.after(after -> """ + + 4.0.0 + com.example + demo + 0.0.1-SNAPSHOT + + + org.mockito + mockito-core + %s + test + + + net.bytebuddy + byte-buddy + %s + test + + + + """.formatted( + Pattern.compile("(5.+)").matcher(after).results().findFirst().orElseThrow().group(1), + Pattern.compile("(1.15.+)").matcher(after).results().findFirst().orElseThrow().group(1))) ) ); } From 251f882a3649571acd52b872038d0474d371fd79 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Fri, 13 Sep 2024 16:25:01 +0200 Subject: [PATCH 064/118] Include `ReplacePowerMockito` with `Mockito1to3Migration` again (#602) * Include `ReplacePowerMockito` with `Mockito1to3Migration` again * Drop `Mockito1to5Migration` from `ReplacePowerMockito` * Update description for ReplacePowerMockito * Look across all resource files for recipes --- src/main/resources/META-INF/rewrite/mockito.yml | 3 +-- src/main/resources/META-INF/rewrite/powermockito.yml | 3 +-- .../java/testing/mockito/RemoveMockitoSettingsTest.java | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index 49a5b193a..fd6028729 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -151,8 +151,7 @@ recipeList: - org.openrewrite.java.testing.mockito.CleanupMockitoImports - org.openrewrite.java.testing.mockito.MockUtilsToStatic - org.openrewrite.java.testing.junit5.MockitoJUnitToMockitoExtension - # https://github.com/openrewrite/rewrite-testing-frameworks/issues/360 - # - org.openrewrite.java.testing.mockito.ReplacePowerMockito + - org.openrewrite.java.testing.mockito.ReplacePowerMockito - org.openrewrite.java.testing.mockito.RetainStrictnessWarn - org.openrewrite.java.dependencies.AddDependency: groupId: org.mockito diff --git a/src/main/resources/META-INF/rewrite/powermockito.yml b/src/main/resources/META-INF/rewrite/powermockito.yml index 79aa8d35f..c27c80d7e 100644 --- a/src/main/resources/META-INF/rewrite/powermockito.yml +++ b/src/main/resources/META-INF/rewrite/powermockito.yml @@ -18,12 +18,11 @@ type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.ReplacePowerMockito displayName: Replace PowerMock with raw Mockito -description: Upgrade to Mockito 5 and replace PowerMockito with raw Mockito. +description: PowerMockito with raw Mockito; best executed as part of a Mockito upgrade. tags: - testing - mockito recipeList: - - org.openrewrite.java.testing.mockito.Mockito1to5Migration - org.openrewrite.java.RemoveAnnotation: annotationPattern: "@org.powermock.core.classloader.annotations.PowerMockIgnore" - org.openrewrite.java.ChangeMethodTargetToStatic: diff --git a/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java b/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java index 92a177991..b0f3cbe98 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/RemoveMockitoSettingsTest.java @@ -32,7 +32,7 @@ public void defaults(RecipeSpec spec) { .parser(JavaParser.fromJavaVersion() .classpathFromResources(new InMemoryExecutionContext(), "mockito-core", "mockito-junit-jupiter", "junit-jupiter-api")) - .recipeFromResource("/META-INF/rewrite/mockito.yml", "org.openrewrite.java.testing.mockito.MockitoBestPractices"); + .recipeFromResources("org.openrewrite.java.testing.mockito.MockitoBestPractices"); } @Test From a8e9320dd8810f674c824ab6288fef32a747cf30 Mon Sep 17 00:00:00 2001 From: Yurii Date: Mon, 16 Sep 2024 11:59:18 +0200 Subject: [PATCH 065/118] Bugfix/multiple curly braces in one verification block (#603) * process multiple curly braces blocks in one Verification * Apply formatter --------- Co-authored-by: Sheng Yu Co-authored-by: Tim te Beek --- .../java/testing/jmockit/JMockitUtils.java | 6 +- .../jmockit/SetupStatementsRewriter.java | 3 +- .../JMockitVerificationsToMockitoTest.java | 203 +++++++++++------- 3 files changed, 134 insertions(+), 78 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java index 4c515517d..a8e2a7453 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java @@ -36,8 +36,10 @@ static Optional getJMockitBlock(Statement s) { J.Identifier clazz = (J.Identifier) nc.getClazz(); // JMockit block should be composed of a block within another block - if (nc.getBody() == null || (nc.getBody().getStatements().size() != 1 && - !TypeUtils.isAssignableTo("mockit.Expectations", clazz.getType()))) { + if (nc.getBody() == null || + (nc.getBody().getStatements().size() != 1 && + !TypeUtils.isAssignableTo("mockit.Expectations", clazz.getType()) && + !TypeUtils.isAssignableTo("mockit.Verifications", clazz.getType()))) { return empty(); } diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java index 60fd69ffb..344e064c1 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java @@ -54,7 +54,8 @@ J.Block rewriteMethodBody() { // Account for Expectations which may contain multiple blocks List statementList = new ArrayList<>(); - if (TypeUtils.isAssignableTo("mockit.Expectations", nc.getType())) { + if (TypeUtils.isAssignableTo("mockit.Expectations", nc.getType()) || + TypeUtils.isAssignableTo("mockit.Verifications", nc.getType())) { statementList.addAll(nc.getBody().getStatements()); } else { statementList.add(expectationsBlock); diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java index faaff8edb..58f30cdd5 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -41,12 +41,12 @@ void whenNoTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new Verifications() {{ @@ -59,14 +59,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject).wait(anyLong(), anyInt()); @@ -88,12 +88,12 @@ void whenNoTimesNoArgs() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new Verifications() {{ @@ -106,14 +106,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject).wait(); @@ -133,17 +133,17 @@ void whenTimesNoArgs() { """ import java.util.ArrayList; import java.util.List; - + import mockit.Verifications; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(); myObject.wait(); @@ -157,18 +157,18 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(); myObject.wait(); @@ -188,7 +188,7 @@ void whenClassArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(List input) { return "X"; @@ -203,17 +203,17 @@ public String getSomeOtherField(Object input) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Mocked; import mockit.Verifications; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { myObject.getSomeField(new ArrayList<>()); myObject.getSomeOtherField(new Object()); @@ -227,18 +227,18 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import static org.mockito.Mockito.*; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { myObject.getSomeField(new ArrayList<>()); myObject.getSomeOtherField(new Object()); @@ -260,17 +260,17 @@ void whenMixedArgumentMatcher() { """ import java.util.ArrayList; import java.util.List; - + import mockit.Verifications; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new Verifications() {{ @@ -282,18 +282,18 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import static org.mockito.Mockito.*; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject).wait(anyLong(), eq(10)); @@ -314,12 +314,12 @@ void whenSetupStatements() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { String a = "a"; String s = "s"; @@ -336,15 +336,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { String a = "a"; String s = "s"; @@ -369,12 +369,12 @@ void whenSetupStatements2() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { String a = "a"; myObject.wait(1L); @@ -388,15 +388,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { String a = "a"; myObject.wait(1L); @@ -418,12 +418,12 @@ void whenTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -439,14 +439,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -469,12 +469,12 @@ void whenMinTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new Verifications() {{ @@ -488,14 +488,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(2)).wait(anyLong(), anyInt()); @@ -516,12 +516,12 @@ void whenMaxTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new Verifications() {{ @@ -535,14 +535,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atMost(5)).wait(anyLong(), anyInt()); @@ -563,12 +563,12 @@ void whenMinTimesMaxTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new Verifications() {{ @@ -583,14 +583,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(1)).wait(anyLong(), anyInt()); @@ -612,15 +612,15 @@ void whenMultipleStatements() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + @Mocked Object myOtherObject; - + void test() { myObject.hashCode(); myOtherObject.wait(); @@ -639,17 +639,17 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + @Mock Object myOtherObject; - + void test() { myObject.hashCode(); myOtherObject.wait(); @@ -676,18 +676,18 @@ void whenMultipleVerificationsAndMultipleStatements() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(); new Verifications() {{ - + myObject.wait(); - + myObject.wait(anyLong, anyInt); }}; myObject.wait(1L); @@ -703,14 +703,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(); verify(myObject).wait(); @@ -724,4 +724,57 @@ void test() { ) ); } + + @Test + void whenMultipleBlockInSingleVerification() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Verifications() { + { + myObject.wait(); + myObject.wait(anyLong, anyInt); + } + { + myObject.wait(anyLong); + times = 2; + } + }; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + verify(myObject).wait(); + verify(myObject).wait(anyLong(), anyInt()); + verify(myObject, times(2)).wait(anyLong()); + } + } + """ + ) + ); + } } From 13fcf5552034268a1d236b399348cc4b7338bfb5 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 16 Sep 2024 17:43:59 +0200 Subject: [PATCH 066/118] Do not `assertDoesNotThrow` when using `reactor.test.StepVerifier` --- .../cleanup/TestsShouldIncludeAssertions.java | 17 +++---- .../TestsShouldIncludeAssertionsTest.java | 46 +++++++++---------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java index 24db0e09c..9800de315 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java @@ -38,21 +38,22 @@ public class TestsShouldIncludeAssertions extends Recipe { private static final List TEST_ANNOTATIONS = Collections.singletonList("org.junit.jupiter.api.Test"); private static final List DEFAULT_ASSERTIONS = Arrays.asList( + "com.github.tomakehurst.wiremock.client.WireMock", + "io.restassured", + "mockit", "org.assertj.core.api", - "org.junit.jupiter.api.Assertions", + "org.easymock", "org.hamcrest.MatcherAssert", + "org.jmock", + "org.junit.Assert", // rarely, the test annotation is junit 5 but the assert is junit 4 + "org.junit.jupiter.api.Assertions", "org.mockito.Mockito.verify", "org.mockito.Mockito.verifyNoInteractions", "org.mockito.Mockito.verifyNoMoreInteractions", "org.mockito.Mockito.verifyZeroInteractions", - "org.easymock", - "org.jmock", - "mockit", - "io.restassured", - "org.springframework.test.web.servlet.ResultActions", "org.springframework.test.web.client.MockRestServiceServer.verify", - "com.github.tomakehurst.wiremock.client.WireMock", - "org.junit.Assert"// rarely, the test annotation is junit 5 but the assert is junit 4 + "org.springframework.test.web.servlet.ResultActions", + "reactor.test.StepVerifier" ); @Option(displayName = "Additional assertions", diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java index 6b8baa713..9f9a2adc4 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java @@ -70,9 +70,9 @@ public void methodTest() { """, """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - + public class AaTest { @Test public void methodTest() { @@ -94,11 +94,11 @@ void hasAssertDoesNotThrowAssertion() { java( """ import org.junit.jupiter.api.Test; - + import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - + public class AaTest { - + @Test public void methodTest() { assertDoesNotThrow(() -> { @@ -119,11 +119,11 @@ void assertJAssertion() { java( """ import org.junit.jupiter.api.Test; - + import static org.assertj.core.api.Assertions.assertThat; - + public class MyTest { - + @Test public void test() { assertThat(notification()).isEqualTo(1); @@ -144,10 +144,10 @@ void hamcrestAssertion() { java( """ import org.junit.jupiter.api.Test; - + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; - + public class ATest { @Test public void methodTest() { @@ -189,16 +189,16 @@ void methodBodyContainsMethodInvocationWithAssert() { """ import java.util.Set; import org.junit.jupiter.api.Test; - + import static org.junit.Assert.assertTrue; - + public class TestClass { @Test public void methodTest() { Set s = Set.of("hello"); testContains(s, "hello"); } - + private static void testContains(Set set, String word) { assertTrue(set.contains(word)); } @@ -218,9 +218,9 @@ void usesAdditionalAssertion() { java( """ package org.foo; - + import java.util.Set; - + public class TestUtil { public static void testContains(Set set, String word) { } @@ -252,7 +252,7 @@ public void changes() { import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import org.junit.jupiter.api.Test; - + public class TestClass { @Test public void doesNotChange() { @@ -287,7 +287,7 @@ void hasMockitoVerify() { class AaTest { @Mock MyMathService myMathService; - + @Test public void verifyTest() { when(myMathService.addIntegers("1", "2")).thenReturn(3); @@ -313,12 +313,12 @@ void hasMockitoVerifyNoInteractions() { class AaTest { @Mock org.learning.math.MyMathService myMathService; - + @Test public void noMore() { verifyNoMoreInteractions(myMathService); } - + @Test public void zero() { verifyZeroInteractions(myMathService); @@ -340,11 +340,11 @@ void hasMockitoDoesNotValidate() { import org.learning.math.MyMathService; import static org.mockito.Mockito.when; import org.learning.math.Stuff; - + class AaTest { @Mock MyMathService myMathService; - + @Test public void methodTest() { when(myMathService.addIntegers("1", "2")).thenReturn(3); @@ -360,11 +360,11 @@ public void methodTest() { import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.Mockito.when; import org.learning.math.Stuff; - + class AaTest { @Mock MyMathService myMathService; - + @Test public void methodTest() { assertDoesNotThrow(() -> { From 5be8a6f6f4c99a1c6fedd06e3f811920fa60b60e Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 16 Sep 2024 17:52:37 +0200 Subject: [PATCH 067/118] Ignore disabled or empty tests in `TestsShouldIncludeAssertions` --- .../cleanup/TestsShouldIncludeAssertions.java | 25 ++++++------ .../TestsShouldIncludeAssertionsTest.java | 38 +++++++++++++++++++ 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java index 9800de315..50ed1e10e 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertions.java @@ -99,16 +99,6 @@ public TreeVisitor getVisitor() { private static class TestShouldIncludeAssertionsVisitor extends JavaIsoVisitor { - JavaParser.Builder javaParser; - - private JavaParser.Builder javaParser(ExecutionContext ctx) { - if (javaParser == null) { - javaParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "junit-jupiter-api-5.9"); - } - return javaParser; - } - private final Map> matcherPatternToClassInvocation = new HashMap<>(); private final List additionalAsserts; @@ -123,7 +113,8 @@ private static class TestShouldIncludeAssertionsVisitor extends JavaIsoVisitor #{any()});") .staticImports("org.junit.jupiter.api.Assertions.assertDoesNotThrow") - .javaParser(javaParser(ctx)) + .javaParser(JavaParser.fromJavaVersion() + .classpathFromResources(ctx, "junit-jupiter-api-5.9")) .build() .apply(updateCursor(md), md.getCoordinates().replaceBody(), body); } @@ -153,6 +145,15 @@ private boolean methodIsTest(J.MethodDeclaration methodDeclaration) { return false; } + private boolean methodIsDisabled(J.MethodDeclaration methodDeclaration) { + for (J.Annotation leadingAnnotation : methodDeclaration.getLeadingAnnotations()) { + if (TypeUtils.isOfClassType(leadingAnnotation.getType(), "org.junit.jupiter.api.Disabled")) { + return true; + } + } + return false; + } + private boolean methodHasAssertion(J.Block body) { AtomicBoolean hasAssertion = new AtomicBoolean(Boolean.FALSE); JavaIsoVisitor findAssertionVisitor = new JavaIsoVisitor() { diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java index 9f9a2adc4..aee4f6c03 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/TestsShouldIncludeAssertionsTest.java @@ -399,4 +399,42 @@ public void verifyTest() { ) ); } + + @Test + void ignoreDisabled() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Disabled; + import org.junit.jupiter.api.Test; + public class AaTest { + @Disabled + @Test + public void methodTest() { + Integer it = Integer.valueOf("2"); + System.out.println(it); + } + } + """ + ) + ); + } + + @Test + void ignoreEmpty() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + public class AaTest { + @Test + public void methodTest() { + } + } + """ + ) + ); + } } From 43671491f0d5bf7e449b98ae43a68be3215debc9 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Sat, 21 Sep 2024 13:39:12 +0200 Subject: [PATCH 068/118] Refactor `Mockito.when` on static (non mock) to try with resource (#601) * WIP * Format and suggestion * Add recipe to mockito recipes Add missing imports Fill out name and desc * Update test with TypeValidation * Format and refactor to remove errors * Reduce and flatten ahead of further changes * Show problematic case with new unit test * Generate a non-conflicting variable name of the right type * Switch to `ListUtils.flatMap` without `mock` field in test * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Make recursive in case multiple occurrences exist * Return immediately * Reduce nesting and clarify intent through method rename * Only add preceding statements before try, not all * Shorten qualified class refs & enable method type validation --------- Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../MockitoWhenOnStaticToMockStatic.java | 115 ++++++++++++++ .../resources/META-INF/rewrite/mockito.yml | 1 + .../MockitoWhenOnStaticToMockStaticTest.java | 150 ++++++++++++++++++ 3 files changed, 266 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java create mode 100644 src/test/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStaticTest.java diff --git a/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java b/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java new file mode 100644 index 000000000..7836ca0e9 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java @@ -0,0 +1,115 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.VariableNameUtils; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.Flag; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.Statement; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class MockitoWhenOnStaticToMockStatic extends Recipe { + + private static final MethodMatcher MOCKITO_WHEN = new MethodMatcher("org.mockito.Mockito when(..)"); + + @Override + public String getDisplayName() { + return "Replace `Mockito.when` on static (non mock) with try-with-resource with MockedStatic"; + } + + @Override + public String getDescription() { + return "Replace `Mockito.when` on static (non mock) with try-with-resource with MockedStatic as Mockito4 no longer allows this."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesMethod<>(MOCKITO_WHEN), new JavaIsoVisitor() { + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx) { + J.MethodDeclaration m = super.visitMethodDeclaration(method, ctx); + if (m.getBody() == null) { + return m; + } + + List newStatements = maybeWrapStatementsInTryWithResourcesMockedStatic(m, m.getBody().getStatements()); + return maybeAutoFormat(m, m.withBody(m.getBody().withStatements(newStatements)), ctx); + } + + private List maybeWrapStatementsInTryWithResourcesMockedStatic(J.MethodDeclaration m, List remainingStatements) { + AtomicBoolean restInTry = new AtomicBoolean(false); + return ListUtils.flatMap(remainingStatements, (index, statement) -> { + if (restInTry.get()) { + // Rest of the statements have ended up in the try block + return Collections.emptyList(); + } + + if (statement instanceof J.MethodInvocation && + MOCKITO_WHEN.matches(((J.MethodInvocation) statement).getSelect())) { + J.MethodInvocation when = (J.MethodInvocation) ((J.MethodInvocation) statement).getSelect(); + if (when != null && when.getArguments().get(0) instanceof J.MethodInvocation) { + J.MethodInvocation whenArg = (J.MethodInvocation) when.getArguments().get(0); + if (whenArg.getMethodType() != null && whenArg.getMethodType().hasFlags(Flag.Static)) { + J.Identifier clazz = (J.Identifier) whenArg.getSelect(); + if (clazz != null && clazz.getType() != null) { + String mockName = VariableNameUtils.generateVariableName("mock" + clazz.getSimpleName(), updateCursor(m), VariableNameUtils.GenerationStrategy.INCREMENT_NUMBER); + maybeAddImport("org.mockito.MockedStatic", false); + maybeAddImport("org.mockito.Mockito", "mockStatic"); + String template = String.format( + "try(MockedStatic<%1$s> %2$s = mockStatic(%1$s.class)) {\n" + + " %2$s.when(#{any()}).thenReturn(#{any()});\n" + + "}", clazz.getSimpleName(), mockName); + J.Try try_ = (J.Try) ((J.MethodDeclaration) JavaTemplate.builder(template) + .contextSensitive() + .imports("org.mockito.MockedStatic") + .staticImports("org.mockito.Mockito.mockStatic") + .build() + .apply(getCursor(), m.getCoordinates().replaceBody(), + whenArg, ((J.MethodInvocation) statement).getArguments().get(0))) + .getBody().getStatements().get(0); + + restInTry.set(true); + + List precedingStatements = remainingStatements.subList(0, index); + return try_.withBody(try_.getBody().withStatements(ListUtils.concatAll( + try_.getBody().getStatements(), + maybeWrapStatementsInTryWithResourcesMockedStatic( + m.withBody(m.getBody().withStatements(ListUtils.concat(precedingStatements, try_))), + remainingStatements.subList(index + 1, remainingStatements.size()) + )))) + .withPrefix(statement.getPrefix()); + } + } + } + } + return statement; + }); + } + }); + } +} diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index fd6028729..7e60ad788 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -59,6 +59,7 @@ tags: - mockito recipeList: - org.openrewrite.java.testing.mockito.Mockito1to3Migration + - org.openrewrite.java.testing.mockito.MockitoWhenOnStaticToMockStatic - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: org.mockito artifactId: "*" diff --git a/src/test/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStaticTest.java b/src/test/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStaticTest.java new file mode 100644 index 000000000..a7eb4b724 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStaticTest.java @@ -0,0 +1,150 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.SourceSpec; +import org.openrewrite.test.TypeValidation; + +import static org.openrewrite.java.Assertions.java; + +class MockitoWhenOnStaticToMockStaticTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new MockitoWhenOnStaticToMockStatic()) + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), + "junit-4.13", + "mockito-core-3.12", + "mockito-junit-jupiter-3.12" + )); + } + + @DocumentExample + @Test + void shouldRefactorMockito_When() { + //language=java + rewriteRun( + spec -> spec.afterTypeValidationOptions(TypeValidation.builder().identifiers(false).build()), + java( + """ + package com.foo; + public class A { + public static Integer getNumber() { + return 42; + } + } + """, + SourceSpec::skip + ), + java( + """ + import com.foo.A; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + class Test { + void test() { + when(A.getNumber()).thenReturn(-1); + assertEquals(A.getNumber(), -1); + } + } + """, + """ + import com.foo.A; + import org.mockito.MockedStatic; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + class Test { + void test() { + try (MockedStatic mockA = mockStatic(A.class)) { + mockA.when(A.getNumber()).thenReturn(-1); + assertEquals(A.getNumber(), -1); + } + } + } + """ + ) + ); + } + + @Test + void shouldHandleMultipleStaticMocks() { + //language=java + rewriteRun( + spec -> spec.afterTypeValidationOptions(TypeValidation.builder().identifiers(false).build()), + java( + """ + package com.foo; + public class A { + public static Integer getNumber() { + return 42; + } + } + """, + SourceSpec::skip + ), + java( + """ + import com.foo.A; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + class Test { + void test() { + when(A.getNumber()).thenReturn(-1); + assertEquals(A.getNumber(), -1); + + when(A.getNumber()).thenReturn(-2); + assertEquals(A.getNumber(), -2); + } + } + """, + """ + import com.foo.A; + import org.mockito.MockedStatic; + + import static org.junit.Assert.assertEquals; + import static org.mockito.Mockito.*; + + class Test { + void test() { + try (MockedStatic mockA = mockStatic(A.class)) { + mockA.when(A.getNumber()).thenReturn(-1); + assertEquals(A.getNumber(), -1); + + try (MockedStatic mockA1 = mockStatic(A.class)) { + mockA1.when(A.getNumber()).thenReturn(-2); + assertEquals(A.getNumber(), -2); + } + } + } + } + """ + ) + ); + } +} From d9711b60e5825b7a17c9c83ccb372cc93f316726 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sat, 21 Sep 2024 17:21:29 +0200 Subject: [PATCH 069/118] refactor: Operator wrapping on end of line (#608) Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.staticanalysis.OperatorWrap?organizationId=T3BlblJld3JpdGU%3D#defaults=W3sidmFsdWUiOiJFT0wiLCJuYW1lIjoid3JhcE9wdGlvbiJ9XQ== Co-authored-by: Moderne --- ...UnitAssertThrowsToAssertExceptionType.java | 6 ++-- .../SimplifyChainedAssertJAssertion.java | 4 +-- .../AssertEqualsBooleanToAssertBoolean.java | 4 +-- .../AssertFalseEqualsToAssertNotEquals.java | 4 +-- ...AssertNotEqualsBooleanToAssertBoolean.java | 4 +-- .../AssertTrueComparisonToAssertEquals.java | 8 ++--- .../AssertTrueEqualsToAssertEquals.java | 4 +-- .../testing/cleanup/RemoveTestPrefix.java | 32 +++++++++---------- .../testing/cleanup/SimplifyTestThrows.java | 16 +++++----- .../cleanup/TestsShouldNotBePublic.java | 24 +++++++------- .../jmockit/ArgumentMatchersRewriter.java | 8 ++--- .../jmockit/SetupStatementsRewriter.java | 10 +++--- ...ssertTrueInstanceofToAssertInstanceOf.java | 6 ++-- .../java/testing/junit5/EnclosedToNested.java | 4 +-- .../ExpectedExceptionToAssertThrows.java | 4 +-- .../testing/junit5/GradleUseJunitJupiter.java | 14 ++++---- .../JUnitParamsRunnerToParameterized.java | 8 ++--- .../testing/junit5/LifecycleNonPrivate.java | 4 +-- .../testing/junit5/MigrateJUnitTestCase.java | 4 +-- .../ParameterizedRunnerToParameterized.java | 4 +-- .../java/testing/junit5/TempDirNonFinal.java | 4 +-- .../junit5/TemporaryFolderToTempDir.java | 8 ++--- .../testing/junit5/UpdateTestAnnotation.java | 4 +-- .../mockito/CleanupMockitoImports.java | 6 ++-- 24 files changed, 97 insertions(+), 97 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java index 10eb1b5f2..6a880f816 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java @@ -52,9 +52,9 @@ private static class AssertExceptionTypeVisitor extends JavaIsoVisitor mod.getType() == J.Modifier.Type.Public) - && c.getModifiers().stream().noneMatch(mod -> mod.getType() == J.Modifier.Type.Abstract) - && !acc.extendedClasses.contains(String.valueOf(c.getType()))) { + if (c.getKind() != J.ClassDeclaration.Kind.Type.Interface && + c.getModifiers().stream().anyMatch(mod -> mod.getType() == J.Modifier.Type.Public) && + c.getModifiers().stream().noneMatch(mod -> mod.getType() == J.Modifier.Type.Abstract) && + !acc.extendedClasses.contains(String.valueOf(c.getType()))) { boolean hasTestMethods = c.getBody().getStatements().stream() .filter(org.openrewrite.java.tree.J.MethodDeclaration.class::isInstance) .map(J.MethodDeclaration.class::cast) @@ -168,14 +168,14 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex private boolean hasJUnit5MethodAnnotation(J.MethodDeclaration method) { for (J.Annotation a : method.getLeadingAnnotations()) { - if (TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.Test") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.RepeatedTest") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.params.ParameterizedTest") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.TestFactory") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.AfterEach") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.BeforeEach") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.AfterAll") - || TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.BeforeAll")) { + if (TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.Test") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.RepeatedTest") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.params.ParameterizedTest") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.TestFactory") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.AfterEach") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.BeforeEach") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.AfterAll") || + TypeUtils.isOfClassType(a.getType(), "org.junit.jupiter.api.BeforeAll")) { return true; } } diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java index 8b24ee034..ee5e86c59 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java @@ -203,10 +203,10 @@ private Expression rewriteFullyQualifiedToArgumentMatcher(Expression methodArgum // update the Class type parameter and method return type Expression classArgument = (Expression) templateParams.get(0); - if (classArgument.getType() == null - || invocationArgument.getMethodType() == null - || invocationArgument.getMethodType().getParameterTypes().size() != 1 - || !(invocationArgument.getMethodType().getParameterTypes().get(0) instanceof JavaType.Parameterized)) { + if (classArgument.getType() == null || + invocationArgument.getMethodType() == null || + invocationArgument.getMethodType().getParameterTypes().size() != 1 || + !(invocationArgument.getMethodType().getParameterTypes().get(0) instanceof JavaType.Parameterized)) { return invocationArgument; } JavaType.Parameterized newParameterType = diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java index 344e064c1..473f82be4 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/SetupStatementsRewriter.java @@ -139,8 +139,8 @@ private static boolean isNotMockIdentifier(J.Identifier identifier, Set if (spies.contains(identifier.getSimpleName())) { return false; } - if (identifier.getType() instanceof JavaType.Method - && TypeUtils.isAssignableTo("mockit.Invocations", + if (identifier.getType() instanceof JavaType.Method && + TypeUtils.isAssignableTo("mockit.Invocations", ((JavaType.Method) identifier.getType()).getDeclaringType())) { return false; } @@ -149,9 +149,9 @@ private static boolean isNotMockIdentifier(J.Identifier identifier, Set return true; } for (JavaType.FullyQualified annotationType : fieldType.getAnnotations()) { - if (TypeUtils.isAssignableTo("mockit.Mocked", annotationType) - || TypeUtils.isAssignableTo("mockit.Injectable", annotationType) - || TypeUtils.isAssignableTo("mockit.Tested", annotationType)) { + if (TypeUtils.isAssignableTo("mockit.Mocked", annotationType) || + TypeUtils.isAssignableTo("mockit.Injectable", annotationType) || + TypeUtils.isAssignableTo("mockit.Tested", annotationType)) { return false; } } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AssertTrueInstanceofToAssertInstanceOf.java b/src/main/java/org/openrewrite/java/testing/junit5/AssertTrueInstanceofToAssertInstanceOf.java index 30bc12d38..a80e9b5dd 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AssertTrueInstanceofToAssertInstanceOf.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AssertTrueInstanceofToAssertInstanceOf.java @@ -99,9 +99,9 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu .staticImports("org.junit.jupiter.api.Assertions.assertInstanceOf") .build(); - J.MethodInvocation methodd = reason != null - ? template.apply(getCursor(), mi.getCoordinates().replace(), clazz.toString(), expression, reason) - : template.apply(getCursor(), mi.getCoordinates().replace(), clazz.toString(), expression); + J.MethodInvocation methodd = reason != null ? + template.apply(getCursor(), mi.getCoordinates().replace(), clazz.toString(), expression, reason) : + template.apply(getCursor(), mi.getCoordinates().replace(), clazz.toString(), expression); maybeAddImport("org.junit.jupiter.api.Assertions", "assertInstanceOf"); return methodd; } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java index d4d54c8f4..28e16a4c2 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java @@ -93,8 +93,8 @@ private JavaTemplate getNestedJavaTemplate(ExecutionContext ctx) { } private boolean hasTestMethods(final J.ClassDeclaration cd) { - return !FindAnnotations.find(cd, "@" + TEST_JUNIT4).isEmpty() - || !FindAnnotations.find(cd, "@" + TEST_JUNIT_JUPITER).isEmpty(); + return !FindAnnotations.find(cd, "@" + TEST_JUNIT4).isEmpty() || + !FindAnnotations.find(cd, "@" + TEST_JUNIT_JUPITER).isEmpty(); } } } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index 1253442bf..9d4dfb004 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -154,8 +154,8 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl } } - String exceptionDeclParam = ((isExpectArgAMatcher || isExpectMessageArgAMatcher || isExpectedCauseArgAMatcher) - || expectMessageMethodInvocation != null) ? + String exceptionDeclParam = ((isExpectArgAMatcher || isExpectMessageArgAMatcher || isExpectedCauseArgAMatcher) || + expectMessageMethodInvocation != null) ? "Throwable exception = " : ""; Object expectedExceptionParam = (expectMethodInvocation == null || isExpectArgAMatcher) ? diff --git a/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java b/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java index 8fbe83308..8d2b1280e 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/GradleUseJunitJupiter.java @@ -194,9 +194,9 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu } break; case "withType": - if (m.getSelect() == null - || !TypeUtils.isOfClassType(m.getSelect().getType(), "org.gradle.api.tasks.TaskContainer") - || !(m.getArguments().get(0) instanceof J.Identifier && "Test".equals(((J.Identifier) m.getArguments().get(0)).getSimpleName()))) { + if (m.getSelect() == null || + !TypeUtils.isOfClassType(m.getSelect().getType(), "org.gradle.api.tasks.TaskContainer") || + !(m.getArguments().get(0) instanceof J.Identifier && "Test".equals(((J.Identifier) m.getArguments().get(0)).getSimpleName()))) { return m; } break; @@ -208,10 +208,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu return m; } J.MethodInvocation select = (J.MethodInvocation) m.getSelect(); - if(!"withType".equals(select.getSimpleName()) - || select.getArguments().size() != 1 - || !(select.getArguments().get(0) instanceof J.Identifier) - || !"Test".equals(((J.Identifier) select.getArguments().get(0)).getSimpleName())) { + if(!"withType".equals(select.getSimpleName()) || + select.getArguments().size() != 1 || + !(select.getArguments().get(0) instanceof J.Identifier) || + !"Test".equals(((J.Identifier) select.getArguments().get(0)).getSimpleName())) { return m; } break; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java b/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java index 5c0e2e3ac..616ee48c0 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/JUnitParamsRunnerToParameterized.java @@ -148,10 +148,10 @@ public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ct private @Nullable String getAnnotationArgumentForInitMethod(J.Annotation anno, String... variableNames) { String value = null; - if (anno.getArguments() != null && anno.getArguments().size() == 1 - && anno.getArguments().get(0) instanceof J.Assignment - && ((J.Assignment) anno.getArguments().get(0)).getVariable() instanceof J.Identifier - && ((J.Assignment) anno.getArguments().get(0)).getAssignment() instanceof J.Literal) { + if (anno.getArguments() != null && anno.getArguments().size() == 1 && + anno.getArguments().get(0) instanceof J.Assignment && + ((J.Assignment) anno.getArguments().get(0)).getVariable() instanceof J.Identifier && + ((J.Assignment) anno.getArguments().get(0)).getAssignment() instanceof J.Literal) { J.Assignment annoArg = (J.Assignment) anno.getArguments().get(0); J.Literal assignment = (J.Literal) annoArg.getAssignment(); String identifier = ((J.Identifier) annoArg.getVariable()).getSimpleName(); diff --git a/src/main/java/org/openrewrite/java/testing/junit5/LifecycleNonPrivate.java b/src/main/java/org/openrewrite/java/testing/junit5/LifecycleNonPrivate.java index 273362d04..57a3a47d0 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/LifecycleNonPrivate.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/LifecycleNonPrivate.java @@ -67,8 +67,8 @@ private static class LifecycleNonPrivateVisitor extends JavaIsoVisitor lifeCycleAnnotationMatchers.stream() + if (J.Modifier.hasModifier(md.getModifiers(), Type.Private) && + md.getLeadingAnnotations().stream().anyMatch(ann -> lifeCycleAnnotationMatchers.stream() .anyMatch(matcher -> matcher.matches(ann)))) { return maybeAutoFormat(md, md.withModifiers(ListUtils.map(md.getModifiers(), diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java index 0e07eed51..e9ce733b0 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java @@ -85,8 +85,8 @@ public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionCon @Override public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); - if ((mi.getSelect() != null && TypeUtils.isOfClassType(mi.getSelect().getType(), "junit.framework.TestCase")) - || (mi.getMethodType() != null && TypeUtils.isOfClassType(mi.getMethodType().getDeclaringType(), "junit.framework.TestCase"))) { + if ((mi.getSelect() != null && TypeUtils.isOfClassType(mi.getSelect().getType(), "junit.framework.TestCase")) || + (mi.getMethodType() != null && TypeUtils.isOfClassType(mi.getMethodType().getDeclaringType(), "junit.framework.TestCase"))) { String name = mi.getSimpleName(); // setUp and tearDown will be invoked via Before and After annotations if ("setUp".equals(name) || "tearDown".equals(name)) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java b/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java index 269390a54..64c919aac 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ParameterizedRunnerToParameterized.java @@ -280,8 +280,8 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex cd = cd.withBody(cd.getBody().withStatements(ListUtils.map(cd.getBody().getStatements(), statement -> { if (statement instanceof J.VariableDeclarations) { J.VariableDeclarations varDecls = (J.VariableDeclarations) statement; - if (varDecls.getVariables().stream().anyMatch(it -> fieldNames.contains(it.getSimpleName())) - && (varDecls.hasModifier(J.Modifier.Type.Final))) { + if (varDecls.getVariables().stream().anyMatch(it -> fieldNames.contains(it.getSimpleName())) && + (varDecls.hasModifier(J.Modifier.Type.Final))) { varDecls = varDecls.withModifiers(ListUtils.map(varDecls.getModifiers(), mod -> mod.getType() == J.Modifier.Type.Final ? null : mod)); statement = maybeAutoFormat(statement, varDecls, ctx, new Cursor(getCursor(), finalBody)); } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TempDirNonFinal.java b/src/main/java/org/openrewrite/java/testing/junit5/TempDirNonFinal.java index 6ba7eb1e1..d843cf349 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TempDirNonFinal.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TempDirNonFinal.java @@ -50,8 +50,8 @@ private static class TempDirVisitor extends JavaIsoVisitor { @Override public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations multiVariable, ExecutionContext ctx) { J.VariableDeclarations varDecls = super.visitVariableDeclarations(multiVariable, ctx); - if (varDecls.getLeadingAnnotations().stream().anyMatch(TEMPDIR_ANNOTATION_MATCHER::matches) - && varDecls.hasModifier(Type.Final) && isField(getCursor())) { + if (varDecls.getLeadingAnnotations().stream().anyMatch(TEMPDIR_ANNOTATION_MATCHER::matches) && + varDecls.hasModifier(Type.Final) && isField(getCursor())) { return maybeAutoFormat(varDecls, varDecls.withModifiers(ListUtils .map(varDecls.getModifiers(), modifier -> modifier.getType() == Type.Final ? null : modifier)), ctx, getCursor().getParentOrThrow()); diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java index d67f5b5a9..7b0bb2d08 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java @@ -103,16 +103,16 @@ public J visitVariableDeclarations(J.VariableDeclarations multiVariable, Executi } private boolean isRuleAnnotatedTemporaryFolder(J.VariableDeclarations vd) { - return TypeUtils.isOfClassType(vd.getTypeAsFullyQualified(), "org.junit.rules.TemporaryFolder") - && vd.getLeadingAnnotations().stream().anyMatch(anno -> classRule.matches(anno) || rule.matches(anno)); + return TypeUtils.isOfClassType(vd.getTypeAsFullyQualified(), "org.junit.rules.TemporaryFolder") && + vd.getLeadingAnnotations().stream().anyMatch(anno -> classRule.matches(anno) || rule.matches(anno)); } @Override public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation mi = (J.MethodInvocation) super.visitMethodInvocation(method, ctx); updateCursor(mi); - if (mi.getSelect() != null && mi.getMethodType() != null - && TypeUtils.isOfClassType(mi.getMethodType().getDeclaringType(), "org.junit.rules.TemporaryFolder")) { + if (mi.getSelect() != null && mi.getMethodType() != null && + TypeUtils.isOfClassType(mi.getMethodType().getDeclaringType(), "org.junit.rules.TemporaryFolder")) { switch (mi.getSimpleName()) { case "newFile": return convertToNewFile(mi, ctx); diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java index dbe906653..7031cf792 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java @@ -135,8 +135,8 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex assert lambda != null; - if (cta.expectedException instanceof J.FieldAccess - && TypeUtils.isAssignableTo("org.junit.Test$None", ((J.FieldAccess) cta.expectedException).getTarget().getType())) { + if (cta.expectedException instanceof J.FieldAccess && + TypeUtils.isAssignableTo("org.junit.Test$None", ((J.FieldAccess) cta.expectedException).getTarget().getType())) { m = JavaTemplate.builder("assertDoesNotThrow(#{any(org.junit.jupiter.api.function.Executable)});") .javaParser(javaParser(ctx)) .staticImports("org.junit.jupiter.api.Assertions.assertDoesNotThrow") diff --git a/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java b/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java index 2a120e833..08ada5309 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/CleanupMockitoImports.java @@ -153,9 +153,9 @@ private static class QualifiedMockitoMethodTypeVisitor extends JavaIsoVisitor

  • qualifiedMethods) { J.MethodInvocation mi = super.visitMethodInvocation(method, qualifiedMethods); - if (MOCKITO_METHOD_NAMES.contains(mi.getSimpleName()) - && mi.getSelect() != null - && TypeUtils.isAssignableTo("org.mockito.Mockito", mi.getSelect().getType())) { + if (MOCKITO_METHOD_NAMES.contains(mi.getSimpleName()) && + mi.getSelect() != null && + TypeUtils.isAssignableTo("org.mockito.Mockito", mi.getSelect().getType())) { qualifiedMethods.add(mi.getSimpleName()); } return mi; From f58e66581c3ee98005b27b2b660321d14f0bd29d Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sat, 21 Sep 2024 17:57:20 +0200 Subject: [PATCH 070/118] Add nullable scope argument to DependencyInsight --- .../openrewrite/java/testing/mockito/RetainStrictnessWarn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java b/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java index 9a5ef294b..cdda4962a 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java @@ -57,7 +57,7 @@ public AtomicBoolean getInitialValue(ExecutionContext ctx) { @Override public TreeVisitor getScanner(AtomicBoolean usingOlderMockito) { - TreeVisitor div = new DependencyInsight("org.mockito", "mockito-*", "[1.1,2.17)").getVisitor(); + TreeVisitor div = new DependencyInsight("org.mockito", "mockito-*", "[1.1,2.17)", null).getVisitor(); return new TreeVisitor() { @Override public @Nullable Tree visit(@Nullable Tree tree, ExecutionContext ctx) { From 823e3c3f5211e855a25aec25c757812a60f5e7ef Mon Sep 17 00:00:00 2001 From: Shannon Pamperl Date: Mon, 23 Sep 2024 23:22:01 -0500 Subject: [PATCH 071/118] refactor: Update Gradle wrapper (#609) Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.gradle.UpdateGradleWrapper?organizationId=T3BlblJld3JpdGU%3D#defaults=W3sibmFtZSI6ImRpc3RyaWJ1dGlvbiIsInZhbHVlIjoiYmluIn1d Co-authored-by: Moderne --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cb4e5525f..7c553f646 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 +distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26 From cb2af2c1137722b9908cbd0351f5061be7b00401 Mon Sep 17 00:00:00 2001 From: Laurens Westerlaken Date: Mon, 30 Sep 2024 18:15:13 +0200 Subject: [PATCH 072/118] `PowerMockitoMockStaticToMockito` should not remove existing `mockStatic` initializer (#612) * When mockito `mockStatic` is used as variable initializer we shouldn't return null * Apply suggestions from code review --------- Co-authored-by: Tim te Beek --- .../PowerMockitoMockStaticToMockito.java | 4 +++- .../PowerMockitoMockStaticToMockitoTest.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index c1f7d2133..019425f50 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -190,7 +190,9 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) if (MOCKED_STATIC_MATCHER.matches(mi)) { determineTestGroups(); - if (!getCursor().getPath(o -> o instanceof J.Assignment || o instanceof J.Try.Resource).hasNext()) { + if (!getCursor().getPath(o -> o instanceof J.VariableDeclarations || + o instanceof J.Assignment || + o instanceof J.Try.Resource).hasNext()) { //noinspection DataFlowIssue return null; } diff --git a/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java index a9fa9a0cb..81625d90d 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java @@ -681,6 +681,25 @@ public void testStaticMethod() { ); } + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/611") + void existingMockitoMockStaticShouldNotBeTouched() { + //language=java + rewriteRun( + java( + """ + import static org.mockito.Mockito.mockStatic; + + import org.mockito.MockedStatic; + + class TestClass { + MockedStatic mocked = mockStatic(String.class); + } + """ + ) + ); + } + @Test @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/358") void doesNotExplodeOnTopLevelMethodDeclaration() { From 058d2ff66cca4873d37058b0412873bea0b7d117 Mon Sep 17 00:00:00 2001 From: Nate Danner Date: Tue, 1 Oct 2024 16:59:20 -0700 Subject: [PATCH 073/118] update to latest error prone to remove protobuf-java@3.19.2 vulnerability (#613) --- build.gradle.kts | 2 +- suppressions.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index bce1547cf..71a58d2a0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -53,7 +53,7 @@ dependencies { annotationProcessor("org.openrewrite:rewrite-templating:${rewriteVersion}") implementation("org.openrewrite:rewrite-templating:${rewriteVersion}") - compileOnly("com.google.errorprone:error_prone_core:2.19.1:with-dependencies") { + compileOnly("com.google.errorprone:error_prone_core:2.+:with-dependencies") { exclude("com.google.auto.service", "auto-service-annotations") } diff --git a/suppressions.xml b/suppressions.xml index fbf9371b9..cc839fdf3 100644 --- a/suppressions.xml +++ b/suppressions.xml @@ -1,3 +1,11 @@ + + + ^pkg:javascript/DOMPurify@.*$ + CVE-2024-45801 + From 6fff817a35ee28f218f358601d24f3542434a8d6 Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Fri, 11 Oct 2024 21:40:19 +1100 Subject: [PATCH 074/118] JMockit to Mockito IllegalArumentException No enum constant VerificationsInOrder (#616) * Fix bug where JMockit VerificationsInOrder generates IllegalArgumentException because it isn't supported yet * Cleanup --- .../java/testing/jmockit/JMockitUtils.java | 17 ++++--- .../JMockitExpectationsToMockitoTest.java | 44 +++++++++++++++- .../JMockitVerificationsToMockitoTest.java | 51 +++++++++++++++++++ 3 files changed, 103 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java index a8e2a7453..a362882b8 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitUtils.java @@ -16,9 +16,11 @@ package org.openrewrite.java.testing.jmockit; import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.Statement; import org.openrewrite.java.tree.TypeUtils; +import java.util.Arrays; import java.util.Optional; import static java.util.Optional.empty; @@ -29,20 +31,19 @@ static Optional getJMockitBlock(Statement s) { if (!(s instanceof J.NewClass)) { return empty(); } + J.NewClass nc = (J.NewClass) s; - if (!(nc.getClazz() instanceof J.Identifier)) { + if (nc.getBody() == null || nc.getClazz() == null) { return empty(); } - J.Identifier clazz = (J.Identifier) nc.getClazz(); - // JMockit block should be composed of a block within another block - if (nc.getBody() == null || - (nc.getBody().getStatements().size() != 1 && - !TypeUtils.isAssignableTo("mockit.Expectations", clazz.getType()) && - !TypeUtils.isAssignableTo("mockit.Verifications", clazz.getType()))) { + JavaType type = nc.getClazz().getType(); + if (type == null) { return empty(); } - return Optional.of(JMockitBlockType.valueOf(clazz.getSimpleName())); + return Arrays.stream(JMockitBlockType.values()) + .filter(supportedType -> TypeUtils.isOfClassType(type, supportedType.getFqn())) + .findFirst(); } } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index 7ebd6531a..b2b529193 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -1492,7 +1492,7 @@ void test() { } @Test - void whenMultipleExpectationsNoResults() { + void whenMultipleExpectationsNoResults() { //language=java rewriteRun( java( @@ -1619,4 +1619,46 @@ void test() { ) ); } + + @Test + void whenEmptyBlock() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + }}; + myObject.wait(1L); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(1L); + } + } + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java index 58f30cdd5..3c0717ad8 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -777,4 +777,55 @@ void test() { ) ); } + + @Test + void whenUnsupportedType() { + //language=java + rewriteRun( + java( + """ + import mockit.VerificationsInOrder; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(1L); + myObject.wait(2L, 1); + new VerificationsInOrder() {{ + myObject.wait(); + myObject.wait(anyLong, anyInt); + }}; + } + } + """, + """ + import mockit.VerificationsInOrder; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(1L); + myObject.wait(2L, 1); + new VerificationsInOrder() {{ + myObject.wait(); + myObject.wait(anyLong, anyInt); + }}; + } + } + """ + ) + ); + } } From d81cc7039574047536b1f09cf56dc6f7714f7fc8 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Fri, 11 Oct 2024 13:04:28 +0200 Subject: [PATCH 075/118] Migrate AssertJ `Fail.fail` to `Assertions.fail` --- src/main/resources/META-INF/rewrite/assertj.yml | 3 +++ .../openrewrite/java/testing/assertj/StaticImportsTest.java | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 1ae70b513..7c76ffea8 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -61,6 +61,9 @@ recipeList: - org.openrewrite.java.ChangeMethodTargetToStatic: methodPattern: "org.assertj.core.api.AssertionsForInterfaceTypes assertThat(..)" fullyQualifiedTargetTypeName: "org.assertj.core.api.Assertions" + - org.openrewrite.java.ChangeMethodTargetToStatic: + methodPattern: "org.assertj.core.api.Fail fail(..)" + fullyQualifiedTargetTypeName: "org.assertj.core.api.Assertions" - org.openrewrite.java.UseStaticImport: methodPattern: "org.assertj.core.api.Assertions *(..)" diff --git a/src/test/java/org/openrewrite/java/testing/assertj/StaticImportsTest.java b/src/test/java/org/openrewrite/java/testing/assertj/StaticImportsTest.java index b23b8e13a..3b6808446 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/StaticImportsTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/StaticImportsTest.java @@ -51,6 +51,7 @@ void useAssertionsStaticImport() { import org.assertj.core.api.AssertionsForInterfaceTypes; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + import static org.assertj.core.api.Fail.fail; public class Test { List exampleList; @@ -59,6 +60,7 @@ void method() { AssertionsForClassTypes.assertThat(true).isTrue(); assertThat(true).isTrue(); assertThat(exampleList).hasSize(0); + fail("This is a failure"); } } """, @@ -66,6 +68,7 @@ void method() { import java.util.List; import static org.assertj.core.api.Assertions.assertThat; + import static org.assertj.core.api.Assertions.fail; public class Test { List exampleList; @@ -74,6 +77,7 @@ void method() { assertThat(true).isTrue(); assertThat(true).isTrue(); assertThat(exampleList).hasSize(0); + fail("This is a failure"); } } """ From 8a95cb80a7633b15e28272d1449d4fc44f4bf1b0 Mon Sep 17 00:00:00 2001 From: Yurii Date: Fri, 11 Oct 2024 13:19:03 +0200 Subject: [PATCH 076/118] Migrate JMockit block to Mockito which contains redundant "this" prefix for arg matcher and migrate array as parameter for any (#610) * cope with redundant "this." parameters in expectation and verification block * fix incorrect logic made caused by carelessness * add test for redundant this modifer * add support for refactoring any() with array as parameter * add test to make sure OpenRewrite will not confuse identifiers with and without "this" * refactor to functional programming style * add tests in unit tests for expectations because the change in ArgumentMatchersRewrite.java affects Expectations too * Minor polish --------- Co-authored-by: Sheng Yu Co-authored-by: Tim te Beek --- .../jmockit/ArgumentMatchersRewriter.java | 84 ++++++++---- .../JMockitExpectationsToMockitoTest.java | 73 +++++++++- .../JMockitVerificationsToMockitoTest.java | 125 +++++++++++++++++- 3 files changed, 245 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java index ee5e86c59..71694a704 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/ArgumentMatchersRewriter.java @@ -99,17 +99,23 @@ private J.MethodInvocation rewriteMethodInvocation(J.MethodInvocation invocation if (invocation.getSelect() instanceof J.MethodInvocation) { invocation = invocation.withSelect(rewriteMethodInvocation((J.MethodInvocation) invocation.getSelect())); } + // in mockito, argument matchers must be used for all arguments or none - boolean hasArgumentMatcher = false; List arguments = invocation.getArguments(); - for (Expression methodArgument : arguments) { - if (isJmockitArgumentMatcher(methodArgument)) { - hasArgumentMatcher = true; - break; + // replace this.matcher with matcher, otherwise it's ignored + arguments.replaceAll(arg -> { + if (arg instanceof J.FieldAccess) { + J.FieldAccess fieldAccess = (J.FieldAccess) arg; + if (fieldAccess.getTarget() instanceof J.Identifier && + "this".equals(((J.Identifier) fieldAccess.getTarget()).getSimpleName())) { + return fieldAccess.getName(); + } } - } + return arg; + }); + // if there are no argument matchers, return the invocation as-is - if (!hasArgumentMatcher) { + if (arguments.stream().noneMatch(ArgumentMatchersRewriter::isJmockitArgumentMatcher)) { return invocation; } // replace each argument with the appropriate argument matcher @@ -145,9 +151,9 @@ private Expression rewriteMethodArgument(Expression methodArgument) { // ((int) any) to anyInt(), ((long) any) to anyLong(), etc argumentMatcher = PRIMITIVE_TO_MOCKITO_ARGUMENT_MATCHER.get(type); template = argumentMatcher + "()"; - } else if (type instanceof JavaType.FullyQualified) { - // (() any) to any(.class) - return rewriteFullyQualifiedToArgumentMatcher(methodArgument, (JavaType.FullyQualified) type); + } else if (type instanceof JavaType.FullyQualified || type instanceof JavaType.Array) { + // (() any) to any(.class), type can also be simple array + return rewriteAnyWithClassParameterToArgumentMatcher(methodArgument, type); } if (template == null || argumentMatcher == null) { // unhandled type, return argument unchanged @@ -157,7 +163,7 @@ private Expression rewriteMethodArgument(Expression methodArgument) { } private Expression applyArgumentTemplate(Expression methodArgument, String argumentMatcher, String template, - List templateParams) { + List templateParams) { visitor.maybeAddImport("org.mockito.Mockito", argumentMatcher); return JavaTemplate.builder(template) .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-core-3.12")) @@ -166,8 +172,7 @@ private Expression applyArgumentTemplate(Expression methodArgument, String argum .apply( new Cursor(visitor.getCursor(), methodArgument), methodArgument.getCoordinates().replace(), - templateParams.toArray() - ); + templateParams.toArray()); } private Expression applyClassArgumentTemplate(Expression methodArgument, JavaType.FullyQualified type) { @@ -179,24 +184,32 @@ private Expression applyClassArgumentTemplate(Expression methodArgument, JavaTyp .apply( new Cursor(visitor.getCursor(), methodArgument), methodArgument.getCoordinates().replace(), - type.getClassName() - )) + type.getClassName())) .withType(type); } - private Expression rewriteFullyQualifiedToArgumentMatcher(Expression methodArgument, JavaType.FullyQualified type) { + private Expression rewriteAnyWithClassParameterToArgumentMatcher(Expression methodArgument, JavaType type) { String template; List templateParams = new ArrayList<>(); - String argumentMatcher = FQN_TO_MOCKITO_ARGUMENT_MATCHER.get(type.getFullyQualifiedName()); - if (argumentMatcher != null) { - // mockito has convenience argument matchers - template = argumentMatcher + "()"; - return applyArgumentTemplate(methodArgument, argumentMatcher, template, templateParams); + + if (type instanceof JavaType.FullyQualified) { + JavaType.FullyQualified fq = (JavaType.FullyQualified) type; + String argumentMatcher = FQN_TO_MOCKITO_ARGUMENT_MATCHER.get(fq.getFullyQualifiedName()); + if (argumentMatcher != null) { + // mockito has convenience argument matchers + template = argumentMatcher + "()"; + return applyArgumentTemplate(methodArgument, argumentMatcher, template, templateParams); + } } // mockito uses any(Class) for all other types - argumentMatcher = "any"; + String argumentMatcher = "any"; template = argumentMatcher + "(#{any(java.lang.Class)})"; - templateParams.add(applyClassArgumentTemplate(methodArgument, type)); + + if (type instanceof JavaType.FullyQualified) { + templateParams.add(applyClassArgumentTemplate(methodArgument, (JavaType.FullyQualified) type)); + } else if (type instanceof JavaType.Array) { + templateParams.add(applyArrayClassArgumentTemplate(methodArgument, ((JavaType.Array) type).getElemType())); + } J.MethodInvocation invocationArgument = (J.MethodInvocation) applyArgumentTemplate(methodArgument, argumentMatcher, template, templateParams); @@ -209,15 +222,34 @@ private Expression rewriteFullyQualifiedToArgumentMatcher(Expression methodArgum !(invocationArgument.getMethodType().getParameterTypes().get(0) instanceof JavaType.Parameterized)) { return invocationArgument; } - JavaType.Parameterized newParameterType = - ((JavaType.Parameterized) invocationArgument.getMethodType().getParameterTypes().get(0)) - .withTypeParameters(Collections.singletonList(classArgument.getType())); + JavaType.Parameterized newParameterType = ((JavaType.Parameterized) invocationArgument.getMethodType() + .getParameterTypes().get(0)) + .withTypeParameters(Collections.singletonList(classArgument.getType())); JavaType.Method newMethodType = invocationArgument.getMethodType() .withReturnType(classArgument.getType()) .withParameterTypes(Collections.singletonList(newParameterType)); return invocationArgument.withMethodType(newMethodType); } + private Expression applyArrayClassArgumentTemplate(Expression methodArgument, JavaType elementType) { + String newArrayElementClassName = ""; + if (elementType instanceof JavaType.FullyQualified) { + newArrayElementClassName = ((JavaType.FullyQualified) elementType).getClassName(); + } else if (elementType instanceof JavaType.Primitive) { + newArrayElementClassName = ((JavaType.Primitive) elementType).getKeyword(); + } else { + newArrayElementClassName = elementType.getClass().getName(); + } + + return JavaTemplate.builder("#{}[].class") + .javaParser(JavaParser.fromJavaVersion()) + .build() + .apply( + new Cursor(visitor.getCursor(), methodArgument), + methodArgument.getCoordinates().replace(), + newArrayElementClassName); + } + private static boolean isJmockitArgumentMatcher(Expression expression) { if (expression instanceof J.TypeCast) { expression = ((J.TypeCast) expression).getExpression(); diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index b2b529193..27c27c838 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -210,7 +210,7 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @@ -668,6 +668,9 @@ public String getSomeField(List input) { public String getSomeOtherField(Object input) { return "Y"; } + public String getSomeArrayField(Object input) { + return "Z"; + } } """ ), @@ -694,9 +697,12 @@ void test() { result = null; myObject.getSomeOtherField((Object) any); result = null; + myObject.getSomeArrayField((byte[]) any); + result = null; }}; assertNull(myObject.getSomeField(new ArrayList<>())); assertNull(myObject.getSomeOtherField(new Object())); + assertNull(myObject.getSomeArrayField(new byte[0])); } } """, @@ -719,8 +725,10 @@ class MyTest { void test() { when(myObject.getSomeField(anyList())).thenReturn(null); when(myObject.getSomeOtherField(any(Object.class))).thenReturn(null); + when(myObject.getSomeArrayField(any(byte[].class))).thenReturn(null); assertNull(myObject.getSomeField(new ArrayList<>())); assertNull(myObject.getSomeOtherField(new Object())); + assertNull(myObject.getSomeArrayField(new byte[0])); } } """ @@ -1075,7 +1083,7 @@ void whenMinTimes() { class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1096,7 +1104,7 @@ void test() { class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(2)).wait(anyLong(), anyInt()); @@ -1122,7 +1130,7 @@ void whenMaxTimes() { class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1143,7 +1151,7 @@ void test() { class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atMost(5)).wait(anyLong(), anyInt()); @@ -1169,7 +1177,7 @@ void whenMinTimesMaxTimes() { class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1191,7 +1199,7 @@ void test() { class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(1)).wait(anyLong(), anyInt()); @@ -1549,6 +1557,57 @@ void test() { ); } + @Test + void whenWithRedundantThisModifier() { + //language=java + rewriteRun( + java( + """ + import mockit.Expectations; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Expectations() {{ + myObject.wait(this.anyLong, anyInt); + }}; + myObject.wait(); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.junit.jupiter.api.Assertions.assertEquals; + import static org.junit.jupiter.api.Assertions.assertNull; + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(); + verify(myObject).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + @Disabled // comment migration not supported yet @Test void whenComments() { diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java index 3c0717ad8..148d2a737 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -684,10 +684,8 @@ class MyTest { void test() { myObject.wait(); - new Verifications() {{ - - myObject.wait(); - + new Verifications() {{ + myObject.wait(); myObject.wait(anyLong, anyInt); }}; myObject.wait(1L); @@ -828,4 +826,123 @@ void test() { ) ); } + + @Test + void whenWithRedundantThisModifier() { + //language=java + rewriteRun( + java( + """ + import mockit.Verifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + new Verifications() {{ + myObject.wait(this.anyLong, this.anyInt); + myObject.wait(anyLong, this.anyInt); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + verify(myObject).wait(anyLong(), anyInt()); + verify(myObject).wait(anyLong(), anyInt()); + } + } + """ + ) + ); + } + + @Test + void whenArrayArgumentMatcher() { + //language=java + rewriteRun( + spec -> spec.afterTypeValidationOptions(TypeValidation.builder().methodInvocations(false).build()), + java( + """ + import java.util.List; + + class MyObject { + public String getSomeObject(Object input) { + return "Z"; + } + } + """ + ), + java( + """ + import java.util.ArrayList; + import java.util.List; + + import mockit.Mocked; + import mockit.Verifications; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + MyObject myObject; + + void test() { + myObject.getSomeObject(new byte[0]); + myObject.getSomeObject(new int[0]); + myObject.getSomeObject(new Exception[0]); + new Verifications() {{ + myObject.getSomeObject((byte[]) any); + myObject.getSomeObject((int[]) any); + myObject.getSomeObject((Exception[]) any); + }}; + } + } + """, + """ + import java.util.ArrayList; + import java.util.List; + + import static org.mockito.Mockito.any; + import static org.mockito.Mockito.verify; + + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + MyObject myObject; + + void test() { + myObject.getSomeObject(new byte[0]); + myObject.getSomeObject(new int[0]); + myObject.getSomeObject(new Exception[0]); + verify(myObject).getSomeObject(any(byte[].class)); + verify(myObject).getSomeObject(any(int[].class)); + verify(myObject).getSomeObject(any(Exception[].class)); + } + } + """ + ) + ); + } } From e8fca5a0c8c76382e829f056146537008eb5f6d6 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Fri, 11 Oct 2024 13:46:49 +0200 Subject: [PATCH 077/118] Only simplify chained AssertJ assertions with a single argument --- .../SimplifyChainedAssertJAssertion.java | 2 +- .../SimplifyChainedAssertJAssertionTest.java | 23 ++++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java index e34076fed..ca514103f 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java @@ -97,7 +97,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocat J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); // assert has correct assertion - if (!ASSERT_TO_REPLACE.matches(mi)) { + if (!ASSERT_TO_REPLACE.matches(mi) || mi.getArguments().size() != 1) { return mi; } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java index 785822116..8a2b7f42e 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java @@ -319,7 +319,6 @@ void testMethod() { ); } - @Test void mapMethodDealsWithTwoArguments() { rewriteRun( @@ -366,6 +365,28 @@ Map getMap() { ); } + @Test + void keySetContainsWithMultipleArguments() { + rewriteRun( + spec -> spec.recipe(new SimplifyChainedAssertJAssertion("keySet", "contains", "containsKey", "java.util.Map")), + //language=java + java( + """ + import java.util.Map; + + import static org.assertj.core.api.Assertions.assertThat; + + class MyTest { + void testMethod(Map map) { + // we don't yet support `containsKeys` + assertThat(map.keySet()).contains("a", "b", "c"); + } + } + """ + ) + ); + } + @Test void isNotEmptyTest() { rewriteRun( From 7bbd13a4cb87e5dcc946e6edcfc2b34a321541f7 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 13 Oct 2024 16:23:16 +0200 Subject: [PATCH 078/118] Reduce failures following upstream cursor validation https://github.com/openrewrite/rewrite/commit/f50d4aee6586807d4aa5393e49906b0bb61cdc3c --- .../java/testing/junit5/AddMissingNested.java | 21 +++---- .../java/testing/junit5/EnclosedToNested.java | 33 +++++------ .../testing/junit5/AddMissingNestedTest.java | 56 ++++++++++++------- .../testing/junit5/EnclosedToNestedTest.java | 56 ++++++++++--------- 4 files changed, 87 insertions(+), 79 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java b/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java index 844d832e4..e39cccb19 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AddMissingNested.java @@ -17,7 +17,6 @@ import lombok.EqualsAndHashCode; import lombok.Value; -import org.jspecify.annotations.NonNull; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; @@ -74,7 +73,7 @@ public TreeVisitor getVisitor() { @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); - cd = cd.withBody((J.Block) new AddNestedAnnotationVisitor().visitNonNull(cd.getBody(), ctx, getCursor())); + cd = cd.withBody((J.Block) new AddNestedAnnotationVisitor().visitNonNull(cd.getBody(), ctx, updateCursor(cd))); maybeAddImport(NESTED); return cd; } @@ -88,22 +87,18 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex boolean alreadyNested = classDecl.getLeadingAnnotations().stream() .anyMatch(a -> TypeUtils.isOfClassType(a.getType(), NESTED)); if (!alreadyNested && hasTestMethods(cd)) { - cd = getNestedJavaTemplate(ctx).apply(updateCursor(cd), - cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + cd = JavaTemplate.builder("@Nested") + .javaParser(JavaParser.fromJavaVersion() + .classpathFromResources(ctx, "junit-jupiter-api-5.9")) + .imports(NESTED) + .build() + .apply(getCursor(), cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); cd.getModifiers().removeIf(modifier -> modifier.getType().equals(J.Modifier.Type.Static)); + return maybeAutoFormat(classDecl, cd, ctx); } return cd; } - @NonNull - private JavaTemplate getNestedJavaTemplate(ExecutionContext ctx) { - return JavaTemplate.builder("@Nested") - .javaParser(JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "junit-jupiter-api-5.9")) - .imports(NESTED) - .build(); - } - private static boolean hasTestMethods(final J.ClassDeclaration cd) { return TEST_ANNOTATIONS.stream().anyMatch(ann -> !FindAnnotations.find(cd, "@" + ann).isEmpty()); } diff --git a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java index 28e16a4c2..5a0f65581 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java @@ -21,9 +21,7 @@ import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.*; import org.openrewrite.java.search.FindAnnotations; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; @@ -57,11 +55,10 @@ public TreeVisitor getVisitor() { @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); - final Set runWithEnclosedAnnotationSet = FindAnnotations.find(cd.withBody(null), - String.format("@%s(%s.class)", RUN_WITH, ENCLOSED)); - for (J.Annotation runWithEnclosed : runWithEnclosedAnnotationSet) { - cd.getLeadingAnnotations().remove(runWithEnclosed); - cd = cd.withBody((J.Block) new AddNestedAnnotationVisitor().visit(cd.getBody(), ctx, getCursor())); + String runwithEnclosed = String.format("@%s(%s.class)", RUN_WITH, ENCLOSED); + if (!FindAnnotations.find(cd.withBody(null), runwithEnclosed).isEmpty()) { + cd = (J.ClassDeclaration) new RemoveAnnotationVisitor(new AnnotationMatcher(runwithEnclosed)).visit(cd, ctx); + cd = cd.withBody((J.Block) new AddNestedAnnotationVisitor().visit(cd.getBody(), ctx, updateCursor(cd))); maybeRemoveImport(ENCLOSED); maybeRemoveImport(RUN_WITH); @@ -77,24 +74,20 @@ public static class AddNestedAnnotationVisitor extends JavaIsoVisitor modifier.getType().equals(J.Modifier.Type.Static)); + cd = JavaTemplate.builder("@Nested") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "junit-jupiter-api-5.9")) + .imports(NESTED) + .build() + .apply(getCursor(), cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + cd.getModifiers().removeIf(modifier -> modifier.getType() == J.Modifier.Type.Static); + return maybeAutoFormat(classDecl, cd, ctx); } return cd; } - private JavaTemplate getNestedJavaTemplate(ExecutionContext ctx) { - return JavaTemplate.builder("@Nested") - .javaParser(JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "junit-jupiter-api-5.9")) - .imports(NESTED) - .build(); - } - private boolean hasTestMethods(final J.ClassDeclaration cd) { return !FindAnnotations.find(cd, "@" + TEST_JUNIT4).isEmpty() || - !FindAnnotations.find(cd, "@" + TEST_JUNIT_JUPITER).isEmpty(); + !FindAnnotations.find(cd, "@" + TEST_JUNIT_JUPITER).isEmpty(); } } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AddMissingNestedTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AddMissingNestedTest.java index c8b063887..9aa37dbc8 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/AddMissingNestedTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/AddMissingNestedTest.java @@ -43,23 +43,25 @@ void oneInnerClass() { java( """ import org.junit.jupiter.api.Test; - + public class RootTest { public class InnerTest { @Test - public void test() {} + public void test() { + } } } """, """ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; - + public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } } """ @@ -74,20 +76,23 @@ void multipleInnerClasses() { java( """ import org.junit.jupiter.api.Test; - + public class RootTest { public class InnerTest { @Test - public void test() {} + public void test() { + } } - + public class Inner2Test { @Test - public void test() {} - + public void test() { + } + public class InnermostTest { @Test - public void test() {} + public void test() { + } } } } @@ -100,18 +105,21 @@ public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } @Nested public class Inner2Test { @Test - public void test() {} + public void test() { + } @Nested public class InnermostTest { @Test - public void test() {} + public void test() { + } } } } @@ -131,11 +139,13 @@ void doesNotAnnotationNonTestInnerClass() { public class RootTest { public class InnerTest { @Test - public void test() {} + public void test() { + } } - + public static class Foo { - public void bar() {} + public void bar() { + } } } """, @@ -147,11 +157,13 @@ public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } - + public static class Foo { - public void bar() {} + public void bar() { + } } } """ @@ -170,7 +182,8 @@ void removesStatic() { public class RootTest { public static class InnerTest { @Test - public void test() {} + public void test() { + } } } """, @@ -182,7 +195,8 @@ public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } } """ diff --git a/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java b/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java index 7b70ccf0c..e7b45842a 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java @@ -49,7 +49,8 @@ void oneInnerClass() { public class RootTest { public static class InnerTest { @Test - public void test() {} + public void test() { + } } } """, @@ -57,13 +58,12 @@ public void test() {} import org.junit.Test; import org.junit.jupiter.api.Nested; - \s - \s public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } } """ @@ -85,16 +85,19 @@ void multipleInnerClasses() { public class RootTest { public static class InnerTest { @Test - public void test() {} + public void test() { + } } - + public static class Inner2Test { @Test - public void test() {} + public void test() { + } public static class InnermostTest { @Test - public void test() {} + public void test() { + } } } } @@ -103,24 +106,25 @@ public void test() {} import org.junit.Test; import org.junit.jupiter.api.Nested; - \s - \s public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } @Nested public class Inner2Test { @Test - public void test() {} + public void test() { + } @Nested public class InnermostTest { @Test - public void test() {} + public void test() { + } } } } @@ -143,7 +147,8 @@ void recognizesTestAnnotationWithArguments() { public class RootTest { public static class InnerTest { @Test(timeout = 10) - public void test() {} + public void test() { + } } } """, @@ -151,13 +156,12 @@ public void test() {} import org.junit.Test; import org.junit.jupiter.api.Nested; - - public class RootTest { @Nested public class InnerTest { @Test(timeout = 10) - public void test() {} + public void test() { + } } } """ @@ -179,11 +183,13 @@ void doesNotAnnotateNonTestInnerClasses() { public class RootTest { public static class InnerTest { @Test - public void test() {} + public void test() { + } } - + public static class Foo { - public void bar() {} + public void bar() { + } } } """, @@ -191,17 +197,17 @@ public void bar() {} import org.junit.Test; import org.junit.jupiter.api.Nested; - - public class RootTest { @Nested public class InnerTest { @Test - public void test() {} + public void test() { + } } - + public static class Foo { - public void bar() {} + public void bar() { + } } } """ From 3c92c0f26aa1151699eaab5fbcee74d483097d58 Mon Sep 17 00:00:00 2001 From: Sander Knauff Date: Sun, 13 Oct 2024 16:24:26 +0200 Subject: [PATCH 079/118] Add recipe for replacing unnecesary Mockito#eq with direct parameters (#615) * Add recipe for unnecesary Mockito#eq This adds a basic recipe for replacing Mockito#eq with direct parameters in when this is supported. This change should resolve Sonar issue java:S6068 * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Drop unnecessary annotations * Rename class and apply some first best practices * Make the tests pass by retaining the prefix * Update recipe to also support `doThrow#when` and `BDDMockito#given` Also tests methods using Method Matchers. Also removes the `Mockito#eq` import if it is not required anymore. * Format code * Apply suggested formatting changes * Apply suggested formatting changes * Inline methods simplified through MethodMatcher * Cast to MethodCall & replace conditionally * Remove unused import * Collapse if's with similar blocks * Add SimplifyMockitoVerifyWhenGiven to MockitoBestPractices --------- Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../SimplifyMockitoVerifyWhenGiven.java | 88 ++++++ .../resources/META-INF/rewrite/mockito.yml | 1 + .../SimplifyMockitoVerifyWhenGivenTest.java | 270 ++++++++++++++++++ 3 files changed, 359 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java create mode 100644 src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java diff --git a/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java b/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java new file mode 100644 index 000000000..76260a777 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java @@ -0,0 +1,88 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.MethodCall; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class SimplifyMockitoVerifyWhenGiven extends Recipe { + + private static final MethodMatcher WHEN_MATCHER = new MethodMatcher("org.mockito.Mockito when(..)"); + private static final MethodMatcher GIVEN_MATCHER = new MethodMatcher("org.mockito.BDDMockito given(..)"); + private static final MethodMatcher VERIFY_MATCHER = new MethodMatcher("org.mockito.Mockito verify(..)"); + private static final MethodMatcher STUBBER_MATCHER = new MethodMatcher("org.mockito.stubbing.Stubber when(..)"); + private static final MethodMatcher EQ_MATCHER = new MethodMatcher("org.mockito.ArgumentMatchers eq(..)"); + + @Override + public String getDisplayName() { + return "Call to Mockito method \"verify\", \"when\" or \"given\" should be simplified"; + } + + @Override + public String getDescription() { + return "Fixes Sonar issue `java:S6068`: Call to Mockito method \"verify\", \"when\" or \"given\" should be simplified."; + } + + @Override + public Set getTags() { + return Collections.singleton("RSPEC-6068"); + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesMethod<>(EQ_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); + + if ((WHEN_MATCHER.matches(mi) || GIVEN_MATCHER.matches(mi)) && mi.getArguments().get(0) instanceof J.MethodInvocation) { + List updatedArguments = new ArrayList<>(mi.getArguments()); + updatedArguments.set(0, checkAndUpdateEq((J.MethodInvocation) mi.getArguments().get(0))); + mi = mi.withArguments(updatedArguments); + } else if (VERIFY_MATCHER.matches(mi.getSelect()) || + STUBBER_MATCHER.matches(mi.getSelect())) { + mi = checkAndUpdateEq(mi); + } + + maybeRemoveImport("org.mockito.ArgumentMatchers.eq"); + return mi; + } + + private J.MethodInvocation checkAndUpdateEq(J.MethodInvocation methodInvocation) { + if (methodInvocation.getArguments().stream().allMatch(EQ_MATCHER::matches)) { + return methodInvocation.withArguments(ListUtils.map(methodInvocation.getArguments(), invocation -> + ((MethodCall) invocation).getArguments().get(0).withPrefix(invocation.getPrefix()))); + } + return methodInvocation; + } + }); + } + +} diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index 7e60ad788..5e5c61f6f 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -25,6 +25,7 @@ recipeList: - org.openrewrite.java.testing.mockito.Mockito1to5Migration - org.openrewrite.java.RemoveAnnotation: annotationPattern: "@org.mockito.junit.jupiter.MockitoSettings(strictness=org.mockito.quality.Strictness.WARN)" + - org.openrewrite.java.testing.mockito.SimplifyMockitoVerifyWhenGiven --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.Mockito1to5Migration diff --git a/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java b/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java new file mode 100644 index 000000000..69815db02 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java @@ -0,0 +1,270 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class SimplifyMockitoVerifyWhenGivenTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new SimplifyMockitoVerifyWhenGiven()) + .parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "mockito-core")); + } + + @DocumentExample + @Test + void shouldRemoveUnneccesaryEqFromVerify() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.verify; + import static org.mockito.Mockito.mock; + import static org.mockito.ArgumentMatchers.eq; + + class Test { + void test() { + var mockString = mock(String.class); + verify(mockString).replace(eq("foo"), eq("bar")); + } + } + """, """ + import static org.mockito.Mockito.verify; + import static org.mockito.Mockito.mock; + + class Test { + void test() { + var mockString = mock(String.class); + verify(mockString).replace("foo", "bar"); + } + } + """ + ) + ); + } + + @Test + void shouldRemoveUnneccesaryEqFromWhen() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + import static org.mockito.ArgumentMatchers.eq; + + class Test { + void test() { + var mockString = mock(String.class); + when(mockString.replace(eq("foo"), eq("bar"))).thenReturn("bar"); + } + } + """, """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + + class Test { + void test() { + var mockString = mock(String.class); + when(mockString.replace("foo", "bar")).thenReturn("bar"); + } + } + """ + ) + ); + } + + @Test + void shouldNotRemoveEqWhenMatchersAreMixed() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + import static org.mockito.ArgumentMatchers.eq; + import static org.mockito.ArgumentMatchers.anyString; + + class Test { + void test() { + var mockString = mock(String.class); + when(mockString.replace(eq("foo"), anyString())).thenReturn("bar"); + } + } + """ + ) + ); + } + + @Test + void shouldRemoveUnneccesaryEqFromStubber() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.doThrow; + import static org.mockito.ArgumentMatchers.eq; + + class Test { + void test() { + doThrow(new RuntimeException()).when("foo").substring(eq(1)); + } + } + """, """ + import static org.mockito.Mockito.doThrow; + + class Test { + void test() { + doThrow(new RuntimeException()).when("foo").substring(1); + } + } + """ + ) + ); + } + + @Test + void shouldRemoveUnneccesaryEqFromBDDGiven() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.BDDMockito.given; + import static org.mockito.ArgumentMatchers.eq; + + class Test { + void test() { + given("foo".substring(eq(1))); + } + } + """, """ + import static org.mockito.BDDMockito.given; + + class Test { + void test() { + given("foo".substring(1)); + } + } + """ + ) + ); + } + + @Test + void shouldNotRemoveEqImportWhenStillNeeded() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + import static org.mockito.ArgumentMatchers.eq; + import static org.mockito.ArgumentMatchers.anyString; + + class Test { + void testRemoveEq() { + var mockString = mock(String.class); + when(mockString.replace(eq("foo"), eq("bar"))).thenReturn("bar"); + } + + void testKeepEq() { + var mockString = mock(String.class); + when(mockString.replace(eq("foo"), anyString())).thenReturn("bar"); + } + } + """, """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + import static org.mockito.ArgumentMatchers.eq; + import static org.mockito.ArgumentMatchers.anyString; + + class Test { + void testRemoveEq() { + var mockString = mock(String.class); + when(mockString.replace("foo", "bar")).thenReturn("bar"); + } + + void testKeepEq() { + var mockString = mock(String.class); + when(mockString.replace(eq("foo"), anyString())).thenReturn("bar"); + } + } + """ + ) + ); + } + + @Test + void shouldFixSonarExamples() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + import static org.mockito.Mockito.verify; + import static org.mockito.Mockito.doThrow; + import static org.mockito.BDDMockito.given; + import static org.mockito.ArgumentMatchers.eq; + + class Test { + void test(Object v1, Object v2, Object v3, Object v4, Object v5, Foo foo) { + given(foo.bar(eq(v1), eq(v2), eq(v3))).willReturn(null); + when(foo.baz(eq(v4), eq(v5))).thenReturn("foo"); + doThrow(new RuntimeException()).when(foo).quux(eq(42)); + verify(foo).bar(eq(v1), eq(v2), eq(v3)); + } + } + + class Foo { + Object bar(Object v1, Object v2, Object v3) { return null; } + String baz(Object v4, Object v5) { return ""; } + void quux(int x) {} + } + """, """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.when; + import static org.mockito.Mockito.verify; + import static org.mockito.Mockito.doThrow; + import static org.mockito.BDDMockito.given; + + class Test { + void test(Object v1, Object v2, Object v3, Object v4, Object v5, Foo foo) { + given(foo.bar(v1, v2, v3)).willReturn(null); + when(foo.baz(v4, v5)).thenReturn("foo"); + doThrow(new RuntimeException()).when(foo).quux(42); + verify(foo).bar(v1, v2, v3); + } + } + + class Foo { + Object bar(Object v1, Object v2, Object v3) { return null; } + String baz(Object v4, Object v5) { return ""; } + void quux(int x) {} + } + """ + ) + ); + } +} From f59e1c82ae6cae34974a5a0a687d106d2f1aeddf Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 16 Oct 2024 09:52:01 +0000 Subject: [PATCH 080/118] refactor: OpenRewrite best practices Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.recipes.OpenRewriteBestPractices?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .../org/openrewrite/java/testing/junit5/EnclosedToNested.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java index 5a0f65581..c4ff6cc5c 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java @@ -27,7 +27,6 @@ import org.openrewrite.java.tree.J; import java.util.Comparator; -import java.util.Set; @Value @EqualsAndHashCode(callSuper = false) From ff29dbc48e04c5e2b458c88f80107667874a834e Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 16 Oct 2024 13:48:30 +0200 Subject: [PATCH 081/118] Disable acyclic cursor validation for PowerMock tests --- .../testing/mockito/PowerMockitoMockStaticToMockitoTest.java | 4 +++- .../testing/mockito/ReplacePowerMockitoIntegrationTest.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java index 81625d90d..3a3225ad4 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockitoTest.java @@ -22,6 +22,7 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.TypeValidation; import static org.openrewrite.groovy.Assertions.groovy; import static org.openrewrite.java.Assertions.java; @@ -41,7 +42,8 @@ public void defaults(RecipeSpec spec) { "powermock-core-1.6", "testng-7.7" )) - .recipe(new PowerMockitoMockStaticToMockito()); + .recipe(new PowerMockitoMockStaticToMockito()) + .typeValidationOptions(TypeValidation.builder().cursorAcyclic(false).build()); } @DocumentExample diff --git a/src/test/java/org/openrewrite/java/testing/mockito/ReplacePowerMockitoIntegrationTest.java b/src/test/java/org/openrewrite/java/testing/mockito/ReplacePowerMockitoIntegrationTest.java index 746f91e97..73162b8c0 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/ReplacePowerMockitoIntegrationTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/ReplacePowerMockitoIntegrationTest.java @@ -39,8 +39,9 @@ public void defaults(RecipeSpec spec) { "powermock-api-mockito-1.6", "powermock-api-support-1.6", "testng-7.7")) - // TODO Resolve the missing types in the replacement templates rather than ignore the errors here .typeValidationOptions(TypeValidation.builder() + .cursorAcyclic(false) + // TODO Resolve the missing types in the replacement templates rather than ignore the errors here .identifiers(false) .methodInvocations(false) .build()) From 8fb11c8f0f116a87883fc30008b008eeba6568cc Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 21 Oct 2024 21:25:33 +0200 Subject: [PATCH 082/118] Run `JUnit5BestPractices` as part of Assertj best practices --- src/main/resources/META-INF/rewrite/assertj.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 7c76ffea8..bd979458c 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -16,7 +16,7 @@ --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.Assertj -displayName: AssertJ best practices +displayName: Assertj description: Migrates JUnit asserts to AssertJ and applies best practices to assertions. tags: - testing @@ -455,7 +455,7 @@ tags: - assertj recipeList: # First improve the assertions for JUnit, to fix inverted expected/actual values - - org.openrewrite.java.testing.junit5.CleanupAssertions + - org.openrewrite.java.testing.junit5.JUnit5BestPractices - org.openrewrite.java.testing.assertj.JUnitAssertArrayEqualsToAssertThat - org.openrewrite.java.testing.assertj.JUnitAssertEqualsToAssertThat - org.openrewrite.java.testing.assertj.JUnitAssertFalseToAssertThat From aa80a5ca757670356512eb17d3f1dd158ea0fc9b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 21 Oct 2024 21:39:27 +0200 Subject: [PATCH 083/118] Skip interface methods without a body in AssertThrowsOnLastStatement Fixes #618 --- .../junit5/AssertThrowsOnLastStatement.java | 11 ++++---- .../AssertThrowsOnLastStatementTest.java | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java b/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java index de757861d..add5ab8e7 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatement.java @@ -56,8 +56,11 @@ public TreeVisitor getVisitor() { @Override public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl, ExecutionContext ctx) { J.MethodDeclaration m = super.visitMethodDeclaration(methodDecl, ctx); - - m = m.withBody(m.getBody().withStatements(ListUtils.flatMap(m.getBody().getStatements(), methodStatement -> { + if (m.getBody() == null) { + return m; + } + doAfterVisit(new LambdaBlockToExpression().getVisitor()); + return m.withBody(m.getBody().withStatements(ListUtils.flatMap(m.getBody().getStatements(), methodStatement -> { J statementToCheck = methodStatement; final J.VariableDeclarations assertThrowsWithVarDec; final J.VariableDeclarations.NamedVariable assertThrowsVar; @@ -132,11 +135,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl J.VariableDeclarations.NamedVariable newAssertThrowsVar = assertThrowsVar.withInitializer(newAssertThrows); return assertThrowsWithVarDec.withVariables(singletonList(newAssertThrowsVar)); }); - }))); - - doAfterVisit(new LambdaBlockToExpression().getVisitor()); - return m; } }); } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java b/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java index ad8cb779c..f91702b27 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/AssertThrowsOnLastStatementTest.java @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -252,4 +253,31 @@ void foo() { ) ); } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/618") + void bodyNull() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.*; + + class MyTest { + + @Test + void test() { + assertThrows(IllegalStateException.class, () -> System.out.println("foo")); + } + + interface InnerInterface { + String createParser(String input); + } + } + """ + ) + ); + } } From 6dd020c2c91231ffa39d728b5b94864be41c95f7 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 21 Oct 2024 22:32:46 +0200 Subject: [PATCH 084/118] Drop duplication between `EnclosedToNested` and `AddMissingNested` --- .../java/testing/junit5/EnclosedToNested.java | 45 +++---------------- .../testing/junit5/EnclosedToNestedTest.java | 16 ++++--- 2 files changed, 15 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java index c4ff6cc5c..861244fc7 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java @@ -22,20 +22,15 @@ import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.java.*; -import org.openrewrite.java.search.FindAnnotations; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; -import java.util.Comparator; - @Value @EqualsAndHashCode(callSuper = false) public class EnclosedToNested extends Recipe { private static final String ENCLOSED = "org.junit.experimental.runners.Enclosed"; private static final String RUN_WITH = "org.junit.runner.RunWith"; - private static final String NESTED = "org.junit.jupiter.api.Nested"; - private static final String TEST_JUNIT4 = "org.junit.Test"; - private static final String TEST_JUNIT_JUPITER = "org.junit.jupiter.api.Test"; + private static final String RUN_WITH_ENCLOSED = String.format("@%s(%s.class)", RUN_WITH, ENCLOSED); @Override public String getDisplayName() { @@ -44,49 +39,19 @@ public String getDisplayName() { @Override public String getDescription() { - return "Removes the `Enclosed` specification from a class, and adds `Nested` to its inner classes."; + return "Removes the `Enclosed` specification from a class, with `Nested` added to its inner classes by `AddMissingNested`."; } @Override public TreeVisitor getVisitor() { return Preconditions.check(new UsesType<>(ENCLOSED, false), new JavaIsoVisitor() { - @SuppressWarnings("ConstantConditions") @Override public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); - String runwithEnclosed = String.format("@%s(%s.class)", RUN_WITH, ENCLOSED); - if (!FindAnnotations.find(cd.withBody(null), runwithEnclosed).isEmpty()) { - cd = (J.ClassDeclaration) new RemoveAnnotationVisitor(new AnnotationMatcher(runwithEnclosed)).visit(cd, ctx); - cd = cd.withBody((J.Block) new AddNestedAnnotationVisitor().visit(cd.getBody(), ctx, updateCursor(cd))); - - maybeRemoveImport(ENCLOSED); - maybeRemoveImport(RUN_WITH); - maybeAddImport(NESTED); - } - return cd; + maybeRemoveImport(ENCLOSED); + maybeRemoveImport(RUN_WITH); + return (J.ClassDeclaration) new RemoveAnnotationVisitor(new AnnotationMatcher(RUN_WITH_ENCLOSED)).visitNonNull(cd, ctx); } }); } - - public static class AddNestedAnnotationVisitor extends JavaIsoVisitor { - @Override - public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { - J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, ctx); - if (hasTestMethods(cd)) { - cd = JavaTemplate.builder("@Nested") - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "junit-jupiter-api-5.9")) - .imports(NESTED) - .build() - .apply(getCursor(), cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); - cd.getModifiers().removeIf(modifier -> modifier.getType() == J.Modifier.Type.Static); - return maybeAutoFormat(classDecl, cd, ctx); - } - return cd; - } - - private boolean hasTestMethods(final J.ClassDeclaration cd) { - return !FindAnnotations.find(cd, "@" + TEST_JUNIT4).isEmpty() || - !FindAnnotations.find(cd, "@" + TEST_JUNIT_JUPITER).isEmpty(); - } - } } diff --git a/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java b/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java index e7b45842a..1d5cc7f96 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/EnclosedToNestedTest.java @@ -31,7 +31,7 @@ public void defaults(RecipeSpec spec) { spec .parser(JavaParser.fromJavaVersion() .classpathFromResources(new InMemoryExecutionContext(), "junit-4.13")) - .recipe(new EnclosedToNested()); + .recipeFromResources("org.openrewrite.java.testing.junit5.JUnit4to5Migration"); } @DocumentExample @@ -55,8 +55,8 @@ public void test() { } """, """ - import org.junit.Test; import org.junit.jupiter.api.Nested; + import org.junit.jupiter.api.Test; public class RootTest { @Nested @@ -103,8 +103,8 @@ public void test() { } """, """ - import org.junit.Test; import org.junit.jupiter.api.Nested; + import org.junit.jupiter.api.Test; public class RootTest { @Nested @@ -153,13 +153,17 @@ public void test() { } """, """ - import org.junit.Test; import org.junit.jupiter.api.Nested; + import org.junit.jupiter.api.Test; + import org.junit.jupiter.api.Timeout; + + import java.util.concurrent.TimeUnit; public class RootTest { @Nested public class InnerTest { - @Test(timeout = 10) + @Test + @Timeout(value = 10, unit = TimeUnit.MILLISECONDS) public void test() { } } @@ -194,8 +198,8 @@ public void bar() { } """, """ - import org.junit.Test; import org.junit.jupiter.api.Nested; + import org.junit.jupiter.api.Test; public class RootTest { @Nested From 49b3eb54bebb5a349263727b76b9d5584d971be4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 21 Oct 2024 22:38:12 +0200 Subject: [PATCH 085/118] Expand imports on EnclosedToNested --- .../org/openrewrite/java/testing/junit5/EnclosedToNested.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java index 861244fc7..ac3ee5573 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/EnclosedToNested.java @@ -21,7 +21,9 @@ import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.java.*; +import org.openrewrite.java.AnnotationMatcher; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.RemoveAnnotationVisitor; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; From 8a6982b1065a6212bbfdf519792a1f13ca358e29 Mon Sep 17 00:00:00 2001 From: Shivani Sharma Date: Wed, 23 Oct 2024 05:33:00 +1100 Subject: [PATCH 086/118] Jmockit mockito full verifications and Refactor tests (#617) * Migrate JMockit FullVerifications to Mockito * Clean up full verifications migration * Cleanup up jmockit to mockito migration further * Refactor jmockit to mockito migration * Refactor jmockit to mockito migration for code reuse * Cleanup jmockit to mockito base test class * Refactor jmockit to mockito * Refactor jmockit to mockito full verifications * Add license to test base class --- .../testing/jmockit/JMockitBlockRewriter.java | 57 ++++- .../jmockit/JMockitBlockToMockito.java | 17 +- .../testing/jmockit/JMockitBlockType.java | 17 +- ...JMockitAnnotatedArgumentToMockitoTest.java | 20 +- .../jmockit/JMockitDelegateToMockitoTest.java | 10 +- .../JMockitExpectationsToMockitoTest.java | 10 +- ...JMockitFullVerificationsToMockitoTest.java | 239 ++++++++++++++++++ .../java/testing/jmockit/JMockitTestBase.java | 29 +++ .../JMockitVerificationsToMockitoTest.java | 11 +- 9 files changed, 341 insertions(+), 69 deletions(-) create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java index 4dc1df56f..db8b9631f 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java @@ -29,13 +29,14 @@ import java.util.ArrayList; import java.util.List; +import static org.openrewrite.java.testing.jmockit.JMockitBlockType.FullVerifications; import static org.openrewrite.java.testing.jmockit.JMockitBlockType.NonStrictExpectations; -import static org.openrewrite.java.testing.jmockit.JMockitBlockType.Verifications; class JMockitBlockRewriter { private static final String WHEN_TEMPLATE_PREFIX = "when(#{any()})."; private static final String VERIFY_TEMPLATE_PREFIX = "verify(#{any()}"; + private static final String VERIFY_NO_INTERACTIONS_TEMPLATE_PREFIX = "verifyNoMoreInteractions("; private static final String LENIENT_TEMPLATE_PREFIX = "lenient()."; private static final String RETURN_TEMPLATE_PREFIX = "thenReturn("; @@ -95,17 +96,27 @@ J.Block rewriteMethodBody() { // iterate over the statements and build a list of grouped method invocations and related statements eg times List> methodInvocationsToRewrite = new ArrayList<>(); + List uniqueMocks = new ArrayList<>(); int methodInvocationIdx = -1; for (Statement jmockitBlockStatement : jmockitBlock.getStatements()) { if (jmockitBlockStatement instanceof J.MethodInvocation) { - // ensure it's not a returns statement, we add that later to related statements J.MethodInvocation invocation = (J.MethodInvocation) jmockitBlockStatement; - if (invocation.getSelect() != null && !invocation.getName().getSimpleName().equals("returns")) { - methodInvocationIdx++; - methodInvocationsToRewrite.add(new ArrayList<>()); + Expression select = invocation.getSelect(); + if (select instanceof J.Identifier) { + J.Identifier mockObj = (J.Identifier) select; + // ensure it's not a returns statement, we add that later to related statements + if (!invocation.getName().getSimpleName().equals("returns")) { + methodInvocationIdx++; + methodInvocationsToRewrite.add(new ArrayList<>()); + } + if (isFullVerifications() && uniqueMocks.stream().noneMatch(mock -> mock.getType().equals(mockObj.getType()) + && mock.getSimpleName().equals(mockObj.getSimpleName()))) { + uniqueMocks.add(mockObj); + } } } + // add the statements corresponding to the method invocation if (methodInvocationIdx != -1) { methodInvocationsToRewrite.get(methodInvocationIdx).add(jmockitBlockStatement); } @@ -118,9 +129,17 @@ J.Block rewriteMethodBody() { // now rewrite methodInvocationsToRewrite.forEach(this::rewriteMethodInvocation); + + if (isFullVerifications()) { + rewriteFullVerify(new ArrayList<>(uniqueMocks)); + } return methodBody; } + private boolean isFullVerifications() { + return this.blockType == FullVerifications; + } + private void rewriteMethodInvocation(List statementsToRewrite) { final MockInvocationResults mockInvocationResults = buildMockInvocationResults(statementsToRewrite); if (mockInvocationResults == null) { @@ -136,7 +155,7 @@ private void rewriteMethodInvocation(List statementsToRewrite) { rewriteResult(invocation, mockInvocationResults.getResults(), hasTimes); } - if (!hasResults && !hasTimes && (this.blockType == JMockitBlockType.Expectations || this.blockType == Verifications)) { + if (!hasResults && !hasTimes && (this.blockType == JMockitBlockType.Expectations || this.blockType.isVerifications())) { rewriteVerify(invocation, null, ""); return; } @@ -171,7 +190,7 @@ private void rewriteResult(J.MethodInvocation invocation, List resul List templateParams = new ArrayList<>(); templateParams.add(invocation); templateParams.addAll(results); - this.rewriteFailed = !rewriteTemplate(template, templateParams, nextStatementCoordinates); + rewriteTemplate(template, templateParams, nextStatementCoordinates); if (this.rewriteFailed) { return; } @@ -199,19 +218,19 @@ private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression t templateParams.add(invocation.getName().getSimpleName()); String verifyTemplate = getVerifyTemplate(invocation.getArguments(), verificationMode, templateParams); JavaCoordinates verifyCoordinates; - if (this.blockType == Verifications) { + if (this.blockType.isVerifications()) { // for Verifications, replace the Verifications block verifyCoordinates = nextStatementCoordinates; } else { // for Expectations put the verify at the end of the method verifyCoordinates = methodBody.getCoordinates().lastStatement(); } - this.rewriteFailed = !rewriteTemplate(verifyTemplate, templateParams, verifyCoordinates); + rewriteTemplate(verifyTemplate, templateParams, verifyCoordinates); if (this.rewriteFailed) { return; } - if (this.blockType == Verifications) { + if (this.blockType.isVerifications()) { setNextStatementCoordinates(++numStatementsAdded); // for Expectations, verify statements added to end of method } @@ -223,6 +242,20 @@ private void rewriteVerify(J.MethodInvocation invocation, @Nullable Expression t } } + private void rewriteFullVerify(List mocks) { + if (!mocks.isEmpty()) { + StringBuilder sb = new StringBuilder(VERIFY_NO_INTERACTIONS_TEMPLATE_PREFIX); + mocks.forEach(mock -> sb.append(ANY_TEMPLATE_FIELD).append(",")); // verifyNoMoreInteractions(mock1, mock2 ... + sb.deleteCharAt(sb.length() - 1); + sb.append(")"); + rewriteTemplate(sb.toString(), mocks, nextStatementCoordinates); + if (!this.rewriteFailed) { + setNextStatementCoordinates(++numStatementsAdded); + visitor.maybeAddImport(MOCKITO_IMPORT_FQN_PREFX, "verifyNoMoreInteractions", false); + } + } + } + private void setNextStatementCoordinates(int numStatementsAdded) { if (numStatementsAdded <= 0 && bodyStatementIndex == 0) { nextStatementCoordinates = methodBody.getCoordinates().firstStatement(); @@ -240,7 +273,7 @@ private void setNextStatementCoordinates(int numStatementsAdded) { this.nextStatementCoordinates = this.methodBody.getStatements().get(lastStatementIdx).getCoordinates().after(); } - private boolean rewriteTemplate(String template, List templateParams, JavaCoordinates + private void rewriteTemplate(String template, List templateParams, JavaCoordinates rewriteCoords) { int numStatementsBefore = methodBody.getStatements().size(); methodBody = JavaTemplate.builder(template) @@ -252,7 +285,7 @@ private boolean rewriteTemplate(String template, List templateParams, Ja rewriteCoords, templateParams.toArray() ); - return methodBody.getStatements().size() > numStatementsBefore; + this.rewriteFailed = methodBody.getStatements().size() <= numStatementsBefore; } private @Nullable String getWhenTemplate(List results, boolean lenient) { diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java index 04db84952..1a41ddc4b 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockToMockito.java @@ -26,31 +26,34 @@ import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.Statement; +import java.util.Arrays; import java.util.List; import java.util.Optional; -import static org.openrewrite.java.testing.jmockit.JMockitBlockType.*; +import static org.openrewrite.java.testing.jmockit.JMockitBlockType.getSupportedTypesStr; +import static org.openrewrite.java.testing.jmockit.JMockitBlockType.values; @Value @EqualsAndHashCode(callSuper = false) public class JMockitBlockToMockito extends Recipe { + private static final String SUPPORTED_TYPES = getSupportedTypesStr(); + @Override public String getDisplayName() { - return "Rewrite JMockit Expectations, Verifications and NonStrictExpectations"; + return "Rewrite JMockit " + SUPPORTED_TYPES; } @Override public String getDescription() { - return "Rewrites JMockit `Expectations, Verifications and NonStrictExpectations` blocks to Mockito statements."; + return "Rewrites JMockit `" + SUPPORTED_TYPES + "` blocks to Mockito statements."; } @Override public TreeVisitor getVisitor() { - return Preconditions.check(Preconditions.or( - new UsesType<>(Expectations.getFqn(), false), - new UsesType<>(Verifications.getFqn(), false), - new UsesType<>(NonStrictExpectations.getFqn(), false)), new RewriteJMockitBlockVisitor()); + @SuppressWarnings("rawtypes") + UsesType[] usesTypes = Arrays.stream(values()).map(blockType -> new UsesType<>(blockType.getFqn(), false)).toArray(UsesType[]::new); + return Preconditions.check(Preconditions.or(usesTypes), new RewriteJMockitBlockVisitor()); } private static class RewriteJMockitBlockVisitor extends JavaIsoVisitor { diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java index b36c9240f..c691d97b6 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockType.java @@ -17,16 +17,25 @@ import lombok.Getter; +import java.util.Arrays; + @Getter enum JMockitBlockType { Expectations, + NonStrictExpectations, Verifications, - NonStrictExpectations; + FullVerifications; + + private final String fqn = "mockit." + this.name(); - private final String fqn; + boolean isVerifications() { + return this == Verifications || this == FullVerifications; + } - JMockitBlockType() { - this.fqn = "mockit." + this.name(); + static String getSupportedTypesStr() { + StringBuilder sb = new StringBuilder(); + Arrays.stream(values()).forEach(value -> sb.append(value).append(", ")); + return sb.substring(0, sb.length() - 2); } } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java index aba68599f..c207bf351 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java @@ -17,28 +17,10 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; -class JMockitAnnotatedArgumentToMockitoTest implements RewriteTest { - @Override - public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion() - .logCompilationWarningsAndErrors(true) - .classpathFromResources(new InMemoryExecutionContext(), - "junit-jupiter-api-5.9", - "jmockit-1.49" - )) - .recipeFromResource( - "/META-INF/rewrite/jmockit.yml", - "org.openrewrite.java.testing.jmockit.JMockitToMockito" - ); - } +class JMockitAnnotatedArgumentToMockitoTest extends JMockitTestBase { @DocumentExample @Test diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java index e4ad77bbd..b1282793d 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java @@ -19,11 +19,8 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.Issue; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; -import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; /** * At the moment, JMockit Delegates are not migrated to mockito. What I'm seeing is that they are being trashed @@ -32,12 +29,7 @@ */ @Disabled @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/522") -class JMockitDelegateToMockitoTest implements RewriteTest { - - @Override - public void defaults(RecipeSpec spec) { - setDefaultParserSettings(spec); - } +class JMockitDelegateToMockitoTest extends JMockitTestBase { @DocumentExample @Test diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index 27c27c838..1a98f6635 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -18,18 +18,10 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; -import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; -class JMockitExpectationsToMockitoTest implements RewriteTest { - - @Override - public void defaults(RecipeSpec spec) { - setDefaultParserSettings(spec); - } +class JMockitExpectationsToMockitoTest extends JMockitTestBase { @DocumentExample @Test diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java new file mode 100644 index 000000000..fd3ab16a1 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java @@ -0,0 +1,239 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; + +import static org.openrewrite.java.Assertions.java; + +/** + * Not doing comprehensive testing as it is covered in JMockitVerificationsToMockitoTest and shares same code path + */ +class JMockitFullVerificationsToMockitoTest extends JMockitTestBase { + + @DocumentExample + @Test + void whenMultipleMocks() { + //language=java + rewriteRun( + java( + """ + import mockit.FullVerifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + @Mocked + String str; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + str.notify(); + new FullVerifications() {{ + myObject.wait(anyLong, anyInt); + times = 2; + str.notify(); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + @Mock + String str; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + str.notify(); + verify(myObject, times(2)).wait(anyLong(), anyInt()); + verify(str).notify(); + verifyNoMoreInteractions(myObject, str); + } + } + """ + ) + ); + } + + @Test + void whenTimes() { + //language=java + rewriteRun( + java( + """ + import mockit.FullVerifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + new FullVerifications() {{ + myObject.wait(anyLong, anyInt); + times = 2; + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(10L, 10); + verify(myObject, times(2)).wait(anyLong(), anyInt()); + verifyNoMoreInteractions(myObject); + } + } + """ + ) + ); + } + + @DocumentExample + @Test + void whenOtherStatements() { + //language=java + rewriteRun( + java( + """ + import mockit.FullVerifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + new FullVerifications() {{ + myObject.wait(anyLong, anyInt); + }}; + System.out.println("bla"); + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + verify(myObject).wait(anyLong(), anyInt()); + verifyNoMoreInteractions(myObject); + System.out.println("bla"); + } + } + """ + ) + ); + } + + @Test + void whenMultipleInvocationsSameMock() { + //language=java + rewriteRun( + java( + """ + import mockit.FullVerifications; + import mockit.Mocked; + import mockit.integration.junit5.JMockitExtension; + import org.junit.jupiter.api.extension.ExtendWith; + + @ExtendWith(JMockitExtension.class) + class MyTest { + @Mocked + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(); + new FullVerifications() {{ + myObject.wait(anyLong, anyInt); + myObject.wait(); + }}; + } + } + """, + """ + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.*; + + @ExtendWith(MockitoExtension.class) + class MyTest { + @Mock + Object myObject; + + void test() { + myObject.wait(10L, 10); + myObject.wait(); + verify(myObject).wait(anyLong(), anyInt()); + verify(myObject).wait(); + verifyNoMoreInteractions(myObject); + } + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java new file mode 100644 index 000000000..bc7b59deb --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java @@ -0,0 +1,29 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; + +class JMockitTestBase implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java index 148d2a737..6264a9ada 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -17,18 +17,11 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; import org.openrewrite.test.TypeValidation; import static org.openrewrite.java.Assertions.java; -import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; -class JMockitVerificationsToMockitoTest implements RewriteTest { - @Override - public void defaults(RecipeSpec spec) { - setDefaultParserSettings(spec); - } +class JMockitVerificationsToMockitoTest extends JMockitTestBase { @DocumentExample @Test @@ -684,7 +677,7 @@ class MyTest { void test() { myObject.wait(); - new Verifications() {{ + new Verifications() {{ myObject.wait(); myObject.wait(anyLong, anyInt); }}; From 36c085aae11cce7036a598368fbbc827627f1442 Mon Sep 17 00:00:00 2001 From: Sam Snyder Date: Tue, 22 Oct 2024 11:49:51 -0700 Subject: [PATCH 087/118] Polish --- ...JMockitAnnotatedArgumentToMockitoTest.java | 10 +- .../jmockit/JMockitDelegateToMockitoTest.java | 73 ++-- .../JMockitExpectationsToMockitoTest.java | 371 +++++++++--------- ...JMockitFullVerificationsToMockitoTest.java | 55 +-- .../java/testing/jmockit/JMockitTestBase.java | 29 -- .../testing/jmockit/JMockitTestUtils.java | 4 +- .../JMockitVerificationsToMockitoTest.java | 23 +- 7 files changed, 291 insertions(+), 274 deletions(-) delete mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java index c207bf351..2cb93ff8f 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitAnnotatedArgumentToMockitoTest.java @@ -17,10 +17,18 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; -class JMockitAnnotatedArgumentToMockitoTest extends JMockitTestBase { +class JMockitAnnotatedArgumentToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } @DocumentExample @Test diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java index b1282793d..dca71281e 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitDelegateToMockitoTest.java @@ -19,17 +19,26 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.Issue; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; /** * At the moment, JMockit Delegates are not migrated to mockito. What I'm seeing is that they are being trashed * with the template being printed out. These tests were written to try to replicate this issue, however I was unable to. * They may help anyone who wants to add Delegate migration. */ +@SuppressWarnings("ResultOfMethodCallIgnored") @Disabled @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/522") -class JMockitDelegateToMockitoTest extends JMockitTestBase { +class JMockitDelegateToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } @DocumentExample @Test @@ -43,12 +52,12 @@ void whenNoArgsVoidMethod() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(); @@ -67,14 +76,14 @@ public void wait() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { doAnswer(invocation -> { System.out.println("foo"); @@ -99,12 +108,12 @@ void whenHasArgsVoidMethod() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong); @@ -124,15 +133,15 @@ void wait(long timeoutMs) { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { doAnswer(invocation -> { System.out.println("foo"); @@ -158,14 +167,14 @@ void whenNoArgsNonVoidMethod() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.toString(); @@ -185,15 +194,15 @@ String toString() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { when(myObject.toString()).thenAnswer(invocation -> { String a = "foo"; @@ -218,14 +227,14 @@ void whenMultipleStatementsWithAnnotation() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.hashCode(); @@ -249,15 +258,15 @@ String toString() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { when(myObject.hashCode()).thenReturn(100); when(myObject.toString()).thenAnswer(invocation -> { @@ -280,7 +289,7 @@ void whenClassArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(List input) { return "X"; @@ -295,18 +304,18 @@ public String getSomeOtherField(Object input) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Delegate; import mockit.Mocked; import mockit.Expectations; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField((List) any); @@ -325,21 +334,21 @@ String getSomeOtherField(List input) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Delegate; - + import static org.mockito.Mockito.anyList; import static org.mockito.Mockito.when; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField(anyList())).thenAnswer(invocation -> { List input = invocation.getArgument(0); diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java index 1a98f6635..29e107663 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitExpectationsToMockitoTest.java @@ -18,10 +18,19 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; -class JMockitExpectationsToMockitoTest extends JMockitTestBase { +@SuppressWarnings({"SpellCheckingInspection", "ResultOfMethodCallIgnored", "EmptyClassInitializer"}) +class JMockitExpectationsToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } @DocumentExample @Test @@ -34,14 +43,14 @@ void whenTimesAndResult() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.toString(); @@ -57,15 +66,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { when(myObject.toString()).thenReturn("foo"); assertEquals("foo", myObject.toString()); @@ -89,12 +98,12 @@ void whenNoResultNoTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -107,14 +116,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject).wait(anyLong(), anyInt()); @@ -135,12 +144,12 @@ void whenNoResultNoTimesNoArgs() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(); @@ -153,14 +162,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject).wait(); @@ -181,14 +190,14 @@ void whenHasResultNoTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.toString(); @@ -202,15 +211,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { when(myObject.toString()).thenReturn("foo"); assertEquals("foo", myObject.toString()); @@ -240,14 +249,14 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -261,15 +270,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn(null); assertNull(myObject.getSomeField()); @@ -299,14 +308,14 @@ public int getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -325,15 +334,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn(10); assertEquals(10, myObject.getSomeField()); @@ -365,14 +374,14 @@ public String getSomeField(String s) { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(anyString); @@ -386,16 +395,16 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField(anyString())).thenReturn("foo"); assertEquals("foo", myObject.getSomeField("bar")); @@ -425,16 +434,16 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + String expected = "expected"; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -448,17 +457,17 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + String expected = "expected"; - + void test() { when(myObject.getSomeField()).thenReturn(expected); assertEquals(expected, myObject.getSomeField()); @@ -488,14 +497,14 @@ public Object getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNotNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -509,15 +518,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn(new Object()); assertNotNull(myObject.getSomeField()); @@ -547,12 +556,12 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() throws RuntimeException { new Expectations() {{ myObject.getSomeField(); @@ -566,14 +575,14 @@ void test() throws RuntimeException { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() throws RuntimeException { when(myObject.getSomeField()).thenThrow(new RuntimeException()); myObject.getSomeField(); @@ -603,14 +612,14 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() throws RuntimeException { new Expectations() {{ myObject.getSomeField(); @@ -625,15 +634,15 @@ void test() throws RuntimeException { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() throws RuntimeException { when(myObject.getSomeField()).thenReturn("foo", "bar"); assertEquals("foo", myObject.getSomeField()); @@ -652,7 +661,7 @@ void whenClassArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(List input) { return "X"; @@ -670,19 +679,19 @@ public String getSomeArrayField(Object input) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField((List) any); @@ -701,19 +710,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField(anyList())).thenReturn(null); when(myObject.getSomeOtherField(any(Object.class))).thenReturn(null); @@ -735,7 +744,7 @@ void whenNoArguments() { java( """ import java.util.List; - + class MyObject { public String getSomeField() { return "X"; @@ -747,19 +756,19 @@ public String getSomeField() { """ import java.util.ArrayList; import java.util.List; - + import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeField(); @@ -772,19 +781,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn(null); assertNull(myObject.getSomeField()); @@ -802,7 +811,7 @@ void whenMixedArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(String s, String s2, String s3, long l1) { return "X"; @@ -814,19 +823,19 @@ public String getSomeField(String s, String s2, String s3, long l1) { """ import java.util.ArrayList; import java.util.List; - + import mockit.Expectations; import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String bazz = "bazz"; new Expectations() {{ @@ -840,19 +849,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { String bazz = "bazz"; when(myObject.getSomeField(eq("foo"), anyString(), eq(bazz), eq(10L))).thenReturn(null); @@ -871,7 +880,7 @@ void whenSetupStatements() { java( """ class MyObject { - + public String getSomeField(String s) { return "X"; } @@ -887,26 +896,26 @@ public String getString() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; String s = "s"; - + new Expectations() {{ myObject.getSomeField(anyString); result = s; - + myObject.getString(); result = a; }}; - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -916,22 +925,22 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { String a = "a"; String s = "s"; when(myObject.getSomeField(anyString())).thenReturn(s); when(myObject.getString()).thenReturn(a); - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -960,14 +969,14 @@ public String getSomeField(String s) { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; new Expectations() {{ @@ -976,7 +985,7 @@ void test() { String b = "b"; result = s; }}; - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -985,22 +994,22 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { String a = "a"; String s = "s"; String b = "b"; when(myObject.getSomeField(anyString())).thenReturn(s); - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -1019,12 +1028,12 @@ void whenTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1040,14 +1049,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -1070,12 +1079,12 @@ void whenMinTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1089,14 +1098,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(2)).wait(anyLong(), anyInt()); @@ -1117,12 +1126,12 @@ void whenMaxTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1136,14 +1145,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atMost(5)).wait(anyLong(), anyInt()); @@ -1164,12 +1173,12 @@ void whenMinTimesMaxTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong, anyInt); @@ -1184,14 +1193,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject, atLeast(1)).wait(anyLong(), anyInt()); @@ -1222,14 +1231,14 @@ public String getSomeField() { import mockit.Tested; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; - + @ExtendWith(JMockitExtension.class) class MyTest { @Tested MyObject myObject; - + void test() { new Expectations(myObject) {{ myObject.getSomeField(); @@ -1243,15 +1252,15 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @InjectMocks MyObject myObject; - + void test() { when(myObject.getSomeField()).thenReturn("foo"); assertEquals("foo", myObject.getSomeField()); @@ -1288,18 +1297,18 @@ public void doSomething() {} import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + @Mocked MyObject myOtherObject; - + void test() { new Expectations() {{ myObject.hashCode(); @@ -1321,19 +1330,19 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + @Mock MyObject myOtherObject; - + void test() { when(myObject.hashCode()).thenReturn(10); when(myOtherObject.getSomeObjectField()).thenReturn(null); @@ -1369,15 +1378,15 @@ public String getSomeStringField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ myObject.getSomeStringField(); @@ -1396,16 +1405,16 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getSomeStringField()).thenReturn("a"); assertEquals("a", myObject.getSomeStringField()); @@ -1440,18 +1449,18 @@ public String getY() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() { - { + { myObject.getX(); result = "x1"; } @@ -1469,16 +1478,16 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { when(myObject.getX()).thenReturn("x1"); when(myObject.getY()).thenReturn("y1"); @@ -1501,15 +1510,15 @@ void whenMultipleExpectationsNoResults() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(anyLong); @@ -1526,17 +1535,17 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(1L); myObject.wait(); @@ -1559,15 +1568,15 @@ void whenWithRedundantThisModifier() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ myObject.wait(this.anyLong, anyInt); @@ -1580,16 +1589,16 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(); verify(myObject).wait(anyLong(), anyInt()); @@ -1620,15 +1629,15 @@ public String getSomeStringField() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked MyObject myObject; - + void test() { new Expectations() {{ // comments for this line below @@ -1648,16 +1657,16 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock MyObject myObject; - + void test() { // comments for this line below when(myObject.getSomeStringField()).thenReturn("a"); @@ -1681,12 +1690,12 @@ void whenEmptyBlock() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { new Expectations() {{ }}; @@ -1698,12 +1707,12 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(1L); } diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java index fd3ab16a1..5eae411e5 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitFullVerificationsToMockitoTest.java @@ -17,13 +17,22 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; /** * Not doing comprehensive testing as it is covered in JMockitVerificationsToMockitoTest and shares same code path */ -class JMockitFullVerificationsToMockitoTest extends JMockitTestBase { +@SuppressWarnings("SpellCheckingInspection") +class JMockitFullVerificationsToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } @DocumentExample @Test @@ -36,15 +45,15 @@ void whenMultipleMocks() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + @Mocked String str; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -61,17 +70,17 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + @Mock String str; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -96,12 +105,12 @@ void whenTimes() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -116,14 +125,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -147,12 +156,12 @@ void whenOtherStatements() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); new FullVerifications() {{ @@ -166,14 +175,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); verify(myObject).wait(anyLong(), anyInt()); @@ -196,12 +205,12 @@ void whenMultipleInvocationsSameMock() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(); @@ -216,14 +225,14 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import static org.mockito.Mockito.*; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(); diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java deleted file mode 100644 index bc7b59deb..000000000 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestBase.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2023 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.jmockit; - -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; - -import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; - -class JMockitTestBase implements RewriteTest { - - @Override - public void defaults(RecipeSpec spec) { - setDefaultParserSettings(spec); - } -} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java index 0b21832ab..c66d3fbb1 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java @@ -19,6 +19,7 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; +@SuppressWarnings("SpellCheckingInspection") public class JMockitTestUtils { static final String MOCKITO_CORE_DEPENDENCY = "mockito-core-3.12"; @@ -27,7 +28,8 @@ public class JMockitTestUtils { static final String MOCKITO_JUPITER_DEPENDENCY = "mockito-junit-jupiter-3.12"; static void setDefaultParserSettings(RecipeSpec spec) { - setParserSettings(spec, JUNIT_5_JUPITER_DEPENDENCY, + setParserSettings(spec, + JUNIT_5_JUPITER_DEPENDENCY, JMOCKIT_DEPENDENCY, MOCKITO_CORE_DEPENDENCY, MOCKITO_JUPITER_DEPENDENCY); diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java index 6264a9ada..c4cae4b23 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitVerificationsToMockitoTest.java @@ -17,11 +17,20 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; import org.openrewrite.test.TypeValidation; import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setDefaultParserSettings; -class JMockitVerificationsToMockitoTest extends JMockitTestBase { +@SuppressWarnings({"SpellCheckingInspection", "ResultOfMethodCallIgnored"}) +class JMockitVerificationsToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setDefaultParserSettings(spec); + } @DocumentExample @Test @@ -677,8 +686,8 @@ class MyTest { void test() { myObject.wait(); - new Verifications() {{ - myObject.wait(); + new Verifications() {{ + myObject.wait(); myObject.wait(anyLong, anyInt); }}; myObject.wait(1L); @@ -779,12 +788,12 @@ void whenUnsupportedType() { import mockit.Mocked; import mockit.integration.junit5.JMockitExtension; import org.junit.jupiter.api.extension.ExtendWith; - + @ExtendWith(JMockitExtension.class) class MyTest { @Mocked Object myObject; - + void test() { myObject.wait(1L); myObject.wait(2L, 1); @@ -800,12 +809,12 @@ void test() { import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(1L); myObject.wait(2L, 1); From 36074f0e96799befa5a9984bf6d48f27b9b5b74f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 23 Oct 2024 19:31:16 +0000 Subject: [PATCH 088/118] refactor: Kill your Zombie code Use this link to re-run the recipe: https://app.moderne.io/builder/mybR2aHWC?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .../java/testing/junit5/TemporaryFolderToTempDir.java | 6 +++--- .../openrewrite/java/testing/junit5/UseTestMethodOrder.java | 2 +- .../java/testing/junit5/JUnit5BestPracticesTest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java index 7b0bb2d08..ca412b8df 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java @@ -49,7 +49,7 @@ public TreeVisitor getVisitor() { final AnnotationMatcher classRule = new AnnotationMatcher("@org.junit.ClassRule"); final AnnotationMatcher rule = new AnnotationMatcher("@org.junit.Rule"); - + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { @@ -157,7 +157,7 @@ private J convertToNewFile(J.MethodInvocation mi, ExecutionContext ctx) { private static class AddNewFolderMethod extends JavaIsoVisitor { private final J.MethodInvocation methodInvocation; - + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { @@ -236,7 +236,7 @@ private static class TranslateNewFolderMethodInvocation extends JavaVisitor javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java b/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java index 5fa7ef266..4525701a8 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UseTestMethodOrder.java @@ -45,7 +45,7 @@ public String getDescription() { public TreeVisitor getVisitor() { return Preconditions.check(new UsesType<>("org.junit.FixMethodOrder", false), new JavaIsoVisitor() { - + private JavaParser.@Nullable Builder javaParser; private JavaParser.Builder javaParser(ExecutionContext ctx) { diff --git a/src/test/java/org/openrewrite/java/testing/junit5/JUnit5BestPracticesTest.java b/src/test/java/org/openrewrite/java/testing/junit5/JUnit5BestPracticesTest.java index 3d1dccc53..412e39e39 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/JUnit5BestPracticesTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/JUnit5BestPracticesTest.java @@ -189,7 +189,7 @@ void somethingElse() { ) ); } - + @Test void changeThrowingRunnableToExecutable() { //language=java From 386f3d45d00e9a062b6ff2199b84d4ec993977e8 Mon Sep 17 00:00:00 2001 From: Niels de Bruin Date: Mon, 28 Oct 2024 11:47:05 +0100 Subject: [PATCH 089/118] refactor: add @Nullable to methods who may return null (#621) Use this link to re-run the recipe: https://app.moderne.io/builder/ji8mLIdUI?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .../openrewrite/java/testing/cleanup/RemoveEmptyTests.java | 4 +++- .../openrewrite/java/testing/junit5/MigrateJUnitTestCase.java | 2 +- .../java/testing/junit5/TemporaryFolderToTempDir.java | 2 +- .../openrewrite/java/testing/junit5/TestRuleToTestInfo.java | 2 +- .../java/testing/mockito/PowerMockitoMockStaticToMockito.java | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/RemoveEmptyTests.java b/src/main/java/org/openrewrite/java/testing/cleanup/RemoveEmptyTests.java index cbc914457..d2701d963 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/RemoveEmptyTests.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/RemoveEmptyTests.java @@ -15,6 +15,7 @@ */ package org.openrewrite.java.testing.cleanup; +import org.jspecify.annotations.Nullable; import org.openrewrite.ExecutionContext; import org.openrewrite.Preconditions; import org.openrewrite.Recipe; @@ -53,8 +54,9 @@ public Set getTags() { @Override public TreeVisitor getVisitor() { return Preconditions.check(new FindEmptyMethods(false), new JavaVisitor() { + @Override - public J visitMethodDeclaration(MethodDeclaration method, ExecutionContext ctx) { + public @Nullable J visitMethodDeclaration(MethodDeclaration method, ExecutionContext ctx) { if (hasTestAnnotation(method) && isEmptyMethod(method)) { //noinspection ConstantConditions return null; diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java index e9ce733b0..1bb528abd 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MigrateJUnitTestCase.java @@ -83,7 +83,7 @@ public J.CompilationUnit visitCompilationUnit(J.CompilationUnit cu, ExecutionCon @SuppressWarnings("ConstantConditions") @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + public J.@Nullable MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); if ((mi.getSelect() != null && TypeUtils.isOfClassType(mi.getSelect().getType(), "junit.framework.TestCase")) || (mi.getMethodType() != null && TypeUtils.isOfClassType(mi.getMethodType().getDeclaringType(), "junit.framework.TestCase"))) { diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java index ca412b8df..d6b3bf130 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TemporaryFolderToTempDir.java @@ -108,7 +108,7 @@ private boolean isRuleAnnotatedTemporaryFolder(J.VariableDeclarations vd) { } @Override - public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + public @Nullable J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation mi = (J.MethodInvocation) super.visitMethodInvocation(method, ctx); updateCursor(mi); if (mi.getSelect() != null && mi.getMethodType() != null && diff --git a/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java b/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java index 53e3c4fb0..5d97b74dc 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/TestRuleToTestInfo.java @@ -101,7 +101,7 @@ public J.VariableDeclarations visitVariableDeclarations(J.VariableDeclarations m } @Override - public J.NewClass visitNewClass(J.NewClass newClass, ExecutionContext ctx) { + public J.@Nullable NewClass visitNewClass(J.NewClass newClass, ExecutionContext ctx) { J.NewClass nc = super.visitNewClass(newClass, ctx); if (TypeUtils.isOfClassType(nc.getType(), "org.junit.rules.TestName")) { //noinspection ConstantConditions diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index 019425f50..aa7cb417d 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -168,7 +168,7 @@ public J visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext ctx } @Override - public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + public @Nullable J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation mi = (J.MethodInvocation) super.visitMethodInvocation(method, ctx); Map mockStaticInvocationsByClassName = getCursor().getNearestMessage(MOCK_STATIC_INVOCATIONS); From 6ab39a25bc43b7960c99d4f0de48a47c9e785545 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 29 Oct 2024 22:16:44 +0100 Subject: [PATCH 090/118] Place binary operator on the same line As seen on #599 --- .../java/testing/jmockit/JMockitBlockRewriter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java index db8b9631f..3856b476e 100644 --- a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitBlockRewriter.java @@ -109,8 +109,9 @@ J.Block rewriteMethodBody() { methodInvocationIdx++; methodInvocationsToRewrite.add(new ArrayList<>()); } - if (isFullVerifications() && uniqueMocks.stream().noneMatch(mock -> mock.getType().equals(mockObj.getType()) - && mock.getSimpleName().equals(mockObj.getSimpleName()))) { + if (isFullVerifications() && + uniqueMocks.stream().noneMatch(mock -> mock.getType().equals(mockObj.getType()) && + mock.getSimpleName().equals(mockObj.getSimpleName()))) { uniqueMocks.add(mockObj); } } From 4a8792ef7accec8ec5ce6b3db0842b8dcf7c0ca0 Mon Sep 17 00:00:00 2001 From: Jente Sondervorst Date: Wed, 30 Oct 2024 14:22:01 +0100 Subject: [PATCH 091/118] Add `@MockitoSettings(strictness = ...)` based on how Mockito is used, not based on version alone (#623) * The default strictness of Mockito did not change until v4 fixes #622 * Revert "The default strictness of Mockito did not change until v4" This reverts commit ffdcd85e9653b92e06730185729dd989fd22fc14. * Added the MockitoSettings for MockitoRule strictness or silent method call. * Repositioned stuff a bit * Apply formatter to tests * Demonstrate failure when using static import * Poll strictness message before updateCursor * Workaround left over prefix on modifier after adding annotation * Remove unused import --------- Co-authored-by: Jente Sondervorst Co-authored-by: Tim te Beek --- .../MockitoJUnitToMockitoExtension.java | 41 +- .../MockitoJUnitToMockitoExtensionTest.java | 461 +++++++++++++++--- 2 files changed, 428 insertions(+), 74 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java index e82911cb0..0c957f25f 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java @@ -19,6 +19,7 @@ import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; @@ -74,6 +75,7 @@ public TreeVisitor getVisitor() { public static class MockitoRuleToMockitoExtensionVisitor extends JavaIsoVisitor { private static final String MOCKITO_RULE_INVOCATION_KEY = "mockitoRuleInvocation"; private static final String MOCKITO_TEST_RULE_INVOCATION_KEY = "mockitoTestRuleInvocation"; + private static final String STRICTNESS_KEY = "strictness"; private static final String EXTEND_WITH_MOCKITO_EXTENSION = "@org.junit.jupiter.api.extension.ExtendWith(org.mockito.junit.jupiter.MockitoExtension.class)"; private static final String RUN_WITH_MOCKITO_JUNIT_RUNNER = "@org.junit.runner.RunWith(org.mockito.runners.MockitoJUnitRunner.class)"; @@ -100,6 +102,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex if (classDecl.getBody().getStatements().size() != cd.getBody().getStatements().size() && (FindAnnotations.find(classDecl.withBody(null), RUN_WITH_MOCKITO_JUNIT_RUNNER).isEmpty() && FindAnnotations.find(classDecl.withBody(null), EXTEND_WITH_MOCKITO_EXTENSION).isEmpty())) { + String strictness = getCursor().pollMessage(STRICTNESS_KEY); cd = JavaTemplate.builder("@ExtendWith(MockitoExtension.class)") .javaParser(JavaParser.fromJavaVersion() @@ -110,6 +113,23 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex maybeAddImport("org.junit.jupiter.api.extension.ExtendWith"); maybeAddImport("org.mockito.junit.jupiter.MockitoExtension"); + + if (strictness != null) { + cd = JavaTemplate.builder("@MockitoSettings(strictness = " + strictness + ")") + .doBeforeParseTemplate(System.out::println) + .javaParser(JavaParser.fromJavaVersion() + .classpathFromResources(ctx, "junit-jupiter-api-5.9", "mockito-junit-jupiter-3.12")) + .imports("org.mockito.junit.jupiter.MockitoSettings", "org.mockito.quality.Strictness") + .build() + .apply(updateCursor(cd), cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + maybeAddImport("org.mockito.junit.jupiter.MockitoSettings", false); + maybeAddImport("org.mockito.quality.Strictness", false); + } + + // Workaround first modifier incorrectly getting a trailing space as part of the prefix + cd = cd.withModifiers(ListUtils.mapFirst(cd.getModifiers(), + modifier -> modifier.withPrefix(modifier.getPrefix().withWhitespace( + modifier.getPrefix().getLastWhitespace().replaceAll(" $", ""))))); } } @@ -119,10 +139,27 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex @Override public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { if (method.getMethodType() != null) { + String key = null; if (TypeUtils.isOfClassType(method.getMethodType().getDeclaringType(), "org.mockito.junit.MockitoRule")) { - getCursor().putMessageOnFirstEnclosing(J.MethodDeclaration.class, MOCKITO_RULE_INVOCATION_KEY, method); + key = MOCKITO_RULE_INVOCATION_KEY; } else if (TypeUtils.isOfClassType(method.getMethodType().getDeclaringType(), "org.mockito.junit.MockitoTestRule")) { - getCursor().putMessageOnFirstEnclosing(J.MethodDeclaration.class, MOCKITO_TEST_RULE_INVOCATION_KEY, method); + key = MOCKITO_TEST_RULE_INVOCATION_KEY; + } + if (key != null) { + getCursor().putMessageOnFirstEnclosing(J.MethodDeclaration.class, key, method); + String strictness = null; + switch (method.getSimpleName()) { + case "strictness": + strictness = method.getArguments().get(0).toString(); + break; + case "silent": + strictness = "Strictness.LENIENT"; + break; + } + if (strictness != null && !strictness.contains("STRICT_STUBS")) { + strictness = strictness.startsWith("Strictness.") ? strictness : "Strictness." + strictness; + getCursor().putMessageOnFirstEnclosing(J.ClassDeclaration.class, STRICTNESS_KEY, strictness); + } } } diff --git a/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java b/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java index 0b8d71722..c42b35e40 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java @@ -48,12 +48,12 @@ void leavesOtherRulesAlone() { import org.mockito.Mock; import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoJUnit; - + class MyTest { - + @Rule TemporaryFolder tempDir = new TemporaryFolder(); - + @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); } @@ -64,10 +64,10 @@ class MyTest { import org.junit.rules.TemporaryFolder; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) class MyTest { - + @Rule TemporaryFolder tempDir = new TemporaryFolder(); } @@ -89,10 +89,10 @@ void leavesOtherAnnotationsAlone() { import org.mockito.Mock; import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoJUnit; - + @FixMethodOrder(MethodSorters.NAME_ASCENDING) class MyTest { - + @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); } @@ -103,7 +103,7 @@ class MyTest { import org.junit.runners.MethodSorters; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + @ExtendWith(MockitoExtension.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) class MyTest { @@ -121,21 +121,21 @@ void refactorMockitoRule() { java( """ import java.util.List; - + import org.junit.Rule; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.quality.Strictness; - + class MyTest { - + @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); - + @Mock private List list; - + public void exampleTest() { mockitoRule.strictness(Strictness.LENIENT); list.add(100); @@ -144,17 +144,20 @@ public void exampleTest() { """, """ import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.LENIENT) class MyTest { - + @Mock private List list; - + public void exampleTest() { list.add(100); } @@ -172,21 +175,21 @@ void refactorMockitoTestRule() { java( """ import java.util.List; - + import org.junit.Rule; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoTestRule; import org.mockito.quality.Strictness; - + class MyTest { - + @Rule MockitoTestRule mockitoTestRule = MockitoJUnit.rule(); - + @Mock private List list; - + public void exampleTest() { mockitoTestRule.strictness(Strictness.LENIENT); list.add(100); @@ -195,17 +198,20 @@ public void exampleTest() { """, """ import java.util.List; - + import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.LENIENT) class MyTest { - + @Mock private List list; - + public void exampleTest() { list.add(100); } @@ -229,22 +235,22 @@ void onlyRefactorMockitoRule() { import org.mockito.junit.MockitoTestRule; import org.mockito.junit.VerificationCollector; import org.mockito.quality.Strictness; - + import java.util.List; - + import static org.mockito.Mockito.verify; - + class MyTest { - + @Rule VerificationCollector verificationCollectorRule = MockitoJUnit.collector(); - + @Rule MockitoTestRule mockitoTestRule = MockitoJUnit.rule(); - + @Mock private List list; - + @Test public void exampleTest() { verify(list).add(100); @@ -260,20 +266,20 @@ public void exampleTest() { import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; import org.mockito.junit.jupiter.MockitoExtension; - + import java.util.List; - + import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { - + @Rule VerificationCollector verificationCollectorRule = MockitoJUnit.collector(); - + @Mock private List list; - + @Test public void exampleTest() { verify(list).add(100); @@ -293,20 +299,20 @@ void unchangedMockitoCollectorRule() { java( """ import java.util.List; - + import org.junit.Rule; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; - + class MyTest { - + @Rule VerificationCollector verificationCollectorRule = MockitoJUnit.collector(); - + @Mock private List list; - + public void exampleTest() { list.add(100); verificationCollectorRule.collectAndReport(); @@ -325,25 +331,25 @@ void unchangedMockitoCollectorDeclaredInMethod() { java( """ import java.util.List; - + import org.mockito.Mock; import org.mockito.exceptions.base.MockitoAssertionError; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; - + import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; - + class MyTest { - + public void unsupported() { VerificationCollector collector = MockitoJUnit.collector().assertLazily(); - + List mockList = mock(List.class); verify(mockList).add("one"); verify(mockList).clear(); - + try { collector.collectAndReport(); } catch (MockitoAssertionError error) { @@ -374,20 +380,20 @@ void leaveMockitoJUnitRunnerAlone() { import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoTestRule; import org.mockito.runners.MockitoJUnitRunner; - + import java.util.List; - + import static org.mockito.Mockito.verify; - + @RunWith(MockitoJUnitRunner.class) class MyTest { - + @Rule MockitoTestRule mockitoTestRule = MockitoJUnit.rule(); - + @Mock private List list; - + @Test public void exampleTest() { verify(list).add(100); @@ -399,17 +405,17 @@ public void exampleTest() { import org.junit.Test; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; - + import java.util.List; - + import static org.mockito.Mockito.verify; - + @RunWith(MockitoJUnitRunner.class) class MyTest { - + @Mock private List list; - + @Test public void exampleTest() { verify(list).add(100); @@ -434,20 +440,20 @@ void leaveExtendWithAlone() { import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoTestRule; - + import java.util.List; - + import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { - + @Rule MockitoTestRule mockitoTestRule = MockitoJUnit.rule(); - + @Mock private List list; - + @Test public void exampleTest() { verify(list).add(100); @@ -459,17 +465,17 @@ public void exampleTest() { import org.junit.Test; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; - + import java.util.List; - + import static org.mockito.Mockito.verify; - + @ExtendWith(MockitoExtension.class) class MyTest { - + @Mock private List list; - + @Test public void exampleTest() { verify(list).add(100); @@ -479,4 +485,315 @@ public void exampleTest() { ) ); } + + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/623") + @Test + void silentRuleAddMockitoSettings() { + //language=java + rewriteRun( + java( + """ + import org.junit.Rule; + import org.junit.Test; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnit; + import org.mockito.junit.MockitoRule; + + import java.util.List; + + import static org.mockito.Mockito.when; + + public class MyTest { + + @Rule + public MockitoRule rule = MockitoJUnit.rule().silent(); + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """, + """ + import org.junit.Test; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.LENIENT) + public class MyTest { + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """ + ) + ); + } + + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/623") + @Test + void warnStrictnessRuleAddMockitoSettings() { + //language=java + rewriteRun( + java( + """ + import org.junit.Rule; + import org.junit.Test; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnit; + import org.mockito.junit.MockitoRule; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + public class MyTest { + + @Rule + public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.WARN); + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """, + """ + import org.junit.Test; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.WARN) + public class MyTest { + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """ + ) + ); + } + + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/623") + @Test + void warnStrictnessRuleAddMockitoSettingsWithStaticImport() { + //language=java + rewriteRun( + java( + """ + import org.junit.Rule; + import org.junit.Test; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnit; + import org.mockito.junit.MockitoRule; + + import java.util.List; + + import static org.mockito.Mockito.when; + import static org.mockito.quality.Strictness.WARN; + + public class MyTest { + + @Rule + public MockitoRule rule = MockitoJUnit.rule().strictness(WARN); + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """, + """ + import org.junit.Test; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.WARN) + public class MyTest { + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """ + ) + ); + } + + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/623") + @Test + void lenientStrictnessRuleAddMockitoSettings() { + //language=java + rewriteRun( + java( + """ + import org.junit.Rule; + import org.junit.Test; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnit; + import org.mockito.junit.MockitoRule; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + public class MyTest { + + @Rule + public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.LENIENT); + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """, + """ + import org.junit.Test; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.LENIENT) + public class MyTest { + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """ + ) + ); + } + + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/623") + @Test + void strictRuleDoNotAddMockitoSettings() { + //language=java + rewriteRun( + java( + """ + import org.junit.Rule; + import org.junit.Test; + import org.mockito.Mock; + import org.mockito.junit.MockitoJUnit; + import org.mockito.junit.MockitoRule; + import org.mockito.quality.Strictness; + + import java.util.List; + + import static org.mockito.Mockito.when; + + public class MyTest { + + @Rule + public MockitoRule rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS); + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """, + """ + import org.junit.Test; + import org.junit.jupiter.api.extension.ExtendWith; + import org.mockito.Mock; + import org.mockito.junit.jupiter.MockitoExtension; + + import java.util.List; + + import static org.mockito.Mockito.when; + + @ExtendWith(MockitoExtension.class) + public class MyTest { + + @Mock + private List mockList; + + @Test + public void testing() { + when(mockList.add("one")).thenReturn(true); // this won't get called + System.out.println("Hello world!"); + } + } + """ + ) + ); + } } From 6820b1b3f5daaf35f6abb8bd27d63ec5177c7ac5 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 30 Oct 2024 14:48:01 +0100 Subject: [PATCH 092/118] Drop RetainStrictnessWarn; replaced with #623 (#625) --- .../testing/mockito/RetainStrictnessWarn.java | 100 ------------- .../resources/META-INF/rewrite/mockito.yml | 1 - .../mockito/RetainStrictnessWarnTest.java | 139 ------------------ 3 files changed, 240 deletions(-) delete mode 100644 src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java delete mode 100644 src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java diff --git a/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java b/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java deleted file mode 100644 index cdda4962a..000000000 --- a/src/main/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarn.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.mockito; - -import org.jspecify.annotations.Nullable; -import org.openrewrite.*; -import org.openrewrite.java.JavaIsoVisitor; -import org.openrewrite.java.JavaParser; -import org.openrewrite.java.JavaTemplate; -import org.openrewrite.java.RemoveAnnotation; -import org.openrewrite.java.dependencies.DependencyInsight; -import org.openrewrite.java.search.FindAnnotations; -import org.openrewrite.java.search.UsesType; -import org.openrewrite.java.tree.J; - -import java.util.Comparator; -import java.util.Set; -import java.util.concurrent.atomic.AtomicBoolean; - -public class RetainStrictnessWarn extends ScanningRecipe { - - private static final String EXTEND_WITH_FQ = "org.junit.jupiter.api.extension.ExtendWith"; - private static final String MOCKITO_EXTENSION_FQ = "org.mockito.junit.jupiter.MockitoExtension"; - private static final String MOCKITO_SETTINGS_FQ = "org.mockito.junit.jupiter.MockitoSettings"; - private static final String MOCKITO_STRICTNESS_FQ = "org.mockito.quality.Strictness"; - - private static final String EXTEND_WITH_MOCKITO_EXTENSION = "@" + EXTEND_WITH_FQ + "(" + MOCKITO_EXTENSION_FQ + ".class)"; - - @Override - public String getDisplayName() { - return "Retain Mockito strictness `WARN` when switching to JUnit 5"; - } - - @Override - public String getDescription() { - return "Migrating from JUnit 4 to 5 [changes the default strictness](https://stackoverflow.com/a/53234137/53444) of the mocks from `WARN` to `STRICT_STUBS`. " + - "To prevent tests from failing we restore the original behavior by adding `@MockitoSettings(strictness = Strictness.WARN)`."; - } - - @Override - public AtomicBoolean getInitialValue(ExecutionContext ctx) { - return new AtomicBoolean(false); - } - - @Override - public TreeVisitor getScanner(AtomicBoolean usingOlderMockito) { - TreeVisitor div = new DependencyInsight("org.mockito", "mockito-*", "[1.1,2.17)", null).getVisitor(); - return new TreeVisitor() { - @Override - public @Nullable Tree visit(@Nullable Tree tree, ExecutionContext ctx) { - if (!usingOlderMockito.get() && div.visit(tree, ctx) != tree) { - usingOlderMockito.set(true); - } - return tree; - } - }; - } - - @Override - public TreeVisitor getVisitor(AtomicBoolean usingOlderMockito) { - return Preconditions.check(usingOlderMockito.get(), - Preconditions.check( - Preconditions.and( - new UsesType<>(MOCKITO_EXTENSION_FQ, true), - Preconditions.not(new UsesType<>(MOCKITO_SETTINGS_FQ, false)) - ), new JavaIsoVisitor() { - @Override - public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { - Set annotations = FindAnnotations.find(classDecl, EXTEND_WITH_MOCKITO_EXTENSION); - if (!annotations.isEmpty()) { - maybeAddImport(MOCKITO_SETTINGS_FQ); - maybeAddImport(MOCKITO_STRICTNESS_FQ); - classDecl = JavaTemplate.builder("@MockitoSettings(strictness = Strictness.WARN)") - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "mockito-junit-jupiter", "mockito-core")) - .imports(MOCKITO_SETTINGS_FQ, MOCKITO_STRICTNESS_FQ) - .build() - .apply(getCursor(), classDecl.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); - doAfterVisit(new RemoveAnnotation(EXTEND_WITH_MOCKITO_EXTENSION).getVisitor()); - maybeRemoveImport(EXTEND_WITH_FQ); - maybeRemoveImport(MOCKITO_EXTENSION_FQ); - } - return super.visitClassDeclaration(classDecl, ctx); - } - }) - ); - } -} diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index 5e5c61f6f..d1b62eaf2 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -154,7 +154,6 @@ recipeList: - org.openrewrite.java.testing.mockito.MockUtilsToStatic - org.openrewrite.java.testing.junit5.MockitoJUnitToMockitoExtension - org.openrewrite.java.testing.mockito.ReplacePowerMockito - - org.openrewrite.java.testing.mockito.RetainStrictnessWarn - org.openrewrite.java.dependencies.AddDependency: groupId: org.mockito artifactId: mockito-junit-jupiter diff --git a/src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java b/src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java deleted file mode 100644 index 1f9fbae59..000000000 --- a/src/test/java/org/openrewrite/java/testing/mockito/RetainStrictnessWarnTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2024 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.mockito; - -import org.intellij.lang.annotations.Language; -import org.junit.jupiter.api.Test; -import org.openrewrite.DocumentExample; -import org.openrewrite.InMemoryExecutionContext; -import org.openrewrite.java.JavaParser; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; - -import static org.openrewrite.java.Assertions.java; -import static org.openrewrite.maven.Assertions.pomXml; - -class RetainStrictnessWarnTest implements RewriteTest { - - @Language("xml") - private static final String POM_XML_WITH_OLDER_MOCKITO = """ - - 4.0.0 - bla.bla - bla-bla - 1.0.0 - - - org.mockito - mockito-all - 1.1 - test - - - - """; - - @Language("java") - private static final String JAVA_BEFORE = """ - import org.junit.jupiter.api.extension.ExtendWith; - import org.mockito.junit.jupiter.MockitoExtension; - - @ExtendWith(MockitoExtension.class) - class MyTest { - } - """; - - @Language("java") - private static final String JAVA_AFTER = """ - import org.mockito.junit.jupiter.MockitoSettings; - import org.mockito.quality.Strictness; - - @MockitoSettings(strictness = Strictness.WARN) - class MyTest { - } - """; - - @Override - public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion() - .classpathFromResources(new InMemoryExecutionContext(), - "mockito-core", "mockito-junit-jupiter", "junit-jupiter-api")) - .recipe(new RetainStrictnessWarn()); - } - - @Test - @DocumentExample - void shouldAddMockitoSettingsWithLenientStubbing() { - //language=java - rewriteRun( - pomXml(POM_XML_WITH_OLDER_MOCKITO), - java(JAVA_BEFORE, JAVA_AFTER) - ); - } - - @Test - void shouldLeaveExisting() { - //language=java - rewriteRun( - pomXml(POM_XML_WITH_OLDER_MOCKITO), - java( - """ - import org.mockito.junit.jupiter.MockitoSettings; - import org.mockito.quality.Strictness; - - @MockitoSettings(strictness = Strictness.STRICT_STUBS) - class MyTest { - } - """ - ) - ); - } - - @Test - void shouldRunBeforeMockitoCore2_17() { - rewriteRun( - pomXml(POM_XML_WITH_OLDER_MOCKITO), - java(JAVA_BEFORE, JAVA_AFTER) - ); - } - - @Test - void shouldNotRunOnNewerMockito() { - rewriteRun( - //language=xml - pomXml( - """ - - 4.0.0 - bla.bla - bla-bla - 1.0.0 - - - org.mockito - mockito-core - 2.17.0 - test - - - - """ - ), - java(JAVA_BEFORE) - ); - } -} From d8565962067addf10c77c6ac6644507815480006 Mon Sep 17 00:00:00 2001 From: Jente Sondervorst Date: Wed, 30 Oct 2024 23:02:34 +0100 Subject: [PATCH 093/118] Added default warn strictness if no strictness modifiers are used. (#626) --- .../testing/junit5/MockitoJUnitToMockitoExtension.java | 9 +++++++-- .../mockito/MockitoJUnitToMockitoExtensionTest.java | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java index 0c957f25f..177b361bf 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java @@ -114,7 +114,12 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex maybeAddImport("org.junit.jupiter.api.extension.ExtendWith"); maybeAddImport("org.mockito.junit.jupiter.MockitoExtension"); - if (strictness != null) { + if (strictness == null) { + // As we are in a Rule, and rules where always warn by default, + // we cannot use junit5 Strictness.STRICT_STUBS during migration + strictness = "Strictness.WARN"; + } + if (!strictness.contains("STRICT_STUBS")) { cd = JavaTemplate.builder("@MockitoSettings(strictness = " + strictness + ")") .doBeforeParseTemplate(System.out::println) .javaParser(JavaParser.fromJavaVersion() @@ -156,7 +161,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu strictness = "Strictness.LENIENT"; break; } - if (strictness != null && !strictness.contains("STRICT_STUBS")) { + if (strictness != null) { strictness = strictness.startsWith("Strictness.") ? strictness : "Strictness." + strictness; getCursor().putMessageOnFirstEnclosing(J.ClassDeclaration.class, STRICTNESS_KEY, strictness); } diff --git a/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java b/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java index c42b35e40..03f3017f2 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/MockitoJUnitToMockitoExtensionTest.java @@ -64,8 +64,11 @@ class MyTest { import org.junit.rules.TemporaryFolder; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.WARN) class MyTest { @Rule @@ -103,9 +106,12 @@ class MyTest { import org.junit.runners.MethodSorters; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; @ExtendWith(MockitoExtension.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) + @MockitoSettings(strictness = Strictness.WARN) class MyTest { } """ @@ -266,12 +272,15 @@ public void exampleTest() { import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.junit.jupiter.MockitoSettings; + import org.mockito.quality.Strictness; import java.util.List; import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) + @MockitoSettings(strictness = Strictness.WARN) class MyTest { @Rule From 05a917eafd98d6fe5adcf0aac7eb9c5c4708440c Mon Sep 17 00:00:00 2001 From: Jeremy Tymes Date: Thu, 31 Oct 2024 14:49:12 -0400 Subject: [PATCH 094/118] SimplifyChainedAssertJAssertion drops method calls in replacement (#629) * Add test for maintaining method call after replacement * Only get select when method name matches chained assertion * Reuse CHAINED_ASSERT_MATCHER to check argument unpack --------- Co-authored-by: Tim te Beek --- .../SimplifyChainedAssertJAssertion.java | 24 ++-- .../SimplifyChainedAssertJAssertionTest.java | 135 ++++++++++++------ 2 files changed, 98 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java index ca514103f..ba431a43c 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java @@ -30,10 +30,7 @@ import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.TypeUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; @AllArgsConstructor @NoArgsConstructor @@ -163,19 +160,16 @@ private String getStringTemplateAndAppendArguments(J.MethodInvocation assertThat return "assertThat(#{any()}).%s(#{any()})"; } - } - private static Expression extractEitherArgument(boolean assertThatArgumentIsEmpty, Expression assertThatArgument, Expression methodToReplaceArgument) { - if (assertThatArgumentIsEmpty) { - return methodToReplaceArgument; - } - // Only on the assertThat argument do we possibly replace the argument with the select; such as list.size() -> list - if (assertThatArgument instanceof J.MethodInvocation) { - Expression select = ((J.MethodInvocation) assertThatArgument).getSelect(); - if (select != null) { - return select; + private Expression extractEitherArgument(boolean assertThatArgumentIsEmpty, Expression assertThatArgument, Expression methodToReplaceArgument) { + if (assertThatArgumentIsEmpty) { + return methodToReplaceArgument; + } + // Only on the assertThat argument do we possibly replace the argument with the select; such as list.size() -> list + if (CHAINED_ASSERT_MATCHER.matches(assertThatArgument)) { + return Objects.requireNonNull(((J.MethodInvocation) assertThatArgument).getSelect()); } + return assertThatArgument; } - return assertThatArgument; } } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java index 8a2b7f42e..b88b7d315 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertionTest.java @@ -42,7 +42,7 @@ void stringIsEmpty() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat("hello world".isEmpty()).isTrue(); @@ -51,7 +51,7 @@ void testMethod() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat("hello world").isEmpty(); @@ -71,7 +71,7 @@ void stringIsEmptyDescribedAs() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod(String actual) { assertThat(actual.isEmpty()).as("Reason").isTrue(); @@ -80,7 +80,7 @@ void testMethod(String actual) { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod(String actual) { assertThat(actual).as("Reason").isEmpty(); @@ -102,12 +102,12 @@ void chainedRecipes() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString().isEmpty()).isTrue(); } - + String getString() { return "hello world"; } @@ -115,12 +115,12 @@ String getString() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString()).isEmpty(); } - + String getString() { return "hello world"; } @@ -141,14 +141,14 @@ void chainedRecipesOfDifferingTypes() { java( """ import java.nio.file.Path; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void string(String actual) { assertThat(actual.startsWith("prefix")).isTrue(); } - + void path(Path actual) { assertThat(actual.startsWith("prefix")).isTrue(); } @@ -156,14 +156,14 @@ void path(Path actual) { """, """ import java.nio.file.Path; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void string(String actual) { assertThat(actual).startsWith("prefix"); } - + void path(Path actual) { assertThat(actual).startsWithRaw(Path.of("prefix")); } @@ -181,13 +181,13 @@ void assertThatArgHasArgument() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { String expected = "hello world"; assertThat(getString().equalsIgnoreCase(expected)).isTrue(); } - + String getString() { return "hello world"; } @@ -195,13 +195,13 @@ String getString() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { String expected = "hello world"; assertThat(getString()).isEqualToIgnoringCase(expected); } - + String getString() { return "hello world"; } @@ -219,13 +219,13 @@ void replacementHasArgument() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { int length = 5; assertThat(getString().length()).isEqualTo(length); } - + String getString() { return "hello world"; } @@ -233,13 +233,13 @@ String getString() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { int length = 5; assertThat(getString()).hasSize(length); } - + String getString() { return "hello world"; } @@ -258,12 +258,12 @@ void normalCase() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString().trim()).isEmpty(); } - + String getString() { return "hello world"; } @@ -271,12 +271,12 @@ String getString() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString()).isBlank(); } - + String getString() { return "hello world"; } @@ -297,7 +297,7 @@ void stringContains() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat("hello world".contains("lo wo")).isTrue(); @@ -307,7 +307,7 @@ void testMethod() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat("hello world").contains("lo wo"); @@ -319,6 +319,49 @@ void testMethod() { ); } + @Test + void stringContainsObjectMethod() { + rewriteRun( + spec -> spec.recipes( + new SimplifyChainedAssertJAssertion("contains", "isTrue", "contains", "java.lang.String")), + //language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Pojo { + public String getString() { + return "lo wo"; + } + } + + class MyTest { + void testMethod() { + var pojo = new Pojo(); + assertThat("hello world".contains(pojo.getString())).isTrue(); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Pojo { + public String getString() { + return "lo wo"; + } + } + + class MyTest { + void testMethod() { + var pojo = new Pojo(); + assertThat("hello world").contains(pojo.getString()); + } + } + """ + ) + ); + } + @Test void mapMethodDealsWithTwoArguments() { rewriteRun( @@ -328,16 +371,16 @@ void mapMethodDealsWithTwoArguments() { """ import java.util.Collections; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { String key = "key"; String value = "value"; assertThat(getMap().get(key)).isEqualTo(value); } - + Map getMap() { return Collections.emptyMap(); } @@ -346,16 +389,16 @@ Map getMap() { """ import java.util.Collections; import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { String key = "key"; String value = "value"; assertThat(getMap()).containsEntry(key, value); } - + Map getMap() { return Collections.emptyMap(); } @@ -373,9 +416,9 @@ void keySetContainsWithMultipleArguments() { java( """ import java.util.Map; - + import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod(Map map) { // we don't yet support `containsKeys` @@ -395,12 +438,12 @@ void isNotEmptyTest() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString().isEmpty()).isFalse(); } - + String getString() { return "hello world"; } @@ -408,12 +451,12 @@ String getString() { """, """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString()).isNotEmpty(); } - + String getString() { return "hello world"; } @@ -431,12 +474,12 @@ void doesNoRunOnWrongCombination() { java( """ import static org.assertj.core.api.Assertions.assertThat; - + class MyTest { void testMethod() { assertThat(getString().isBlank()).isFalse(); } - + String getString() { return "hello world"; } @@ -463,7 +506,7 @@ void simplifyPresenceAssertion() { """ import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; - + class Test { void simpleTest(Optional o) { assertThat(o.isPresent()).isTrue(); @@ -476,7 +519,7 @@ void simpleTest(Optional o) { """ import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; - + class Test { void simpleTest(Optional o) { assertThat(o).isPresent(); @@ -502,7 +545,7 @@ void simplifiyEqualityAssertion() { """ import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; - + class Test { void simpleTest(Optional o) { assertThat(o.get()).isEqualTo("foo"); @@ -513,7 +556,7 @@ void simpleTest(Optional o) { """ import static org.assertj.core.api.Assertions.assertThat; import java.util.Optional; - + class Test { void simpleTest(Optional o) { assertThat(o).contains("foo"); From 5f16e85a4a78a4e884e1ac07b55d391e21f91b46 Mon Sep 17 00:00:00 2001 From: Nate Danner Date: Fri, 1 Nov 2024 21:08:01 +0000 Subject: [PATCH 095/118] refactor: Standardize `.editorconfig` Use this link to re-run the recipe: https://app.moderne.io/builder/N3MJaFjMF?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .editorconfig | 9 +++++++++ src/test/java/org/openrewrite/java/testing/.editorconfig | 5 ----- 2 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 .editorconfig delete mode 100644 src/test/java/org/openrewrite/java/testing/.editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..7a7ad4c70 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +insert_final_newline = true +trim_trailing_whitespace = true + +[src/test*/java/**.java] +indent_size = 4 +ij_continuation_indent_size = 2 diff --git a/src/test/java/org/openrewrite/java/testing/.editorconfig b/src/test/java/org/openrewrite/java/testing/.editorconfig deleted file mode 100644 index a4824935e..000000000 --- a/src/test/java/org/openrewrite/java/testing/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -root = true - -[*.java] -indent_size = 4 -ij_continuation_indent_size = 2 From 56fffc0323b0074c3353a5089f00a87db84421bd Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sat, 2 Nov 2024 13:07:00 +0100 Subject: [PATCH 096/118] Do not print template before use --- .../java/testing/junit5/MockitoJUnitToMockitoExtension.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java index 177b361bf..16939a286 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java @@ -121,7 +121,6 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex } if (!strictness.contains("STRICT_STUBS")) { cd = JavaTemplate.builder("@MockitoSettings(strictness = " + strictness + ")") - .doBeforeParseTemplate(System.out::println) .javaParser(JavaParser.fromJavaVersion() .classpathFromResources(ctx, "junit-jupiter-api-5.9", "mockito-junit-jupiter-3.12")) .imports("org.mockito.junit.jupiter.MockitoSettings", "org.mockito.quality.Strictness") From 72232f7e2e277da377c6d04b8c475f7459079f31 Mon Sep 17 00:00:00 2001 From: SiBorea <108953913+SiBorea@users.noreply.github.com> Date: Sat, 2 Nov 2024 20:08:59 +0800 Subject: [PATCH 097/118] Add JMockit's MockUp to Mockito migration (#599) * Add JMockit's MockUp to Mockito migration * Adopt mockito-core:5.+ through parserClasspath * Apply bot code suggestions * Add type check for new class statement * Fix statement construction * Remove debug statement * Fix code format * Use CallRealMethod for non mock methods * Update src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Add description about private methods * Update JMockitMockUpToMockitoTest.java * Fix UT to match gralde build order * Add setUp/tearDown support * Add MockUp params support * Remove useless * Fix JavaTemplate type inference * Remove unused local variables * MockUp to try-with-resource * Add import class test * Add multiple mockUp test * Apply bot suggestions Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Remove useless type cast * Fix variable naming * Remove fqn from naming * Remove unneeded method call * Shorter var naming * Update JMockitMockUpToMockitoTest.java * Refactor mockup migration to resuse existing code and cleanup * Resolve deprecated print() * Utilize LambdaBlockToExpression * Make constants * Apply bot suggestions Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Apply formatter and fix compilation * Place binary operators on the same line * Add missing language hints * Adopt AtomicReference instead of array element zero * Fix workflow build * Update src/main/java/org/openrewrite/java/testing/mockito/MockitoUtils.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Use mockito-core-3 instead of mockito-core-5 * Inline constants used once; Explicitly name reference var * Use now public VariableReferences.findRhsReferences --------- Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek Co-authored-by: Shivani Sharma --- .../jmockit/JMockitMockUpToMockito.java | 532 ++++++++++++++ .../java/testing/mockito/MockitoUtils.java | 93 +++ .../PowerMockitoMockStaticToMockito.java | 58 +- .../resources/META-INF/rewrite/jmockit.yml | 1 + .../jmockit/JMockitMockUpToMockitoTest.java | 653 ++++++++++++++++++ ...kitNonStrictExpectationsToMockitoTest.java | 255 ++++--- .../testing/jmockit/JMockitTestUtils.java | 1 + 7 files changed, 1410 insertions(+), 183 deletions(-) create mode 100644 src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java create mode 100644 src/main/java/org/openrewrite/java/testing/mockito/MockitoUtils.java create mode 100644 src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java diff --git a/src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java new file mode 100644 index 000000000..fb942c504 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockito.java @@ -0,0 +1,532 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.openrewrite.*; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.tree.*; +import org.openrewrite.marker.SearchResult; +import org.openrewrite.staticanalysis.LambdaBlockToExpression; +import org.openrewrite.staticanalysis.VariableReferences; + +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toMap; +import static org.openrewrite.java.testing.mockito.MockitoUtils.maybeAddMethodWithAnnotation; +import static org.openrewrite.java.tree.Flag.Private; +import static org.openrewrite.java.tree.Flag.Static; + +public class JMockitMockUpToMockito extends Recipe { + + private static final String JMOCKIT_MOCKUP_IMPORT = "mockit.MockUp"; + private static final String JMOCKIT_MOCK_IMPORT = "mockit.Mock"; + + private static final String MOCKITO_CLASSPATH = "mockito-core-3"; + private static final String MOCKITO_ALL_IMPORT = "org.mockito.Mockito.*"; + private static final String MOCKITO_MATCHER_IMPORT = "org.mockito.ArgumentMatchers.*"; + private static final String MOCKITO_DELEGATEANSWER_IMPORT = "org.mockito.AdditionalAnswers.delegatesTo"; + private static final String MOCKITO_STATIC_PREFIX = "mockStatic"; + private static final String MOCKITO_STATIC_IMPORT = "org.mockito.MockedStatic"; + private static final String MOCKITO_MOCK_PREFIX = "mock"; + private static final String MOCKITO_CONSTRUCTION_PREFIX = "mockCons"; + private static final String MOCKITO_CONSTRUCTION_IMPORT = "org.mockito.MockedConstruction"; + + @Override + public String getDisplayName() { + return "Rewrite JMockit MockUp to Mockito statements"; + } + + @Override + public String getDescription() { + return "Rewrites JMockit `MockUp` blocks to Mockito statements. This recipe will not rewrite private methods in MockUp."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesType<>(JMOCKIT_MOCKUP_IMPORT, false), new JMockitMockUpToMockitoVisitor()); + } + + private static class JMockitMockUpToMockitoVisitor extends JavaIsoVisitor { + private final Map tearDownMocks = new HashMap<>(); + + /** + * Handle at class level because need to handle the case where when there is a MockUp in a setup method, and we + * need to close the migrated mockCons in the teardown, yet the teardown method comes before the setup method + */ + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ctx) { + // Handle @Before/@BeforeEach mockUp + Set mds = TreeVisitor.collect( + new JavaIsoVisitor() { + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration md, ExecutionContext ctx) { + if (isSetUpMethod(md)) { + return SearchResult.found(md); + } + return super.visitMethodDeclaration(md, ctx); + } + }, + classDecl, + new HashSet<>() + ) + .stream() + .filter(J.MethodDeclaration.class::isInstance) + .map(J.MethodDeclaration.class::cast) + .collect(Collectors.toSet()); + if (mds.isEmpty()) { + return super.visitClassDeclaration(classDecl, ctx); + } + + AtomicReference cdRef = new AtomicReference<>(classDecl); + mds.forEach(md -> md.getBody() + .getStatements() + .stream() + .filter(this::isMockUpStatement) + .map(J.NewClass.class::cast) + .forEach(newClass -> { + String className = ((J.ParameterizedType) newClass.getClazz()).getTypeParameters().get(0).toString(); + + Map mockedMethods = getMockUpMethods(newClass); + + // Add mockStatic field + if (mockedMethods.values().stream().anyMatch(m -> m.getFlags().contains(Static))) { + cdRef.set(JavaTemplate.builder("private MockedStatic #{};") + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, MOCKITO_CLASSPATH)) + .imports(MOCKITO_STATIC_IMPORT) + .staticImports(MOCKITO_ALL_IMPORT) + .build() + .apply( + new Cursor(getCursor().getParentOrThrow(), cdRef.get()), + cdRef.get().getBody().getCoordinates().firstStatement(), + MOCKITO_STATIC_PREFIX + className + )); + J.VariableDeclarations mockField = (J.VariableDeclarations) cdRef.get().getBody().getStatements().get(0); + J.Identifier mockFieldId = mockField.getVariables().get(0).getName(); + tearDownMocks.put(MOCKITO_STATIC_PREFIX + className, mockFieldId); + } + // Add mockConstruction field + if (mockedMethods.values().stream().anyMatch(m -> !m.getFlags().contains(Static))) { + cdRef.set(JavaTemplate.builder("private MockedConstruction #{};") + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, MOCKITO_CLASSPATH)) + .imports(MOCKITO_CONSTRUCTION_IMPORT) + .staticImports(MOCKITO_ALL_IMPORT) + .build() + .apply( + updateCursor(cdRef.get()), + cdRef.get().getBody().getCoordinates().firstStatement(), + MOCKITO_CONSTRUCTION_PREFIX + className + )); + J.VariableDeclarations mockField = (J.VariableDeclarations) cdRef.get().getBody().getStatements().get(0); + J.Identifier mockFieldId = mockField.getVariables().get(0).getName(); + tearDownMocks.put(MOCKITO_CONSTRUCTION_PREFIX + className, mockFieldId); + } + })); + + J.ClassDeclaration cd = maybeAddMethodWithAnnotation(this, cdRef.get(), ctx, true, "tearDown", + "@org.junit.After", + "@After", + "junit-4.13", + "org.junit.After", + ""); + + return super.visitClassDeclaration(cd, ctx); + } + + @Override + public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl, ExecutionContext ctx) { + J.MethodDeclaration md = methodDecl; + if (md.getBody() == null) { + return md; + } + if (isTearDownMethod(md)) { + for (J.Identifier id : tearDownMocks.values()) { + String type = TypeUtils.asFullyQualified(id.getFieldType().getType()).getFullyQualifiedName(); + md = JavaTemplate.builder("#{any(" + type + ")}.closeOnDemand();") + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, MOCKITO_CLASSPATH)) + .imports(MOCKITO_STATIC_IMPORT, MOCKITO_CONSTRUCTION_IMPORT) + .staticImports(MOCKITO_ALL_IMPORT) + .build() + .apply( + updateCursor(md), + md.getBody().getCoordinates().lastStatement(), + id + ); + } + return md; + } + + boolean isBeforeTest = isSetUpMethod(md); + List varDeclarationInTry = new ArrayList<>(); + List mockStaticMethodInTry = new ArrayList<>(); + List mockConstructionMethodInTry = new ArrayList<>(); + List encloseStatements = new ArrayList<>(); + List residualStatements = new ArrayList<>(); + for (Statement statement : md.getBody().getStatements()) { + if (!isMockUpStatement(statement)) { + encloseStatements.add(statement); + continue; + } + + J.NewClass newClass = (J.NewClass) statement; + + // Only discard @Mock method declarations + residualStatements.addAll(newClass + .getBody() + .getStatements() + .stream() + .filter(s -> { + if (s instanceof J.MethodDeclaration) { + return ((J.MethodDeclaration) s).getLeadingAnnotations().stream() + .noneMatch(o -> TypeUtils.isOfClassType(o.getType(), JMOCKIT_MOCK_IMPORT)); + } + return true; + }) + .collect(toList()) + ); + + JavaType mockType = ((J.ParameterizedType) newClass.getClazz()).getTypeParameters().get(0).getType(); + String className = ((J.ParameterizedType) newClass.getClazz()).getTypeParameters().get(0).toString(); + + Map mockedMethods = getMockUpMethods(newClass); + + // Add MockStatic + Map mockedPublicStaticMethods = mockedMethods + .entrySet() + .stream() + .filter(m -> m.getValue().getFlags().contains(Static)) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); + if (!mockedPublicStaticMethods.isEmpty()) { + if (isBeforeTest) { + String tpl = getMockStaticDeclarationInBefore(className) + + getMockStaticMethods((JavaType.Class) mockType, className, mockedPublicStaticMethods); + + md = JavaTemplate.builder(tpl) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, MOCKITO_CLASSPATH)) + .imports(MOCKITO_STATIC_IMPORT) + .staticImports(MOCKITO_ALL_IMPORT) + .build() + .apply( + updateCursor(md), + statement.getCoordinates().after(), + tearDownMocks.get(MOCKITO_STATIC_PREFIX + className) + ); + } else { + varDeclarationInTry.add(getMockStaticDeclarationInTry(className)); + mockStaticMethodInTry.add(getMockStaticMethods((JavaType.Class) mockType, className, mockedPublicStaticMethods)); + } + + maybeAddImport(MOCKITO_STATIC_IMPORT); + } + + // Add MockConstruction + Map mockedPublicMethods = mockedMethods + .entrySet() + .stream() + .filter(m -> !m.getValue().getFlags().contains(Static)) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); + if (!mockedPublicMethods.isEmpty()) { + if (isBeforeTest) { + String tpl = getMockConstructionMethods(className, mockedPublicMethods) + + getMockConstructionDeclarationInBefore(className); + + md = JavaTemplate.builder(tpl) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, MOCKITO_CLASSPATH)) + .imports(MOCKITO_STATIC_IMPORT) + .staticImports(MOCKITO_ALL_IMPORT, MOCKITO_DELEGATEANSWER_IMPORT) + .build() + .apply( + updateCursor(md), + statement.getCoordinates().after(), + tearDownMocks.get(MOCKITO_CONSTRUCTION_PREFIX + className) + ); + } else { + varDeclarationInTry.add(getMockConstructionDeclarationInTry(className)); + mockConstructionMethodInTry.add(getMockConstructionMethods(className, mockedPublicMethods)); + } + + maybeAddImport(MOCKITO_CONSTRUCTION_IMPORT); + maybeAddImport("org.mockito.Answers", "CALLS_REAL_METHODS", false); + maybeAddImport("org.mockito.AdditionalAnswers", "delegatesTo", false); + } + + List statements = md.getBody().getStatements(); + statements.remove(statement); + md = md.withBody(md.getBody().withStatements(statements)); + } + + if (!varDeclarationInTry.isEmpty()) { + String tpl = String.join("", mockConstructionMethodInTry) + + "try (" + + String.join(";", varDeclarationInTry) + + ") {" + + String.join(";", mockStaticMethodInTry) + + "}"; + + J.MethodDeclaration residualMd = md.withBody(md.getBody().withStatements(residualStatements)); + residualMd = JavaTemplate.builder(tpl) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, MOCKITO_CLASSPATH)) + .imports(MOCKITO_STATIC_IMPORT, MOCKITO_CONSTRUCTION_IMPORT) + .staticImports(MOCKITO_ALL_IMPORT, MOCKITO_MATCHER_IMPORT, MOCKITO_MATCHER_IMPORT, MOCKITO_DELEGATEANSWER_IMPORT) + .build() + .apply(updateCursor(residualMd), residualMd.getBody().getCoordinates().lastStatement()); + + List mdStatements = residualMd.getBody().getStatements(); + J.Try try_ = (J.Try) mdStatements.get(mdStatements.size() - 1); + + List tryStatements = try_.getBody().getStatements(); + tryStatements.addAll(encloseStatements); + try_ = try_.withBody(try_.getBody().withStatements(tryStatements)); + + mdStatements.set(mdStatements.size() - 1, try_); + md = md.withBody(residualMd.getBody().withStatements(mdStatements)); + } + + maybeAddImport(MOCKITO_ALL_IMPORT.replace(".*", ""), "*", false); + maybeRemoveImport(JMOCKIT_MOCK_IMPORT); + maybeRemoveImport(JMOCKIT_MOCKUP_IMPORT); + + doAfterVisit(new LambdaBlockToExpression().getVisitor()); + return maybeAutoFormat(methodDecl, md, ctx); + } + + private String getMatcher(JavaType s) { + maybeAddImport(MOCKITO_MATCHER_IMPORT.replace(".*", ""), "*", false); + if (s instanceof JavaType.Primitive) { + switch (s.toString()) { + case "int": + return "anyInt()"; + case "long": + return "anyLong()"; + case "double": + return "anyDouble()"; + case "float": + return "anyFloat()"; + case "short": + return "anyShort()"; + case "byte": + return "anyByte()"; + case "char": + return "anyChar()"; + case "boolean": + return "anyBoolean()"; + } + } else if (s instanceof JavaType.Array) { + String elem = TypeUtils.asArray(s).getElemType().toString(); + return "nullable(" + elem + "[].class)"; + } + return "nullable(" + TypeUtils.asFullyQualified(s).getClassName() + ".class)"; + } + + private String getAnswerBody(J.MethodDeclaration md) { + Set usedVariables = new HashSet<>(); + new JavaIsoVisitor>() { + @Override + public J.VariableDeclarations.NamedVariable visitVariable(J.VariableDeclarations.NamedVariable variable, Set ctx) { + Cursor scope = getCursor().dropParentUntil((is) -> is instanceof J.ClassDeclaration || is instanceof J.Block || is instanceof J.MethodDeclaration || is instanceof J.ForLoop || is instanceof J.ForEachLoop || is instanceof J.ForLoop.Control || is instanceof J.ForEachLoop.Control || is instanceof J.Case || is instanceof J.Try || is instanceof J.Try.Resource || is instanceof J.Try.Catch || is instanceof J.MultiCatch || is instanceof J.Lambda || is instanceof JavaSourceFile); + if (!VariableReferences.findRhsReferences(scope.getValue(), variable.getName()).isEmpty()) { + ctx.add(variable.getSimpleName()); + } + return super.visitVariable(variable, ctx); + } + }.visit(md, usedVariables); + + StringBuilder sb = new StringBuilder(); + List parameters = md.getParameters(); + for (int i = 0; i < parameters.size(); i++) { + if (!(parameters.get(i) instanceof J.VariableDeclarations)) { + continue; + } + J.VariableDeclarations vd = (J.VariableDeclarations) parameters.get(i); + String className; + if (vd.getType() instanceof JavaType.Primitive) { + className = vd.getType().toString(); + } else { + className = vd.getTypeAsFullyQualified().getClassName(); + } + String varName = vd.getVariables().get(0).getName().getSimpleName(); + if (usedVariables.contains(varName)) { + sb.append(className).append(" ").append(varName) + .append(" = invocation.getArgument(").append(i).append(");"); + } + } + + boolean hasReturn = false; + for (Statement s : md.getBody().getStatements()) { + hasReturn |= s instanceof J.Return; + sb.append(s.print(getCursor())).append(";"); + } + // Avoid syntax error + if (!hasReturn) { + sb.append("return null;"); + } + return sb.toString(); + } + + private String getCallRealMethod(JavaType.Method m) { + return "(" + + m.getParameterTypes() + .stream() + .map(this::getMatcher) + .collect(Collectors.joining(", ")) + + ")).thenCallRealMethod();"; + } + + private String getMockStaticDeclarationInBefore(String className) { + return "#{any(" + MOCKITO_STATIC_IMPORT + ")}" + + " = mockStatic(" + className + ".class);"; + } + + private String getMockStaticDeclarationInTry(String className) { + return "MockedStatic " + MOCKITO_STATIC_PREFIX + className + + " = mockStatic(" + className + ".class)"; + } + + private String getMockStaticMethods(JavaType.Class clazz, String className, Map mockedMethods) { + StringBuilder tpl = new StringBuilder(); + + // To generate predictable method order + List keys = mockedMethods.keySet().stream() + .sorted(Comparator.comparing(o -> o.print(getCursor()))) + .collect(toList()); + for (J.MethodDeclaration m : keys) { + tpl.append("mockStatic").append(className) + .append(".when(() -> ").append(className).append(".").append(m.getSimpleName()).append("(") + .append(m.getParameters() + .stream() + .filter(J.VariableDeclarations.class::isInstance) + .map(J.VariableDeclarations.class::cast) + .map(J.VariableDeclarations::getType) + .map(this::getMatcher) + .collect(Collectors.joining(", ")) + ) + .append(")).thenAnswer(invocation -> {") + .append(getAnswerBody(m)) + .append("});"); + } + + // Call real method for non private, static methods + clazz.getMethods() + .stream() + .filter(m -> !m.isConstructor()) + .filter(m -> !m.getFlags().contains(Private)) + .filter(m -> m.getFlags().contains(Static)) + .filter(m -> !mockedMethods.containsValue(m)) + .forEach(m -> tpl.append("mockStatic").append(className).append(".when(() -> ") + .append(className).append(".").append(m.getName()) + .append(getCallRealMethod(m)) + .append(");") + ); + + return tpl.toString(); + } + + private String getMockConstructionDeclarationInBefore(String className) { + return "#{any(" + MOCKITO_CONSTRUCTION_IMPORT + ")}" + + " = mockConstructionWithAnswer(" + className + ".class, delegatesTo(" + MOCKITO_MOCK_PREFIX + className + "));"; + } + + private String getMockConstructionDeclarationInTry(String className) { + return "MockedConstruction " + MOCKITO_CONSTRUCTION_PREFIX + className + + " = mockConstructionWithAnswer(" + className + ".class, delegatesTo(" + MOCKITO_MOCK_PREFIX + className + "))"; + } + + private String getMockConstructionMethods(String className, Map mockedMethods) { + StringBuilder tpl = new StringBuilder() + .append(className) + .append(" ") + .append(MOCKITO_MOCK_PREFIX).append(className) + .append(" = mock(").append(className).append(".class, CALLS_REAL_METHODS);"); + + mockedMethods + .keySet() + .stream() + .sorted(Comparator.comparing(o -> o.print(getCursor()))) + .forEach(m -> tpl.append("doAnswer(invocation -> {") + .append(getAnswerBody(m)) + .append("}).when(").append(MOCKITO_MOCK_PREFIX).append(className).append(").").append(m.getSimpleName()).append("(") + .append(m.getParameters() + .stream() + .filter(J.VariableDeclarations.class::isInstance) + .map(J.VariableDeclarations.class::cast) + .map(J.VariableDeclarations::getType) + .map(this::getMatcher) + .collect(Collectors.joining(", ")) + ) + .append(");")); + + return tpl.toString(); + } + + private boolean isMockUpStatement(Tree tree) { + return tree instanceof J.NewClass && + ((J.NewClass) tree).getClazz() != null && + TypeUtils.isOfClassType(((J.NewClass) tree).getClazz().getType(), JMOCKIT_MOCKUP_IMPORT); + } + + private boolean isSetUpMethod(J.MethodDeclaration md) { + return md + .getLeadingAnnotations() + .stream() + .anyMatch(o -> TypeUtils.isOfClassType(o.getType(), "org.junit.Before")); + } + + private boolean isTearDownMethod(J.MethodDeclaration md) { + return md + .getLeadingAnnotations() + .stream() + .anyMatch(o -> TypeUtils.isOfClassType(o.getType(), "org.junit.After")); + } + + private Map getMockUpMethods(J.NewClass newClass) { + JavaType mockType = ((J.ParameterizedType) newClass.getClazz()).getTypeParameters().get(0).getType(); + return newClass.getBody() + .getStatements() + .stream() + .filter(J.MethodDeclaration.class::isInstance) + .map(J.MethodDeclaration.class::cast) + .filter(s -> s.getLeadingAnnotations().stream() + .anyMatch(o -> TypeUtils.isOfClassType(o.getType(), JMOCKIT_MOCK_IMPORT))) + .map(method -> { + Optional found = TypeUtils.findDeclaredMethod( + TypeUtils.asFullyQualified(mockType), + method.getSimpleName(), + method.getMethodType().getParameterTypes() + ); + if (found.isPresent()) { + JavaType.Method m = found.get(); + if (!m.getFlags().contains(Private)) { + return new AbstractMap.SimpleEntry<>(method, found.get()); + } + } + return null; + }) + .filter(Objects::nonNull) + .collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + } +} diff --git a/src/main/java/org/openrewrite/java/testing/mockito/MockitoUtils.java b/src/main/java/org/openrewrite/java/testing/mockito/MockitoUtils.java new file mode 100644 index 000000000..ad143e008 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/mockito/MockitoUtils.java @@ -0,0 +1,93 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.jspecify.annotations.Nullable; +import org.openrewrite.Cursor; +import org.openrewrite.ExecutionContext; +import org.openrewrite.java.AnnotationMatcher; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.JavaVisitor; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.Statement; + +import java.util.List; +import java.util.stream.Collectors; + +public class MockitoUtils { + public static J.ClassDeclaration maybeAddMethodWithAnnotation( + JavaVisitor visitor, + J.ClassDeclaration classDecl, + ExecutionContext ctx, + boolean isPublic, + String methodName, + String methodAnnotationSignature, + String methodAnnotationToAdd, + String additionalClasspathResource, + String importToAdd, + String methodAnnotationParameters + ) { + if (hasMethodWithAnnotation(classDecl, new AnnotationMatcher(methodAnnotationSignature))) { + return classDecl; + } + + J.MethodDeclaration firstTestMethod = getFirstTestMethod( + classDecl.getBody().getStatements().stream().filter(J.MethodDeclaration.class::isInstance) + .map(J.MethodDeclaration.class::cast).collect(Collectors.toList())); + + visitor.maybeAddImport(importToAdd); + String tplStr = methodAnnotationToAdd + methodAnnotationParameters + + (isPublic ? " public" : "") + " void " + methodName + "() {}"; + return JavaTemplate.builder(tplStr) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, additionalClasspathResource)) + .imports(importToAdd) + .build() + .apply( + new Cursor(visitor.getCursor().getParentOrThrow(), classDecl), + (firstTestMethod != null) ? + firstTestMethod.getCoordinates().before() : + classDecl.getBody().getCoordinates().lastStatement() + ); + } + + private static boolean hasMethodWithAnnotation(J.ClassDeclaration classDecl, AnnotationMatcher annotationMatcher) { + for (Statement statement : classDecl.getBody().getStatements()) { + if (statement instanceof J.MethodDeclaration) { + J.MethodDeclaration methodDeclaration = (J.MethodDeclaration) statement; + List allAnnotations = methodDeclaration.getAllAnnotations(); + for (J.Annotation annotation : allAnnotations) { + if (annotationMatcher.matches(annotation)) { + return true; + } + } + } + } + return false; + } + + private static J.@Nullable MethodDeclaration getFirstTestMethod(List methods) { + for (J.MethodDeclaration methodDeclaration : methods) { + for (J.Annotation annotation : methodDeclaration.getLeadingAnnotations()) { + if ("Test".equals(annotation.getSimpleName())) { + return methodDeclaration; + } + } + } + return null; + } +} diff --git a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java index aa7cb417d..dbc259a8e 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/PowerMockitoMockStaticToMockito.java @@ -26,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static org.openrewrite.java.testing.mockito.MockitoUtils.maybeAddMethodWithAnnotation; + public class PowerMockitoMockStaticToMockito extends Recipe { @Override @@ -213,32 +215,6 @@ private static boolean isFieldAlreadyDefined(J.Block classBody, String fieldName return false; } - private static J.@Nullable MethodDeclaration getFirstTestMethod(List methods) { - for (J.MethodDeclaration methodDeclaration : methods) { - for (J.Annotation annotation : methodDeclaration.getLeadingAnnotations()) { - if ("Test".equals(annotation.getSimpleName())) { - return methodDeclaration; - } - } - } - return null; - } - - private static boolean hasMethodWithAnnotation(J.ClassDeclaration classDecl, AnnotationMatcher annotationMatcher) { - for (Statement statement : classDecl.getBody().getStatements()) { - if (statement instanceof J.MethodDeclaration) { - J.MethodDeclaration methodDeclaration = (J.MethodDeclaration) statement; - List allAnnotations = methodDeclaration.getAllAnnotations(); - for (J.Annotation annotation : allAnnotations) { - if (annotationMatcher.matches(annotation)) { - return true; - } - } - } - } - return false; - } - private static boolean isStaticMockAlreadyClosed(J.Identifier staticMock, J.Block methodBody) { for (Statement statement : methodBody.getStatements()) { if (statement instanceof J.MethodInvocation) { @@ -465,7 +441,7 @@ private J.ClassDeclaration addFieldDeclarationForMockedTypes(J.ClassDeclaration private J.ClassDeclaration maybeAddSetUpMethodBody(J.ClassDeclaration classDecl, ExecutionContext ctx) { String testGroupsAsString = getTestGroupsAsString(); - return maybeAddMethodWithAnnotation(classDecl, ctx, "setUpStaticMocks", + return maybeAddMethodWithAnnotation(this, classDecl, ctx, false, "setUpStaticMocks", setUpMethodAnnotationSignature, setUpMethodAnnotation, additionalClasspathResource, setUpImportToAdd, testGroupsAsString); } @@ -483,38 +459,12 @@ private String getTestGroupsAsString() { private J.ClassDeclaration maybeAddTearDownMethodBody(J.ClassDeclaration classDecl, ExecutionContext ctx) { String testGroupsAsString = (getTestGroupsAsString().isEmpty()) ? tearDownMethodAnnotationParameters : getTestGroupsAsString(); - return maybeAddMethodWithAnnotation(classDecl, ctx, "tearDownStaticMocks", + return maybeAddMethodWithAnnotation(this, classDecl, ctx, false, "tearDownStaticMocks", tearDownMethodAnnotationSignature, tearDownMethodAnnotation, additionalClasspathResource, tearDownImportToAdd, testGroupsAsString); } - private J.ClassDeclaration maybeAddMethodWithAnnotation(J.ClassDeclaration classDecl, ExecutionContext ctx, - String methodName, String methodAnnotationSignature, - String methodAnnotationToAdd, - String additionalClasspathResource, String importToAdd, - String methodAnnotationParameters) { - if (hasMethodWithAnnotation(classDecl, new AnnotationMatcher(methodAnnotationSignature))) { - return classDecl; - } - - J.MethodDeclaration firstTestMethod = getFirstTestMethod( - classDecl.getBody().getStatements().stream().filter(J.MethodDeclaration.class::isInstance) - .map(J.MethodDeclaration.class::cast).collect(Collectors.toList())); - - maybeAddImport(importToAdd); - return JavaTemplate.builder(methodAnnotationToAdd + methodAnnotationParameters + " void " + methodName + "() {}") - .contextSensitive() - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, additionalClasspathResource)) - .imports(importToAdd) - .build() - .apply( - new Cursor(getCursor().getParentOrThrow(), classDecl), - (firstTestMethod != null) ? - firstTestMethod.getCoordinates().before() : - classDecl.getBody().getCoordinates().lastStatement() - ); - } private J.MethodInvocation modifyWhenMethodInvocation(J.MethodInvocation whenMethod) { List methodArguments = whenMethod.getArguments(); diff --git a/src/main/resources/META-INF/rewrite/jmockit.yml b/src/main/resources/META-INF/rewrite/jmockit.yml index a15136715..d1ee335d7 100644 --- a/src/main/resources/META-INF/rewrite/jmockit.yml +++ b/src/main/resources/META-INF/rewrite/jmockit.yml @@ -23,6 +23,7 @@ tags: - jmockit recipeList: - org.openrewrite.java.testing.jmockit.JMockitBlockToMockito + - org.openrewrite.java.testing.jmockit.JMockitMockUpToMockito - org.openrewrite.java.testing.jmockit.JMockitAnnotatedArgumentToMockito - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: mockit.Mocked diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java new file mode 100644 index 000000000..49c9ed48b --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitMockUpToMockitoTest.java @@ -0,0 +1,653 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.jmockit; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; +import org.openrewrite.test.SourceSpec; +import org.openrewrite.test.TypeValidation; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.*; + +class JMockitMockUpToMockitoTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + setParserSettings(spec, JMOCKIT_DEPENDENCY, JUNIT_4_DEPENDENCY); + } + + @DocumentExample + @Test + void mockUpStaticMethodTest() { + //language=java + rewriteRun( + java( + """ + import mockit.Mock; + import mockit.MockUp; + import static org.junit.Assert.assertEquals; + import org.junit.Test; + + public class MockUpTest { + @Test + public void test() { + new MockUp() { + + @Mock + public int staticMethod() { + return 1024; + } + + @Mock + public int staticMethod(int v) { + return 128; + } + }; + assertEquals(1024, MyClazz.staticMethod()); + assertEquals(128, MyClazz.staticMethod(0)); + } + + public static class MyClazz { + public static int staticMethod() { + return 0; + } + + public static int staticMethod(int v) { + return 1; + } + } + } + """, """ + import static org.junit.Assert.assertEquals; + import static org.mockito.ArgumentMatchers.*; + import static org.mockito.Mockito.*; + + import org.junit.Test; + import org.mockito.MockedStatic; + + public class MockUpTest { + @Test + public void test() { + try (MockedStatic mockStaticMyClazz = mockStatic(MyClazz.class)) { + mockStaticMyClazz.when(() -> MyClazz.staticMethod()).thenAnswer(invocation -> 1024); + mockStaticMyClazz.when(() -> MyClazz.staticMethod(anyInt())).thenAnswer(invocation -> 128); + assertEquals(1024, MyClazz.staticMethod()); + assertEquals(128, MyClazz.staticMethod(0)); + } + } + + public static class MyClazz { + public static int staticMethod() { + return 0; + } + + public static int staticMethod(int v) { + return 1; + } + } + } + """)); + } + + @Test + void mockUpMultipleTest() { + //language=java + rewriteRun( + spec -> spec.afterTypeValidationOptions(TypeValidation.builder().identifiers(false).build()), + java( + """ + package com.openrewrite; + public static class Foo { + public String getMsg() { + return "foo"; + } + + public String getMsg(String echo) { + return "foo" + echo; + } + } + """, + SourceSpec::skip + ), + java( + """ + package com.openrewrite; + public static class Bar { + public String getMsg() { + return "bar"; + } + + public String getMsg(String echo) { + return "bar" + echo; + } + } + """, + SourceSpec::skip + ), + java( + """ + import com.openrewrite.Foo; + import com.openrewrite.Bar; + import org.junit.Test; + import mockit.Mock; + import mockit.MockUp; + import static org.junit.Assert.assertEquals; + + public class MockUpTest { + @Test + public void test() { + new MockUp() { + @Mock + public String getMsg() { + return "FOO"; + } + @Mock + public String getMsg(String echo) { + return "FOO" + echo; + } + }; + new MockUp() { + @Mock + public String getMsg() { + return "BAR"; + } + @Mock + public String getMsg(String echo) { + return "BAR" + echo; + } + }; + assertEquals("FOO", new Foo().getMsg()); + assertEquals("FOOecho", new Foo().getMsg("echo")); + assertEquals("BAR", new Bar().getMsg()); + assertEquals("BARecho", new Bar().getMsg("echo")); + } + } + """, """ + import com.openrewrite.Foo; + import com.openrewrite.Bar; + import org.junit.Test; + import org.mockito.MockedConstruction; + import static org.junit.Assert.assertEquals; + import static org.mockito.AdditionalAnswers.delegatesTo; + import static org.mockito.Answers.CALLS_REAL_METHODS; + import static org.mockito.ArgumentMatchers.*; + import static org.mockito.Mockito.*; + + public class MockUpTest { + @Test + public void test() { + Foo mockFoo = mock(Foo.class, CALLS_REAL_METHODS); + doAnswer(invocation -> "FOO").when(mockFoo).getMsg(); + doAnswer(invocation -> { + String echo = invocation.getArgument(0); + return "FOO" + echo; + }).when(mockFoo).getMsg(nullable(String.class)); + Bar mockBar = mock(Bar.class, CALLS_REAL_METHODS); + doAnswer(invocation -> "BAR").when(mockBar).getMsg(); + doAnswer(invocation -> { + String echo = invocation.getArgument(0); + return "BAR" + echo; + }).when(mockBar).getMsg(nullable(String.class)); + try (MockedConstruction mockConsFoo = mockConstructionWithAnswer(Foo.class, delegatesTo(mockFoo));MockedConstruction mockConsBar = mockConstructionWithAnswer(Bar.class, delegatesTo(mockBar))) { + assertEquals("FOO", new Foo().getMsg()); + assertEquals("FOOecho", new Foo().getMsg("echo")); + assertEquals("BAR", new Bar().getMsg()); + assertEquals("BARecho", new Bar().getMsg("echo")); + } + } + } + """) + ); + } + + @Test + void mockUpInnerStatementTest() { + //language=java + rewriteRun( + java( + """ + import mockit.Mock; + import mockit.MockUp; + + import org.junit.Test; + import static org.junit.Assert.assertEquals; + + public class MockUpTest { + @Test + public void test() { + new MockUp() { + final String msg = "newMsg"; + + @Mock + public String getMsg() { + return msg; + } + }; + + // Should ignore the newClass statement + new Runnable() { + @Override + public void run() { + System.out.println("run"); + } + }; + assertEquals("newMsg", new MyClazz().getMsg()); + } + + public static class MyClazz { + public String getMsg() { + return "msg"; + } + } + } + """, """ + import org.junit.Test; + import org.mockito.MockedConstruction; + + import static org.junit.Assert.assertEquals; + import static org.mockito.AdditionalAnswers.delegatesTo; + import static org.mockito.Answers.CALLS_REAL_METHODS; + import static org.mockito.Mockito.*; + + public class MockUpTest { + @Test + public void test() { + final String msg = "newMsg"; + MyClazz mockMyClazz = mock(MyClazz.class, CALLS_REAL_METHODS); + doAnswer(invocation -> msg).when(mockMyClazz).getMsg(); + try (MockedConstruction mockConsMyClazz = mockConstructionWithAnswer(MyClazz.class, delegatesTo(mockMyClazz))) { + + // Should ignore the newClass statement + new Runnable() { + @Override + public void run() { + System.out.println("run"); + } + }; + assertEquals("newMsg", new MyClazz().getMsg()); + } + } + + public static class MyClazz { + public String getMsg() { + return "msg"; + } + } + } + """)); + } + + @Test + void mockUpVoidTest() { + //language=java + rewriteRun( + java( + """ + import mockit.Mock; + import mockit.MockUp; + import static org.junit.Assert.assertEquals; + import org.junit.Test; + + public class MockUpTest { + @Test + public void test() { + new MockUp() { + @Mock + public void changeMsg() { + MockUpClass.Save.msg = "mockMsg"; + } + + @Mock + public void changeText(String text) { + MockUpClass.Save.text = "mockText"; + } + }; + + assertEquals("mockMsg", new MockUpClass().getMsg()); + assertEquals("mockText", new MockUpClass().getText()); + } + + public static class MockUpClass { + public static class Save { + public static String msg = "msg"; + public static String text = "text"; + } + + public final String getMsg() { + changeMsg(); + return Save.msg; + } + + public void changeMsg() { + Save.msg = "newMsg"; + } + + public String getText() { + changeText("newText"); + return Save.text; + } + + public static void changeText(String text) { + Save.text = text; + } + } + } + """, + """ + import static org.junit.Assert.assertEquals; + import static org.mockito.AdditionalAnswers.delegatesTo; + import static org.mockito.Answers.CALLS_REAL_METHODS; + import static org.mockito.ArgumentMatchers.*; + import static org.mockito.Mockito.*; + + import org.junit.Test; + import org.mockito.MockedConstruction; + import org.mockito.MockedStatic; + + public class MockUpTest { + @Test + public void test() { + MockUpClass mockMockUpClass = mock(MockUpClass.class, CALLS_REAL_METHODS); + doAnswer(invocation -> { + MockUpClass.Save.msg = "mockMsg"; + return null; + }).when(mockMockUpClass).changeMsg(); + try (MockedStatic mockStaticMockUpClass = mockStatic(MockUpClass.class);MockedConstruction mockConsMockUpClass = mockConstructionWithAnswer(MockUpClass.class, delegatesTo(mockMockUpClass))) { + mockStaticMockUpClass.when(() -> MockUpClass.changeText(nullable(String.class))).thenAnswer(invocation -> { + String text = invocation.getArgument(0); + MockUpClass.Save.text = "mockText"; + return null; + }); + + assertEquals("mockMsg", new MockUpClass().getMsg()); + assertEquals("mockText", new MockUpClass().getText()); + } + } + + public static class MockUpClass { + public static class Save { + public static String msg = "msg"; + public static String text = "text"; + } + + public final String getMsg() { + changeMsg(); + return Save.msg; + } + + public void changeMsg() { + Save.msg = "newMsg"; + } + + public String getText() { + changeText("newText"); + return Save.text; + } + + public static void changeText(String text) { + Save.text = text; + } + } + } + """)); + } + + @Test + void mockUpAtSetUpWithoutTearDownTest() { + rewriteRun( + //language=java + java( + """ + import org.junit.Before; + import org.junit.Test; + import mockit.Mock; + import mockit.MockUp; + import static org.junit.Assert.assertEquals; + + public class MockUpTest { + @Before + public void setUp() { + new MockUp() { + @Mock + public String getMsg() { + return "mockMsg"; + } + }; + } + + @Test + public void test() { + assertEquals("mockMsg", new MyClazz().getMsg()); + } + + public static class MyClazz { + public String getMsg() { + return "msg"; + } + } + } + """, + """ + import org.junit.After; + import org.junit.Before; + import org.junit.Test; + import org.mockito.MockedConstruction; + import static org.junit.Assert.assertEquals; + import static org.mockito.AdditionalAnswers.delegatesTo; + import static org.mockito.Answers.CALLS_REAL_METHODS; + import static org.mockito.Mockito.*; + + public class MockUpTest { + private MockedConstruction mockConsMyClazz; + + @Before + public void setUp() { + MyClazz mockMyClazz = mock(MyClazz.class, CALLS_REAL_METHODS); + doAnswer(invocation -> "mockMsg").when(mockMyClazz).getMsg(); + mockConsMyClazz = mockConstructionWithAnswer(MyClazz.class, delegatesTo(mockMyClazz)); + } + + @After + public void tearDown() { + mockConsMyClazz.closeOnDemand(); + } + + @Test + public void test() { + assertEquals("mockMsg", new MyClazz().getMsg()); + } + + public static class MyClazz { + public String getMsg() { + return "msg"; + } + } + } + """ + ) + ); + } + + @Test + void mockUpAtSetUpWithTearDownTest() { + rewriteRun( + //language=java + java( + """ + import org.junit.Before; + import org.junit.After; + import org.junit.Test; + import mockit.Mock; + import mockit.MockUp; + import static org.junit.Assert.assertEquals; + + public class MockUpTest { + @Before + public void setUp() { + new MockUp() { + @Mock + public String getMsg() { + return "mockMsg"; + } + + @Mock + public String getStaticMsg() { + return "mockStaticMsg"; + } + }; + } + + @After + public void tearDown() { + } + + @Test + public void test() { + assertEquals("mockMsg", new MyClazz().getMsg()); + assertEquals("mockStaticMsg", MyClazz.getStaticMsg()); + } + + public static class MyClazz { + public String getMsg() { + return "msg"; + } + + public static String getStaticMsg() { + return "staticMsg"; + } + } + } + """, + """ + import org.junit.Before; + import org.junit.After; + import org.junit.Test; + import org.mockito.MockedConstruction; + import org.mockito.MockedStatic; + import static org.junit.Assert.assertEquals; + import static org.mockito.AdditionalAnswers.delegatesTo; + import static org.mockito.Answers.CALLS_REAL_METHODS; + import static org.mockito.Mockito.*; + + public class MockUpTest { + private MockedConstruction mockConsMyClazz; + private MockedStatic mockStaticMyClazz; + + @Before + public void setUp() { + MyClazz mockMyClazz = mock(MyClazz.class, CALLS_REAL_METHODS); + doAnswer(invocation -> "mockMsg").when(mockMyClazz).getMsg(); + mockConsMyClazz = mockConstructionWithAnswer(MyClazz.class, delegatesTo(mockMyClazz)); + mockStaticMyClazz = mockStatic(MyClazz.class); + mockStaticMyClazz.when(() -> MyClazz.getStaticMsg()).thenAnswer(invocation -> "mockStaticMsg"); + } + + @After + public void tearDown() { + mockConsMyClazz.closeOnDemand(); + mockStaticMyClazz.closeOnDemand(); + } + + @Test + public void test() { + assertEquals("mockMsg", new MyClazz().getMsg()); + assertEquals("mockStaticMsg", MyClazz.getStaticMsg()); + } + + public static class MyClazz { + public String getMsg() { + return "msg"; + } + + public static String getStaticMsg() { + return "staticMsg"; + } + } + } + """ + ) + ); + } + + @Test + void mockUpWithParamsTest() { + rewriteRun( + //language=java + java( + """ + import mockit.Mock; + import mockit.MockUp; + import org.junit.Test; + + import static org.junit.Assert.assertEquals; + + public class MockUpTest { + @Test + public void init() { + new MockUp() { + @Mock + public String getMsg(String foo, String bar, String unused) { + return foo + bar; + } + }; + assertEquals("foobar", new MyClazz().getMsg("foo", "bar", "unused")); + } + + public static class MyClazz { + public String getMsg(String foo, String bar, String unused) { + return "msg"; + } + } + } + """, + """ + import org.junit.Test; + import org.mockito.MockedConstruction; + + import static org.junit.Assert.assertEquals; + import static org.mockito.AdditionalAnswers.delegatesTo; + import static org.mockito.Answers.CALLS_REAL_METHODS; + import static org.mockito.ArgumentMatchers.*; + import static org.mockito.Mockito.*; + + public class MockUpTest { + @Test + public void init() { + MyClazz mockMyClazz = mock(MyClazz.class, CALLS_REAL_METHODS); + doAnswer(invocation -> { + String foo = invocation.getArgument(0); + String bar = invocation.getArgument(1); + return foo + bar; + }).when(mockMyClazz).getMsg(nullable(String.class), nullable(String.class), nullable(String.class)); + try (MockedConstruction mockConsMyClazz = mockConstructionWithAnswer(MyClazz.class, delegatesTo(mockMyClazz))) { + assertEquals("foobar", new MyClazz().getMsg("foo", "bar", "unused")); + } + } + + public static class MyClazz { + public String getMsg(String foo, String bar, String unused) { + return "msg"; + } + } + } + """ + ) + ); + } +} diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java index bc186bb48..463746a26 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitNonStrictExpectationsToMockitoTest.java @@ -21,12 +21,9 @@ import org.openrewrite.test.RewriteTest; import static org.openrewrite.java.Assertions.java; -import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.MOCKITO_CORE_DEPENDENCY; -import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.setParserSettings; +import static org.openrewrite.java.testing.jmockit.JMockitTestUtils.*; class JMockitNonStrictExpectationsToMockitoTest implements RewriteTest { - - private static final String JUNIT_4_DEPENDENCY = "junit-4.13.2"; private static final String LEGACY_JMOCKIT_DEPENDENCY = "jmockit-1.22"; @Override @@ -53,14 +50,14 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -74,16 +71,16 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertNull; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeField()).thenReturn(null); assertNull(myObject.getSomeField()); @@ -113,14 +110,14 @@ public int getSomeField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -139,16 +136,16 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeField()).thenReturn(10); assertEquals(10, myObject.getSomeField()); @@ -180,14 +177,14 @@ public String getSomeField(String s) { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField(anyString); @@ -201,15 +198,15 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeField(anyString())).thenReturn("foo"); assertEquals("foo", myObject.getSomeField("bar")); @@ -239,16 +236,16 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + String expected = "expected"; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -262,18 +259,18 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + String expected = "expected"; - + void test() { lenient().when(myObject.getSomeField()).thenReturn(expected); assertEquals(expected, myObject.getSomeField()); @@ -303,14 +300,14 @@ public Object getSomeField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertNotNull; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -324,16 +321,16 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeField()).thenReturn(new Object()); assertNotNull(myObject.getSomeField()); @@ -363,12 +360,12 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() throws RuntimeException { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -382,15 +379,15 @@ void test() throws RuntimeException { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() throws RuntimeException { lenient().when(myObject.getSomeField()).thenThrow(new RuntimeException()); myObject.getSomeField(); @@ -420,14 +417,14 @@ public String getSomeField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() throws RuntimeException { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -442,16 +439,16 @@ void test() throws RuntimeException { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() throws RuntimeException { lenient().when(myObject.getSomeField()).thenReturn("foo", "bar"); assertEquals("foo", myObject.getSomeField()); @@ -470,7 +467,7 @@ void whenClassArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(List input) { return "X"; @@ -485,19 +482,19 @@ public String getSomeOtherField(Object input) { """ import java.util.ArrayList; import java.util.List; - + import mockit.NonStrictExpectations; import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField((List) any); @@ -513,19 +510,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertNull; import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeField(anyList())).thenReturn(null); lenient().when(myObject.getSomeOtherField(any(Object.class))).thenReturn(null); @@ -545,7 +542,7 @@ void whenNoArguments() { java( """ import java.util.List; - + class MyObject { public String getSomeField() { return "X"; @@ -557,19 +554,19 @@ public String getSomeField() { """ import java.util.ArrayList; import java.util.List; - + import mockit.NonStrictExpectations; import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeField(); @@ -582,20 +579,20 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertNull; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeField()).thenReturn(null); assertNull(myObject.getSomeField()); @@ -614,7 +611,7 @@ void whenMixedArgumentMatcher() { java( """ import java.util.List; - + class MyObject { public String getSomeField(String s, String s2, String s3, long l1) { return "X"; @@ -626,19 +623,19 @@ public String getSomeField(String s, String s2, String s3, long l1) { """ import java.util.ArrayList; import java.util.List; - + import mockit.NonStrictExpectations; import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { String bazz = "bazz"; new NonStrictExpectations() {{ @@ -652,19 +649,19 @@ void test() { """ import java.util.ArrayList; import java.util.List; - + import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertNull; import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { String bazz = "bazz"; lenient().when(myObject.getSomeField(eq("foo"), anyString(), eq(bazz), eq(10L))).thenReturn(null); @@ -683,7 +680,7 @@ void whenSetupStatements() { java( """ class MyObject { - + public String getSomeField(String s) { return "X"; } @@ -699,26 +696,26 @@ public String getString() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; String s = "s"; - + new NonStrictExpectations() {{ myObject.getSomeField(anyString); result = s; - + myObject.getString(); result = a; }}; - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -728,21 +725,21 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { String a = "a"; String s = "s"; lenient().when(myObject.getSomeField(anyString())).thenReturn(s); lenient().when(myObject.getString()).thenReturn(a); - + assertEquals("s", myObject.getSomeField("foo")); assertEquals("a", myObject.getString()); } @@ -771,14 +768,14 @@ public String getSomeField(String s) { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { String a = "a"; new NonStrictExpectations() {{ @@ -787,7 +784,7 @@ void test() { String b = "b"; result = s; }}; - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -796,21 +793,21 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { String a = "a"; String s = "s"; String b = "b"; lenient().when(myObject.getSomeField(anyString())).thenReturn(s); - + assertEquals("s", myObject.getSomeField("foo")); } } @@ -838,14 +835,14 @@ public String getSomeField() { import mockit.Tested; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; - + @RunWith(JMockit.class) class MyTest { @Tested MyObject myObject; - + void test() { new NonStrictExpectations(myObject) {{ myObject.getSomeField(); @@ -859,16 +856,16 @@ void test() { import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @InjectMocks MyObject myObject; - + void test() { lenient().when(myObject.getSomeField()).thenReturn("foo"); assertEquals("foo", myObject.getSomeField()); @@ -905,18 +902,18 @@ public void doSomething() {} import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked Object myObject; - + @Mocked MyObject myOtherObject; - + void test() { new NonStrictExpectations() {{ myObject.hashCode(); @@ -938,19 +935,19 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock Object myObject; - + @Mock MyObject myOtherObject; - + void test() { lenient().when(myObject.hashCode()).thenReturn(10); lenient().when(myOtherObject.getSomeObjectField()).thenReturn(null); @@ -985,15 +982,15 @@ public String getSomeStringField() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked MyObject myObject; - + void test() { new NonStrictExpectations() {{ myObject.getSomeStringField(); @@ -1012,17 +1009,17 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock MyObject myObject; - + void test() { lenient().when(myObject.getSomeStringField()).thenReturn("a"); assertEquals("a", myObject.getSomeStringField()); @@ -1045,15 +1042,15 @@ void whenNoResultsNoTimes() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; - + @RunWith(JMockit.class) class MyTest { @Mocked Object myObject; - + void test() { new NonStrictExpectations() {{ myObject.wait(anyLong); @@ -1066,15 +1063,15 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(1L); } @@ -1094,12 +1091,12 @@ void whenTimes() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + @RunWith(JMockit.class) class MyTest { @Mocked Object myObject; - + void test() { new NonStrictExpectations() {{ myObject.wait(anyLong, anyInt); @@ -1115,14 +1112,14 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock Object myObject; - + void test() { myObject.wait(10L, 10); myObject.wait(10L, 10); @@ -1145,12 +1142,12 @@ void whenTimesAndResult() { import mockit.Mocked; import mockit.integration.junit4.JMockit; import org.junit.runner.RunWith; - + @RunWith(JMockit.class) class MyTest { @Mocked Object myObject; - + void test() { new NonStrictExpectations() {{ myObject.toString(); @@ -1166,14 +1163,14 @@ void test() { import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; - + import static org.mockito.Mockito.*; - + @RunWith(MockitoJUnitRunner.class) class MyTest { @Mock Object myObject; - + void test() { when(myObject.toString()).thenReturn("foo"); myObject.toString(); diff --git a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java index c66d3fbb1..9c2ac5f31 100644 --- a/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java +++ b/src/test/java/org/openrewrite/java/testing/jmockit/JMockitTestUtils.java @@ -24,6 +24,7 @@ public class JMockitTestUtils { static final String MOCKITO_CORE_DEPENDENCY = "mockito-core-3.12"; static final String JUNIT_5_JUPITER_DEPENDENCY = "junit-jupiter-api-5.9"; + static final String JUNIT_4_DEPENDENCY = "junit-4.13.2"; static final String JMOCKIT_DEPENDENCY = "jmockit-1.49"; static final String MOCKITO_JUPITER_DEPENDENCY = "mockito-junit-jupiter-3.12"; From c4ab9a5c5cd0c0e8a992a02bf9a5177d68638a1d Mon Sep 17 00:00:00 2001 From: Jente Sondervorst Date: Sun, 3 Nov 2024 13:40:39 +0100 Subject: [PATCH 098/118] Initial support for DbRider migration from junit4 to junit5 (#627) * Initial draft of the ExecutionListenerToDbRiderAnnotation ScanningRecipe fixes #624 * Added missing import * Ran best practices * Finishing up on the declarative recipe * Finishing up on the declarative recipe * Minimize tests * Apply formatter * Review comment refactoring * Polish to static constructor & reduce visibility * Final polish: fix header year & only use ridr-junit5 in src/main --------- Co-authored-by: Jente Sondervorst Co-authored-by: Tim te Beek --- build.gradle.kts | 4 +- .../ExecutionListenerToDbRiderAnnotation.java | 265 ++++++++++++++++++ .../java/testing/dbrider/package-info.java | 21 ++ .../rewrite/classpath/rider-junit5-1.44.0.jar | Bin 0 -> 25791 bytes .../resources/META-INF/rewrite/dbrider.yml | 32 +++ .../resources/META-INF/rewrite/junit5.yml | 1 + ...onListenerToDbRiderAnnotationUnitTest.java | 233 +++++++++++++++ .../rewrite/classpath/rider-spring-1.18.0.jar | Bin 0 -> 7276 bytes 8 files changed, 553 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotation.java create mode 100644 src/main/java/org/openrewrite/java/testing/dbrider/package-info.java create mode 100644 src/main/resources/META-INF/rewrite/classpath/rider-junit5-1.44.0.jar create mode 100644 src/main/resources/META-INF/rewrite/dbrider.yml create mode 100644 src/test/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotationUnitTest.java create mode 100644 src/test/resources/META-INF/rewrite/classpath/rider-spring-1.18.0.jar diff --git a/build.gradle.kts b/build.gradle.kts index 71a58d2a0..d29963509 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,6 +26,7 @@ recipeDependencies { parserClasspath("org.powermock:powermock-core:1.7.+") parserClasspath("com.squareup.okhttp3:mockwebserver:4.10.0") parserClasspath("org.springframework:spring-test:6.1.12") + parserClasspath("com.github.database-rider:rider-junit5:1.44.0") } val rewriteVersion = rewriteRecipe.rewriteVersion.get() @@ -69,7 +70,4 @@ dependencies { testRuntimeOnly("org.mockito.kotlin:mockito-kotlin:latest.release") testRuntimeOnly("org.testcontainers:testcontainers:latest.release") testRuntimeOnly("org.testcontainers:nginx:latest.release") - -// testImplementation("org.hamcrest:hamcrest:latest.release") -// testImplementation("org.assertj:assertj-core:latest.release") } diff --git a/src/main/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotation.java b/src/main/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotation.java new file mode 100644 index 000000000..93c1ac817 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotation.java @@ -0,0 +1,265 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.dbrider; + +import org.jspecify.annotations.Nullable; +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.internal.ListUtils; +import org.openrewrite.java.AnnotationMatcher; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; +import org.openrewrite.java.tree.Space; + +import java.util.Comparator; +import java.util.List; + +public class ExecutionListenerToDbRiderAnnotation extends Recipe { + + private static final AnnotationMatcher EXECUTION_LISTENER_ANNOTATION_MATCHER = new AnnotationMatcher("@org.springframework.test.context.TestExecutionListeners"); + private static final AnnotationMatcher DBRIDER_ANNOTATION_MATCHER = new AnnotationMatcher("@com.github.database.rider.junit5.api.DBRider"); + private static final String DBRIDER_TEST_EXECUTION_LISTENER = "com.github.database.rider.spring.DBRiderTestExecutionListener"; + + @Override + public String getDisplayName() { + return "Migrate the `DBRiderTestExecutionListener` to the `@DBRider` annotation"; + } + + @Override + public String getDescription() { + return "Migrate the `DBRiderTestExecutionListener` to the `@DBRider` annotation. " + + "This recipe is useful when migrating from JUnit 4 `dbrider-spring` to JUnit 5 `dbrider-junit5`."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesType<>(DBRIDER_TEST_EXECUTION_LISTENER, true), new JavaIsoVisitor() { + + @Override + public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDeclaration, ExecutionContext ctx) { + J.ClassDeclaration cd = super.visitClassDeclaration(classDeclaration, ctx); + DbRiderExecutionListenerContext context = DbRiderExecutionListenerContext.ofClass(cd); + if (!context.shouldMigrate()) { + return cd; + } + if (context.shouldAddDbRiderAnnotation()) { + cd = JavaTemplate.builder("@DBRider") + .imports("com.github.database.rider.junit5.api.DBRider") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "rider-junit5-1.44")) + .build() + .apply(getCursor(), cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + maybeAddImport("com.github.database.rider.junit5.api.DBRider"); + } + Space prefix = cd.getLeadingAnnotations().get(cd.getLeadingAnnotations().size() - 1).getPrefix(); + return cd.withLeadingAnnotations(ListUtils.map(cd.getLeadingAnnotations(), annotation -> { + if (annotation != null && EXECUTION_LISTENER_ANNOTATION_MATCHER.matches(annotation)) { + J.Annotation executionListenerAnnotation = context.getExecutionListenerAnnotation(); + maybeRemoveImport(DBRIDER_TEST_EXECUTION_LISTENER); + maybeRemoveImport("org.springframework.test.context.TestExecutionListeners.MergeMode"); + maybeRemoveImport("org.springframework.test.context.TestExecutionListeners"); + if (executionListenerAnnotation != null) { + return executionListenerAnnotation + .withArguments(firstItemPrefixWorkaround(executionListenerAnnotation.getArguments())) + .withPrefix(prefix); + } + return null; + } + return annotation; + })); + } + }); + } + + private static class DbRiderExecutionListenerContext { + private J.@Nullable Annotation testExecutionListenerAnnotation; + private boolean dbriderFound = false; + private J.@Nullable NewArray listeners; + private J.@Nullable FieldAccess listener; + private @Nullable Expression inheritListeners; + private @Nullable Expression mergeMode; + + static DbRiderExecutionListenerContext ofClass(J.ClassDeclaration clazz) { + DbRiderExecutionListenerContext context = new DbRiderExecutionListenerContext(); + clazz.getLeadingAnnotations().forEach(annotation -> { + if (EXECUTION_LISTENER_ANNOTATION_MATCHER.matches(annotation)) { + context.testExecutionListenersFound(annotation); + } else if (DBRIDER_ANNOTATION_MATCHER.matches(annotation)) { + context.dbriderFound = true; + } + }); + return context; + } + + private void testExecutionListenersFound(final J.Annotation annotation) { + testExecutionListenerAnnotation = annotation; + if (annotation.getArguments() != null) { + annotation.getArguments().forEach(arg -> { + if (arg instanceof J.Assignment) { + J.Assignment assignment = (J.Assignment) arg; + switch (((J.Identifier) assignment.getVariable()).getSimpleName()) { + case "value": + case "listeners": + if (assignment.getAssignment() instanceof J.NewArray) { + listeners = (J.NewArray) assignment.getAssignment(); + } + break; + case "inheritListeners": + inheritListeners = assignment.getAssignment(); + break; + case "mergeMode": + mergeMode = assignment.getAssignment(); + break; + } + } else if (arg instanceof J.NewArray) { + listeners = (J.NewArray) arg; + } else if (arg instanceof J.FieldAccess) { + listener = (J.FieldAccess) arg; + } + }); + } + } + + public boolean shouldMigrate() { + return isTestExecutionListenerForDbRider() && !dbriderFound; + } + + public boolean shouldAddDbRiderAnnotation() { + if (dbriderFound) { + return false; + } + + return isTestExecutionListenerForDbRider(); + } + + public J.@Nullable Annotation getExecutionListenerAnnotation() { + if (isTestExecutionListenerForDbRider()) { + if (canTestExecutionListenerBeRemoved()) { + return null; + } + if (testExecutionListenerAnnotation != null && testExecutionListenerAnnotation.getArguments() != null) { + return testExecutionListenerAnnotation.withArguments(ListUtils.map(testExecutionListenerAnnotation.getArguments(), arg -> { + if (arg instanceof J.Assignment) { + J.Assignment assignment = (J.Assignment) arg; + Expression newValue = assignment.getAssignment(); + switch (((J.Identifier) assignment.getVariable()).getSimpleName()) { + case "value": + case "listeners": + if (assignment.getAssignment() instanceof J.NewArray) { + newValue = getMigratedListeners(); + } + break; + case "inheritListeners": + newValue = getMigratedInheritListeners(); + break; + case "mergeMode": + newValue = getMigratedMergeMode(); + break; + } + if (newValue == null) { + return null; + } + return assignment.withAssignment(newValue); + } else if (arg instanceof J.NewArray) { + return getMigratedListeners(); + } + if (arg instanceof J.FieldAccess && isTypeReference(arg, DBRIDER_TEST_EXECUTION_LISTENER)) { + return null; + } + return arg; + })); + } + } + + return testExecutionListenerAnnotation; + } + + // We can only remove an execution listener annotation if: + // - InheritListeners was null or true + // - MergeMode was TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS + // By default, the TestExecutionListeners.MergeMode is REPLACE_DEFAULTS so if we remove the annotation, other defaults would kick in. + private boolean canTestExecutionListenerBeRemoved() { + if (listener == null && listeners != null && listeners.getInitializer() != null && + listeners.getInitializer().stream().allMatch(listener -> isTypeReference(listener, DBRIDER_TEST_EXECUTION_LISTENER))) { + return (getMigratedInheritListeners() == null && getMigratedMergeMode() != null); + } + return false; + } + + private @Nullable Expression getMigratedMergeMode() { + if (mergeMode != null && mergeMode instanceof J.FieldAccess && "REPLACE_DEFAULTS".equals(((J.FieldAccess) mergeMode).getName().getSimpleName())) { + return null; + } + return mergeMode; + } + + private @Nullable Expression getMigratedInheritListeners() { + if (inheritListeners != null && (inheritListeners instanceof J.Literal && Boolean.TRUE.equals(((J.Literal) inheritListeners).getValue()))) { + return null; + } + return inheritListeners; + } + + // Remove the DBRiderTestExecutionListener from the listeners array + // If the listeners array is empty after removing the DBRiderTestExecutionListener, return null so that the array itself can be removed + private J.@Nullable NewArray getMigratedListeners() { + if (listeners != null && listeners.getInitializer() != null) { + List newListeners = ListUtils.map(listeners.getInitializer(), listener -> { + if (listener instanceof J.FieldAccess && isTypeReference(listener, DBRIDER_TEST_EXECUTION_LISTENER)) { + return null; + } + return listener; + }); + if (newListeners.isEmpty()) { + return null; + } + return listeners.withInitializer(firstItemPrefixWorkaround(newListeners)); + } + return listeners; + } + + private boolean isTestExecutionListenerForDbRider() { + if (listener != null) { + return isTypeReference(listener, DBRIDER_TEST_EXECUTION_LISTENER); + } + if (listeners != null && listeners.getInitializer() != null) { + return listeners.getInitializer().stream().anyMatch(listener -> isTypeReference(listener, DBRIDER_TEST_EXECUTION_LISTENER)); + } + return false; + } + + private static boolean isTypeReference(Expression expression, String type) { + return expression.getType() instanceof JavaType.Parameterized && + ((JavaType.Parameterized) expression.getType()).getFullyQualifiedName().equals("java.lang.Class") && + ((JavaType.Parameterized) expression.getType()).getTypeParameters().size() == 1 && + ((JavaType.Parameterized) expression.getType()).getTypeParameters().get(0) instanceof JavaType.Class && + ((JavaType.Class) ((JavaType.Parameterized) expression.getType()).getTypeParameters().get(0)).getFullyQualifiedName().equals(type); + } + } + + private static @Nullable List firstItemPrefixWorkaround(@Nullable List list) { + if (list == null || list.isEmpty()) { + return list; + } + return ListUtils.mapFirst(list, t -> t.withPrefix(t.getPrefix().withWhitespace(t.getPrefix().getLastWhitespace().replaceAll(" $", "")))); + } +} diff --git a/src/main/java/org/openrewrite/java/testing/dbrider/package-info.java b/src/main/java/org/openrewrite/java/testing/dbrider/package-info.java new file mode 100644 index 000000000..8a8f30054 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/dbrider/package-info.java @@ -0,0 +1,21 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@NullMarked +@NonNullFields +package org.openrewrite.java.testing.dbrider; + +import org.jspecify.annotations.NullMarked; +import org.openrewrite.internal.lang.NonNullFields; diff --git a/src/main/resources/META-INF/rewrite/classpath/rider-junit5-1.44.0.jar b/src/main/resources/META-INF/rewrite/classpath/rider-junit5-1.44.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c4bbfc62831e7c154d4f42fc7884d29f12c852d GIT binary patch literal 25791 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 F{SWgfZLt6V literal 0 HcmV?d00001 diff --git a/src/main/resources/META-INF/rewrite/dbrider.yml b/src/main/resources/META-INF/rewrite/dbrider.yml new file mode 100644 index 000000000..a6ecc2980 --- /dev/null +++ b/src/main/resources/META-INF/rewrite/dbrider.yml @@ -0,0 +1,32 @@ +# +# Copyright 2024 the original author or authors. +#

    +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +#

    +# https://www.apache.org/licenses/LICENSE-2.0 +#

    +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.testing.dbrider.MigrateDbRiderSpringToDbRiderJUnit5 +displayName: Migrate rider-spring (JUnit4) to rider-junit5 (JUnit5) +description: This recipe will migrate the necessary dependencies and annotations from DbRider with JUnit4 to JUnit5 in a Spring application. +tags: + - testing + - dbrider + - spring +recipeList: + - org.openrewrite.java.testing.dbrider.ExecutionListenerToDbRiderAnnotation + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.github.database-rider + oldArtifactId: rider-spring + newArtifactId: rider-junit5 + newVersion: 1.x +--- \ No newline at end of file diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index a8a38c9cf..4cbe3fe26 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -142,6 +142,7 @@ recipeList: - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: org.jbehave.core.junit.JUnitStories newFullyQualifiedTypeName: org.jbehave.core.junit.JupiterStories + - org.openrewrite.java.testing.dbrider.MigrateDbRiderSpringToDbRiderJUnit5 --- type: specs.openrewrite.org/v1beta/recipe diff --git a/src/test/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotationUnitTest.java b/src/test/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotationUnitTest.java new file mode 100644 index 000000000..b1820b6fc --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/dbrider/ExecutionListenerToDbRiderAnnotationUnitTest.java @@ -0,0 +1,233 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.dbrider; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class ExecutionListenerToDbRiderAnnotationUnitTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec.parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "spring-test-6.1", "rider-spring-1.18", "rider-junit5-1.44")) + .recipe(new ExecutionListenerToDbRiderAnnotation()); + } + + @Test + @DocumentExample + void replaceAnnotationIfOnlyDbRiderListenerMergedWithDefaults() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners(mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS, listeners = {DBRiderTestExecutionListener.class}) + public class Sample {} + """, + """ + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + public class Sample {} + """ + ) + ); + } + + @Test + void addAnnotationIfOnlyDbRiderListenerReplacedDefaults() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners(mergeMode = TestExecutionListeners.MergeMode.REPLACE_DEFAULTS, listeners = {DBRiderTestExecutionListener.class}) + public class Sample {} + """, + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + @TestExecutionListeners + public class Sample {} + """ + ) + ); + } + + @Test + void addAnnotationIfOnlyDbRiderListenerAndNoMergeModeSpecified() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners(listeners = {DBRiderTestExecutionListener.class}) + public class Sample {} + """, + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + @TestExecutionListeners + public class Sample {} + """ + ) + ); + } + + @Test + void addAnnotationIfOnlyDbRiderListenerThroughValue() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners(DBRiderTestExecutionListener.class) + public class Sample {} + """, + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + @TestExecutionListeners + public class Sample {} + """ + ) + ); + } + + @Test + void addAnnotationIfOnlyDbRiderListenerThroughValueArray() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners({DBRiderTestExecutionListener.class}) + public class Sample {} + """, + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + @TestExecutionListeners + public class Sample {} + """ + ) + ); + } + + @Test + void keepAnnotationIfOnlyDbRiderListenerSetAndNonDefaultSetting() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners(value = {DBRiderTestExecutionListener.class}, inheritListeners = false) + public class Sample {} + """, + """ + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + @TestExecutionListeners(inheritListeners = false) + public class Sample {} + """ + ) + ); + } + + @Test + void removeListenerFromOtherListeners() { + rewriteRun( + //language=java + java( + """ + import org.springframework.test.context.TestExecutionListeners; + import org.springframework.test.context.support.DirtiesContextTestExecutionListener; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @TestExecutionListeners(mergeMode = TestExecutionListeners.MergeMode.REPLACE_DEFAULTS, listeners = {DBRiderTestExecutionListener.class, DirtiesContextTestExecutionListener.class}) + public class Sample {} + """, + """ + import org.springframework.test.context.TestExecutionListeners; + import org.springframework.test.context.support.DirtiesContextTestExecutionListener; + import com.github.database.rider.junit5.api.DBRider; + + @DBRider + @TestExecutionListeners(listeners = {DirtiesContextTestExecutionListener.class}) + public class Sample {} + """ + ) + ); + } + + @Test + void doNotTouchIfNoListenerPresent() { + rewriteRun( + //language=java + java( + """ + @Deprecated + public class Sample {} + """ + ) + ); + } + + @Test + void doNotTouchIfDbRiderAlreadyPresent() { + rewriteRun( + //language=java + java( + """ + import com.github.database.rider.junit5.api.DBRider; + import org.springframework.test.context.TestExecutionListeners; + import com.github.database.rider.spring.DBRiderTestExecutionListener; + + @DBRider + @TestExecutionListeners(listeners = {DBRiderTestExecutionListener.class}, inheritListeners = false) + public class Sample {} + """ + ) + ); + } +} diff --git a/src/test/resources/META-INF/rewrite/classpath/rider-spring-1.18.0.jar b/src/test/resources/META-INF/rewrite/classpath/rider-spring-1.18.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..6809b154b4374fff36fdb86b4bcc027caf6d82f5 GIT binary patch literal 7276 zcmbVR1z1$u79ORP92j7vrMsm=LXd6&fuTn_q>&P(q+5^@Md=tsq(eFc0qO4UE_uVn zxYv63y*=MKXU{il{cEp%)?RzUT&NnJ-pExIG z?U-abnweyo#jc>tq^U>aGuBYKlqSk>+RHd3G34R~qCP~Xnw#CW;{(5-YeGr61ftgpbe2#_F2~ zKTDu}kuWiHFm*KigW$QV=TKh+jSUG1Tr4dgOo9v$wS~vo`sI zI`zL%H?TGP265%DX?q$l0B-&p2-Uv^qH^wx8r0rF+{W4g>f%7f&SGR~ zU~iwKI&2MM2MSrM6c1VtD?Lb!b`zI=nV z#df^0CSC%k<*(ksb6Jq7YTu0Cj8EF^)N8s45PUz16Ie23grBfo5@vyb zH>@vw!e^D5DENSqe8-4PL&>ez9z8WYS+SbnPXg=GlP8!+no9E!fV3h69TA-UdYiIw~3oBspog|EymvY-SXyra> zXG~Nv-)Z163+`;c%=9gjTQ1aAiq3)~m<7Hv04)1UG9}Xn0yPp$oPvDL+~~79t`q?~ z{QOk2=;ddaU<=C9Yji^=(%Wi{tPWySe!VT@rqx$zs~=8o@;R#14@en6$56YAB{@j7 z3^(K6KhU*!bP{(O@7(bkm?3=Y*6Ju8S1Z4+s zPgEXVou!je49*mL1rbiyt_okIXOG?2jj*9w@!9OK zM(lxuoXD99P<^ttBq4TPFlj1Xk`qI6M5c=n0DF2;+fLZR5I z{{WAwM0iwj{F|sc56oL)e?`?rAiYwRSHu+sdQ_qX=VZ7a!WbSk0_B4}HuQs0AOoV@ z@s|n(;N5Nk?cfkjp@cdVOOp}) zO{B4ib11Euy1Mx6xe*-N43yptVAjXtj%mhOaujZPA8A}!+4?zXoLd)1iWWs;GC>bT zrdd72)8&%P@*Q^{2KM9WJs)Ha=^CjTJ zLy?|x`b88uy9>op;WV0@uV+!|D843v;!>m$W=dS)10-WwMMwAdBKhUzc#dMRUf>xC ziq!&+ndkcXo-+;3i_QE5^Nn4wC~TC^>u&S_ob#;Lv%hduv7dQEkJGDlT={xgh z6f`bnY%N{5w;j>K@@+O?er7j5yJzrQ+dY_LH22Xifmk`SX+yB**usz+?bPcv>mgzw ztj&i{FeFFnKqF@ZCm8<>j$~*4-F|pr;KO$t@qZH>UjpMi-AK4VjT{}!Y^>$X>>Z%i zP`fYDq7Kmp-NyAqiDZ(;FA_=3xC0BA6faiGilM_7GqpnaMD=QjHRS_`Pj5lOngS}% zsZiyfr0lVvRsONw5x8jGQVf`;zar7GlE^uqwC}z;w?1EedTD~tQ|bknjEX%33qxmF zOb?awpt)w33P&rY27_6+Zz%!!-Y(6{hFn~glBD;uJGWPFpS!bltA{6pNVu?JjzjeKvCGQ2%=TF*yEYssf zS@3SAm`t!3H%v2hoxb!XlZWuIONZ$m{o8zCoH^D*rbj}d%)yIBV)o4g48(Tiats{c zB~l|$oIA5mqZvP~y+CNr;*JlpU5-y>Dj|4<`gM7R<@{zLBq*>3lcS)X#o+APK{P<3 znv~bBr5A}%m}OnHOh^u0|6`2_&DxZ`_wZSEq_N=?+6+>o-c3_bn4P5!@Q#}u+&V4bhL+( zeTPN8EXhd#pfZGhvf3y$$_oQDnDQkeDingGw6Wh?Iom0aj=x+tE`OG)wjId&)DEKO zL4CR;Fi-u#{4m0S@FiioQ6&vql(pOYA~$EHeSEET^sNly3HAqwVK9v+AH#UJ-9R)S zU!{@c91rK*W5otbr_&{nOuX5!U!0D_>w0Tpoo3?RNA5Mob38YOA*0MqA$wykaUhBw zwm@13jneWTX<3*f5_p436>T+$gxvFi%KxT%u7~)&{6Va&K}3aKENZ{57FLSuw#Xg} z^GBG@Bmv5-JI7D9Am&VYk1X6z2DbH(912}51_KvSj_C7TW>*8)5kHOFMDrqdmZ#Dt9V4nDX+G>lIV=j|^ds`oz zj+i{P!!m|{fCM%%I)f4io*w!%pU&`$?-1yO^>xr?-KV1Owy!K32xpQpSI#{7lnaaP_biP6L!-jKnacWiGekQZC25d+t< zN;PO0xnSfkyNEw#pLBgs=9nuZp;khi!v8FZFQ$bwCC*bz+;A&+HxODDtHH+Uz3$?B zO2{1?TOp(GT6?uE2}C&Moq-sQWGMWxz@l&l+%9vMq4P*xIg$0yL_X7SC^a-bcNvt| zv*(KkY?98iS*}TgFg!z|3?v+0#-W>;vJN-~Wb4T+*$ zC!W2#^{fuL5X)e!+xsn&(mYffH2TmkNlC=%?f1!OGF8a?&c>Ec-3_#$w_6w~*b;Ig z9B$Au**sIf;UJqUXV&qqfgF{~QaSz^599oZZTf>oc~}_@IJ7m9nP$sDczmUEL+eC+ zf?JuXypWB<8=8_-*veqZKW6+&MGIJ~iQpf#j6Sr5L#)}NF{+#M-d}4-(}#@yDWs|R za{3IjR@Y{%Us9S(ZH{W(wuGmpbU`q3cKwm*_3;Z`sp)hfC z+QsCak6vT%T0y#f?#Wk|?Nq)$Em3hq9yQBP{ix@ad)(%jaT~F9UMAPQ%?RVidFENN3^iGq&vqe* zK?8Y?lb6wq2CZESp593F-7-`i>dp~N{IGVjh6F;8K5_SwtY%%at&^##JTgjb7bXmu zw~)G3mE1QZ*@>fB!k;!*h+g#?QOY}syTVxuF4}dCiFCXnF)g@<)cqe|qQEXE-`OxX zZxEB*-Q+vKc5No6`gGz&9j|4%^~f7sE0rx`?BQZVHRQpB17QXTVFvl$wCwM7p%Ww( zZTOMkH+_k+O?#th5pHC$_+verRo++|sor7Xy_+y^#SQwl%-%_(ZT1b?le?H+>>C>H zuMKR4PDPsLk*jJ95cH-PN%V*gkU@kl<6*`8AtqaV0)m%YD+WhIm)g}>BR-#es1YjZ zuNh}goqpkMvpJgOszhr=rE%4LirYV6x63_kAiu94=E}&3PSDa0YtcGo_f>#aXky~4 zSyeqxwRt7kTt-rMh!%!d>5^c6z*JfxJt9T+!Yf(Ho9DJgkBLm)%BDpXbB-s`ewO%a zv2mAE%)E3V&St@r+(*?3R`-)Mm^j4?HXLWGdWmKuMhN^K3G5XIE@P}ld+0pC;Won< ze!6pCuf6OOXI;A5cyad|U?yyr;Epjgk*5}CqM>-Shsv<0?VU>suZyfkZjL@d570ty z*=V-Y~O-O5|tm249P7q45?^*{QP(*a%LctbkFGFOKb*p z1H;034bjiy;R>IHB_D>is2wp-s6N){;!CPRKc#r_WP#ct&7c2>Kkuc*TrFb&M8ch} z8(fP1l9eL&Eu)3NbNi7eS2CNVJtYN35FAbP6w$Q zNH1GNlfI5cY*FXzh9DSJjw?G0-Qw#8POcGFTFY^`6TY^Rnb<&_=6(x4KU%O)H}5)(;D0%pcCP0?)prw>k4@o5qb!Qe!!t6paNO| zcNuNd%>w1-s5T9Eyz&K`uY2Xsqz)E*ulz>pSQ$7$t-o;qKMT|UEDWbVST5)fmap^& z^N(c4$`1?-_x}R(7Z~#o4969~ys@Qn$|(8uqssum7{*x2SiFwY#$o>dVoAHb*`KcPF7O>9g{JSeqC&a2{IN5~SbixK;PC#z50yMM{C z1f7YBt6+_-LxK5&s#$g|jcI5TuKuKKG{a6Nk@Kg+r>#0ZoS&=vO-0Vi?FEaPT|A4g zsc3m86v&~|wNtJKIB!keTvo*CrD&NV2aD78KigUp)N@d0Hp~|VC(csjy?e;iLAl~2 zKvZhVSwbs1*sl}C*uSV`tbx~$uvzxumd*|Ogb`*%@fV=2SQir1yVrFg_SmznPRpmR z>1pkF{$kc@-5&1{FjTRxp)gesd-qaO7uevYST`Ocnqi5r++!YcCTmX4Kr1#*o$)t& zAXDKfZ-61lID=Q!iSW%64NPdP7L6 z!E-ibEPF)mw9Gy%qFT|1$FIQ#M#VhMc3t;6tEN#QohRQRHb%M{8n(C@LhdW{kq~OD zIfO74D2~I^15y9jIV7?*SV^Bk7LQ|zzhB7eM7~V-r%8t z$7^D$l?(Ie-E%p@(|(EKukJD-e@7zAgqJxX#3L1)KRN;anj9{u-23;I^c~;})D3>! z`o9)6mmCP&kO#-XsJSGXK8D*Q#NEZ3W|UZy&Qdp&=r zNLR5qje#XYrAhzrtQJjxnu|&MvGbZf$-v@L2l2=n8t-)Q5|yw0v)p2^m0I-3o=IH) zNpHk*Uj?RSmr<%RZ#Z3aE1AwR->CspxozMQoB+Ob85iOAOg7v#cmo1fMbDq#Qpb0- zUo+e1!sji`n-+fmruH|U`#ZwV%*M2Bru+LF{WazJ-Iy9YB!2Z`E~fR%bo@ks z{)qo0YxW)gKKxAlU-ADthxVhvACKGL4Q9fZ+)E?Fe1A9fa{+Q*tz0x9;Owjy z`)@1oYwhy&E&r^1UcG!*z6>V{zAfJiW%#gvTg&_&_Pm<;4lDh?!2Y8S`R@0xtDCP@ z(!7)YZyR4~oxhtp|NHL8od4a_7T*6bOaE}^pF4n(ED}5r0RU|HClm<)XvRPP_8-_e Bm0 Date: Tue, 5 Nov 2024 10:20:37 +0100 Subject: [PATCH 099/118] `assertInstanceOf` not converted from JUnit5 to assertJ (#606) * add test to confirm issue * Add `AssertInstanceOf` support for JUnitToAssertj recipe * Apply suggestions from code review * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Add `AssertInstanceOf` support for JUnitToAssertj recipe * Apply suggestions from code review Co-authored-by: Tim te Beek * Apply suggestions from code review * Apply suggestions from code review * Apply suggestions from code review * Demonstrate that all method invocations are visited, as preconditions apply to file * Call super.visitMethodInvocation first, as is customary unless explicitly needed in a different order * Reduce & fix tests * Update src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Extract constant for ASSERT_INSTANCE_OF_MATCHER * Add multiple returns --------- Co-authored-by: Tim te Beek Co-authored-by: lingenj Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Jacob van Lingen --- .../JUnitAssertInstanceOfToAssertThat.java | 76 ++++++ .../resources/META-INF/rewrite/assertj.yml | 1 + .../assertj/AssertJBestPracticesTest.java | 1 + ...JUnitAssertInstanceOfToAssertThatTest.java | 232 ++++++++++++++++++ 4 files changed, 310 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java create mode 100644 src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThatTest.java diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java new file mode 100644 index 000000000..6a727a403 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java @@ -0,0 +1,76 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.JavaParser; +import org.openrewrite.java.JavaTemplate; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; + +public class JUnitAssertInstanceOfToAssertThat extends Recipe { + + private static final MethodMatcher ASSERT_INSTANCE_OF_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertInstanceOf(..)", true); + + @Override + public String getDisplayName() { + return "JUnit `assertInstanceOf` to AssertJ"; + } + + @Override + public String getDescription() { + return "Convert JUnit-style `assertInstanceOf()` to AssertJ's `assertThat().isInstanceOf()`."; + } + + @Override + public TreeVisitor getVisitor() { + return Preconditions.check(new UsesMethod<>(ASSERT_INSTANCE_OF_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation md = super.visitMethodInvocation(method, ctx); + if (!ASSERT_INSTANCE_OF_MATCHER.matches(md)) { + return md; + } + + maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + Expression expectedType = md.getArguments().get(0); + Expression actualValue = md.getArguments().get(1); + if (md.getArguments().size() == 2) { + return JavaTemplate.builder("assertThat(#{any()}).isInstanceOf(#{any()});") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), method.getCoordinates().replace(), actualValue, expectedType); + } + + Expression messageOrSupplier = md.getArguments().get(2); + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isInstanceOf(#{any()});") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), method.getCoordinates().replace(), actualValue, messageOrSupplier, expectedType); + } + }); + } +} diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index bd979458c..173f603bb 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -466,6 +466,7 @@ recipeList: - org.openrewrite.java.testing.assertj.JUnitAssertTrueToAssertThat - org.openrewrite.java.testing.assertj.JUnitFailToAssertJFail - org.openrewrite.java.testing.assertj.JUnitAssertThrowsToAssertExceptionType + - org.openrewrite.java.testing.assertj.JUnitAssertInstanceOfToAssertThat - org.openrewrite.java.dependencies.AddDependency: groupId: org.assertj artifactId: assertj-core diff --git a/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java index f96060d54..b6c37a621 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java @@ -319,4 +319,5 @@ void test(%2$s x, %2$s y, Object value) { template.formatted(imprt, argumentsType, dedicatedAssertion))); } } + } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThatTest.java b/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThatTest.java new file mode 100644 index 000000000..10579e3c2 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThatTest.java @@ -0,0 +1,232 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.assertj; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class JUnitAssertInstanceOfToAssertThatTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9")) + .recipe(new JUnitAssertInstanceOfToAssertThat()); + } + + @Test + @DocumentExample + void convertsIsInstanceOf() { + rewriteRun( + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertInstanceOf; + + class Test { + void test() { + assertInstanceOf(Integer.class, 4); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Test { + void test() { + assertThat(4).isInstanceOf(Integer.class); + } + } + """ + ) + ); + } + + @Test + void convertsIsInstanceOfWithMessage() { + rewriteRun( + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertInstanceOf; + + class Test { + void test() { + assertInstanceOf(Integer.class, 4, "error message"); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Test { + void test() { + assertThat(4).as("error message").isInstanceOf(Integer.class); + } + } + """ + ) + ); + } + + @Test + void convertsIsInstanceOfWithMessageLambda() { + rewriteRun( + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertInstanceOf; + + class Test { + void test() { + assertInstanceOf(Integer.class, 4, () -> "error message"); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Test { + void test() { + assertThat(4).as(() -> "error message").isInstanceOf(Integer.class); + } + } + """ + ) + ); + } + + @Test + void convertsIsInstanceOfWithMessageMethodReference() { + rewriteRun( + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertInstanceOf; + + class Test { + void test() { + assertInstanceOf(Integer.class, 4, this::getErrorMessage); + } + + String getErrorMessage() { + return "error message"; + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Test { + void test() { + assertThat(4).as(this::getErrorMessage).isInstanceOf(Integer.class); + } + + String getErrorMessage() { + return "error message"; + } + } + """ + ) + ); + } + + @Test + void canBeRerun() { + rewriteRun( + spec -> spec.parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(), "assertj-core-3-*")), + // language=java + java( + """ + import static org.assertj.core.api.Assertions.assertThat; + + class Test { + void test() { + assertThat(4).isInstanceOf(Integer.class); + } + } + """ + ) + ); + } + + @Test + void doesNotConvertAnyOtherMethods() { + rewriteRun( + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertInstanceOf; + import static org.junit.jupiter.api.Assertions.assertTrue; + + class Test { + void test() { + assertInstanceOf(Integer.class, 4); + assertTrue(1 == 1, "Message"); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + import static org.junit.jupiter.api.Assertions.assertTrue; + + class Test { + void test() { + assertThat(4).isInstanceOf(Integer.class); + assertTrue(1 == 1, "Message"); + } + } + """ + ) + ); + } + + @Test + void doesConvertNestedMethodInvocations() { + rewriteRun( + // language=java + java( + """ + import static org.junit.jupiter.api.Assertions.assertInstanceOf; + import static org.junit.jupiter.api.Assertions.assertAll; + + class Test { + void test() { + assertAll(() -> assertInstanceOf(Integer.class, 4)); + } + } + """, + """ + import static org.assertj.core.api.Assertions.assertThat; + import static org.junit.jupiter.api.Assertions.assertAll; + + class Test { + void test() { + assertAll(() -> assertThat(4).isInstanceOf(Integer.class)); + } + } + """ + ) + ); + } +} From 9118a3c6ea88cf483d35b10107a313a364e646e9 Mon Sep 17 00:00:00 2001 From: Jacob van Lingen Date: Tue, 5 Nov 2024 12:54:36 +0100 Subject: [PATCH 100/118] Add `VerifyZeroToNoMoreInteractions` for Mockito 2 (#631) * Add `VerifyZeroToNoMoreInteractions` for Mockito 2 * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Apply suggestions from code review * Apply formatter * Reuse ChangeMethodName, as that also changes the type and additional cases * Fix casing issue in mockito.yml --------- Co-authored-by: lingenj Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../VerifyZeroToNoMoreInteractions.java | 84 +++++++ .../resources/META-INF/rewrite/mockito.yml | 1 + .../VerifyZeroToNoMoreInteractionsTest.java | 214 ++++++++++++++++++ 3 files changed, 299 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractions.java create mode 100644 src/test/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractionsTest.java diff --git a/src/main/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractions.java b/src/main/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractions.java new file mode 100644 index 000000000..2315e88ba --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractions.java @@ -0,0 +1,84 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.jspecify.annotations.Nullable; +import org.openrewrite.*; +import org.openrewrite.java.ChangeMethodName; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.dependencies.DependencyInsight; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.J; + +import java.util.concurrent.atomic.AtomicBoolean; + +public class VerifyZeroToNoMoreInteractions extends ScanningRecipe { + + private static final String VERIFY_ZERO_INTERACTIONS = "org.mockito.Mockito verifyZeroInteractions(..)"; + private static final MethodMatcher ASSERT_INSTANCE_OF_MATCHER = new MethodMatcher(VERIFY_ZERO_INTERACTIONS, true); + + @Override + public String getDisplayName() { + return "Replace `verifyZeroInteractions() to `verifyNoMoreInteractions()"; + } + + @Override + public String getDescription() { + return "Replaces `verifyZeroInteractions()` with `verifyNoMoreInteractions()` in Mockito tests when migration when using a Mockito version < 3.x."; + } + + @Override + public AtomicBoolean getInitialValue(final ExecutionContext ctx) { + return new AtomicBoolean(false); + } + + @Override + public TreeVisitor getScanner(AtomicBoolean usingOlderMockito) { + TreeVisitor div = new DependencyInsight("org.mockito", "mockito-*", "[1.0,3.0)", null).getVisitor(); + return new TreeVisitor() { + @Override + public @Nullable Tree visit(@Nullable Tree tree, ExecutionContext ctx) { + if (!usingOlderMockito.get() && div.visit(tree, ctx) != tree) { + usingOlderMockito.set(true); + } + return tree; + } + }; + } + + @Override + public TreeVisitor getVisitor(AtomicBoolean usingOlderMockito) { + return Preconditions.check(usingOlderMockito.get(), + Preconditions.check(new UsesMethod<>(ASSERT_INSTANCE_OF_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation md = super.visitMethodInvocation(method, ctx); + + if (!ASSERT_INSTANCE_OF_MATCHER.matches(md)) { + return md; + } + + maybeAddImport("org.mockito.Mockito", "verifyNoMoreInteractions"); + maybeRemoveImport("org.mockito.Mockito.verifyZeroInteractions"); + + ChangeMethodName changeMethodName = new ChangeMethodName(VERIFY_ZERO_INTERACTIONS, "verifyNoMoreInteractions", false, false); + return (J.MethodInvocation) changeMethodName.getVisitor().visitNonNull(md, ctx); + } + }) + ); + } +} diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index d1b62eaf2..dc569f5e0 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -132,6 +132,7 @@ recipeList: oldParameterNames: - mode - verification + - org.openrewrite.java.testing.mockito.VerifyZeroToNoMoreInteractions - org.openrewrite.java.ChangeMethodName: methodPattern: org.mockito.Mockito verifyZeroInteractions(..) newMethodName: verifyNoInteractions diff --git a/src/test/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractionsTest.java b/src/test/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractionsTest.java new file mode 100644 index 000000000..6b342323f --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/mockito/VerifyZeroToNoMoreInteractionsTest.java @@ -0,0 +1,214 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.mockito; + +import org.intellij.lang.annotations.Language; +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; +import static org.openrewrite.maven.Assertions.pomXml; + +class VerifyZeroToNoMoreInteractionsTest implements RewriteTest { + + @Language("xml") + private static final String POM_XML_WITH_MOCKITO_2 = """ + + 4.0.0 + bla.bla + bla-bla + 1.0.0 + + + org.mockito + mockito-core + 2.17.0 + test + + + + """; + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "mockito-core-3", "mockito-junit-jupiter-3")) + .recipe(new VerifyZeroToNoMoreInteractions()); + } + + @Test + @DocumentExample + void shouldReplaceToNoMoreInteractions() { + //language=java + rewriteRun( + pomXml(POM_XML_WITH_MOCKITO_2), + java( + """ + import static org.mockito.Mockito.verifyZeroInteractions; + + class MyTest { + void test() { + verifyZeroInteractions(System.out); + } + } + """, + """ + import static org.mockito.Mockito.verifyNoMoreInteractions; + + class MyTest { + void test() { + verifyNoMoreInteractions(System.out); + } + } + """ + ) + ); + } + + @Test + void shouldNotReplaceToNoMoreInteractionsForImportOnly() { + //language=java + rewriteRun( + pomXml(POM_XML_WITH_MOCKITO_2), + java( + """ + import static org.mockito.Mockito.verifyZeroInteractions; + + class MyTest {} + """ + ) + ); + } + + @Test + void doesNotConvertAnyOtherMethods() { + rewriteRun( + pomXml(POM_XML_WITH_MOCKITO_2), + // language=java + java( + """ + import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.Mock; + import static org.mockito.Mockito.verifyZeroInteractions; + import static org.mockito.Mockito.verify; + + class MyTest { + @Mock + Object myObject; + + void test() { + verifyZeroInteractions(System.out); + verify(myObject); + } + } + """, + """ + import org.mockito.junit.jupiter.MockitoExtension; + import org.mockito.Mock; + import static org.mockito.Mockito.verifyNoMoreInteractions; + import static org.mockito.Mockito.verify; + + class MyTest { + @Mock + Object myObject; + + void test() { + verifyNoMoreInteractions(System.out); + verify(myObject); + } + } + """ + ) + ); + } + + @Test + void doesConvertNestedMethodInvocations() { + rewriteRun( + pomXml(POM_XML_WITH_MOCKITO_2), + // language=java + java( + """ + import java.util.function.Consumer; + + import static org.mockito.Mockito.verifyZeroInteractions; + + class MyTest { + void test() { + Runnable f = () -> verifyZeroInteractions(System.out); + f.run(); + } + } + """, + """ + import java.util.function.Consumer; + + import static org.mockito.Mockito.verifyNoMoreInteractions; + + class MyTest { + void test() { + Runnable f = () -> verifyNoMoreInteractions(System.out); + f.run(); + } + } + """ + ) + ); + } + + @Test + void shouldNotRunOnNewerMockito3OrHigher() { + rewriteRun( + //language=xml + pomXml( + """ + + 4.0.0 + bla.bla + bla-bla + 1.0.0 + + + org.mockito + mockito-core + 3.0.0 + test + + + + """), + //language=java + java( + """ + import org.mockito.junit.jupiter.MockitoExtension; + + import static org.mockito.Mockito.verifyZeroInteractions; + + class MyTest { + void test() { + verifyZeroInteractions(System.out); + } + } + """ + ) + ); + } +} From 6d665a0f3e8c10c515fd31716dd189603c49f2b4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 5 Nov 2024 14:00:35 +0100 Subject: [PATCH 101/118] Do not execute Mockito1to4Migration twice in JUnit4to5Migration --- src/main/resources/META-INF/rewrite/junit5.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index 4cbe3fe26..b4a71a983 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -129,7 +129,6 @@ recipeList: onlyIfUsing: org.junit.jupiter.params.ParameterizedTest acceptTransitive: true scope: test - - org.openrewrite.java.testing.mockito.Mockito1to4Migration - org.openrewrite.maven.UpgradePluginVersion: groupId: org.apache.maven.plugins artifactId: maven-surefire-plugin From 671addcda3325aeeca3335f736bbce701178212a Mon Sep 17 00:00:00 2001 From: Adam Birem Date: Tue, 5 Nov 2024 17:26:57 +0100 Subject: [PATCH 102/118] Added handling of org.mockito.Mockito.eq(..) when simplifying mockito matchers (#635) * Add test case for issue https://github.com/openrewrite/rewrite-testing-frameworks/issues/634 * Add handling of org.mockito.Mockito.eq * Apply formatter to minimize diff * Add issue reference to document the change --------- Co-authored-by: Tim te Beek --- .../SimplifyMockitoVerifyWhenGiven.java | 50 +++++++------- .../SimplifyMockitoVerifyWhenGivenTest.java | 67 ++++++++++++++----- 2 files changed, 77 insertions(+), 40 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java b/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java index 76260a777..e837aa9be 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGiven.java @@ -39,6 +39,7 @@ public class SimplifyMockitoVerifyWhenGiven extends Recipe { private static final MethodMatcher VERIFY_MATCHER = new MethodMatcher("org.mockito.Mockito verify(..)"); private static final MethodMatcher STUBBER_MATCHER = new MethodMatcher("org.mockito.stubbing.Stubber when(..)"); private static final MethodMatcher EQ_MATCHER = new MethodMatcher("org.mockito.ArgumentMatchers eq(..)"); + private static final MethodMatcher MOCKITO_EQ_MATCHER = new MethodMatcher("org.mockito.Mockito eq(..)"); @Override public String getDisplayName() { @@ -57,32 +58,35 @@ public Set getTags() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesMethod<>(EQ_MATCHER), new JavaIsoVisitor() { - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { - J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); + return Preconditions.check(Preconditions.or(new UsesMethod<>(EQ_MATCHER), new UsesMethod<>(MOCKITO_EQ_MATCHER)), + new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); - if ((WHEN_MATCHER.matches(mi) || GIVEN_MATCHER.matches(mi)) && mi.getArguments().get(0) instanceof J.MethodInvocation) { - List updatedArguments = new ArrayList<>(mi.getArguments()); - updatedArguments.set(0, checkAndUpdateEq((J.MethodInvocation) mi.getArguments().get(0))); - mi = mi.withArguments(updatedArguments); - } else if (VERIFY_MATCHER.matches(mi.getSelect()) || - STUBBER_MATCHER.matches(mi.getSelect())) { - mi = checkAndUpdateEq(mi); - } + if ((WHEN_MATCHER.matches(mi) || GIVEN_MATCHER.matches(mi)) && mi.getArguments().get(0) instanceof J.MethodInvocation) { + List updatedArguments = new ArrayList<>(mi.getArguments()); + updatedArguments.set(0, checkAndUpdateEq((J.MethodInvocation) mi.getArguments().get(0))); + mi = mi.withArguments(updatedArguments); + } else if (VERIFY_MATCHER.matches(mi.getSelect()) || + STUBBER_MATCHER.matches(mi.getSelect())) { + mi = checkAndUpdateEq(mi); + } - maybeRemoveImport("org.mockito.ArgumentMatchers.eq"); - return mi; - } + maybeRemoveImport("org.mockito.ArgumentMatchers.eq"); + maybeRemoveImport("org.mockito.Mockito.eq"); + return mi; + } - private J.MethodInvocation checkAndUpdateEq(J.MethodInvocation methodInvocation) { - if (methodInvocation.getArguments().stream().allMatch(EQ_MATCHER::matches)) { - return methodInvocation.withArguments(ListUtils.map(methodInvocation.getArguments(), invocation -> - ((MethodCall) invocation).getArguments().get(0).withPrefix(invocation.getPrefix()))); - } - return methodInvocation; - } - }); + private J.MethodInvocation checkAndUpdateEq(J.MethodInvocation methodInvocation) { + if (methodInvocation.getArguments().stream().allMatch(arg -> EQ_MATCHER.matches(arg) || + MOCKITO_EQ_MATCHER.matches(arg))) { + return methodInvocation.withArguments(ListUtils.map(methodInvocation.getArguments(), invocation -> + ((MethodCall) invocation).getArguments().get(0).withPrefix(invocation.getPrefix()))); + } + return methodInvocation; + } + }); } } diff --git a/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java b/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java index 69815db02..baa688cdf 100644 --- a/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java +++ b/src/test/java/org/openrewrite/java/testing/mockito/SimplifyMockitoVerifyWhenGivenTest.java @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -42,7 +43,7 @@ void shouldRemoveUnneccesaryEqFromVerify() { import static org.mockito.Mockito.verify; import static org.mockito.Mockito.mock; import static org.mockito.ArgumentMatchers.eq; - + class Test { void test() { var mockString = mock(String.class); @@ -52,7 +53,39 @@ void test() { """, """ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.mock; - + + class Test { + void test() { + var mockString = mock(String.class); + verify(mockString).replace("foo", "bar"); + } + } + """ + ) + ); + } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/634") + void shouldRemoveUnneccesaryEqFromVerify_withMockitoStarImport() { + rewriteRun( + //language=Java + java( + """ + import static org.mockito.Mockito.eq; + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.verify; + + class Test { + void test() { + var mockString = mock(String.class); + verify(mockString).replace(eq("foo"), eq("bar")); + } + } + """, """ + import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.verify; + class Test { void test() { var mockString = mock(String.class); @@ -73,7 +106,7 @@ void shouldRemoveUnneccesaryEqFromWhen() { import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.eq; - + class Test { void test() { var mockString = mock(String.class); @@ -83,7 +116,7 @@ void test() { """, """ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - + class Test { void test() { var mockString = mock(String.class); @@ -105,7 +138,7 @@ void shouldNotRemoveEqWhenMatchersAreMixed() { import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.anyString; - + class Test { void test() { var mockString = mock(String.class); @@ -125,7 +158,7 @@ void shouldRemoveUnneccesaryEqFromStubber() { """ import static org.mockito.Mockito.doThrow; import static org.mockito.ArgumentMatchers.eq; - + class Test { void test() { doThrow(new RuntimeException()).when("foo").substring(eq(1)); @@ -133,7 +166,7 @@ void test() { } """, """ import static org.mockito.Mockito.doThrow; - + class Test { void test() { doThrow(new RuntimeException()).when("foo").substring(1); @@ -152,7 +185,7 @@ void shouldRemoveUnneccesaryEqFromBDDGiven() { """ import static org.mockito.BDDMockito.given; import static org.mockito.ArgumentMatchers.eq; - + class Test { void test() { given("foo".substring(eq(1))); @@ -160,7 +193,7 @@ void test() { } """, """ import static org.mockito.BDDMockito.given; - + class Test { void test() { given("foo".substring(1)); @@ -181,13 +214,13 @@ void shouldNotRemoveEqImportWhenStillNeeded() { import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.anyString; - + class Test { void testRemoveEq() { var mockString = mock(String.class); when(mockString.replace(eq("foo"), eq("bar"))).thenReturn("bar"); } - + void testKeepEq() { var mockString = mock(String.class); when(mockString.replace(eq("foo"), anyString())).thenReturn("bar"); @@ -198,13 +231,13 @@ void testKeepEq() { import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.anyString; - + class Test { void testRemoveEq() { var mockString = mock(String.class); when(mockString.replace("foo", "bar")).thenReturn("bar"); } - + void testKeepEq() { var mockString = mock(String.class); when(mockString.replace(eq("foo"), anyString())).thenReturn("bar"); @@ -227,7 +260,7 @@ void shouldFixSonarExamples() { import static org.mockito.Mockito.doThrow; import static org.mockito.BDDMockito.given; import static org.mockito.ArgumentMatchers.eq; - + class Test { void test(Object v1, Object v2, Object v3, Object v4, Object v5, Foo foo) { given(foo.bar(eq(v1), eq(v2), eq(v3))).willReturn(null); @@ -236,7 +269,7 @@ void test(Object v1, Object v2, Object v3, Object v4, Object v5, Foo foo) { verify(foo).bar(eq(v1), eq(v2), eq(v3)); } } - + class Foo { Object bar(Object v1, Object v2, Object v3) { return null; } String baz(Object v4, Object v5) { return ""; } @@ -248,7 +281,7 @@ void quux(int x) {} import static org.mockito.Mockito.verify; import static org.mockito.Mockito.doThrow; import static org.mockito.BDDMockito.given; - + class Test { void test(Object v1, Object v2, Object v3, Object v4, Object v5, Foo foo) { given(foo.bar(v1, v2, v3)).willReturn(null); @@ -257,7 +290,7 @@ void test(Object v1, Object v2, Object v3, Object v4, Object v5, Foo foo) { verify(foo).bar(v1, v2, v3); } } - + class Foo { Object bar(Object v1, Object v2, Object v3) { return null; } String baz(Object v4, Object v5) { return ""; } From 909f0ebbc5f5ad3f599476306efcd3af0476ff09 Mon Sep 17 00:00:00 2001 From: Jacob van Lingen Date: Tue, 5 Nov 2024 17:34:10 +0100 Subject: [PATCH 103/118] Update AssertJ recipes to current recipe code style (#633) * Update AssertJ recipes to current recipe code style * Apply formatter and remove unused imports * Apply suggestions from code review --------- Co-authored-by: Tim te Beek --- .../AdoptAssertJDurationAssertions.java | 369 +++++++++--------- .../JUnitAssertArrayEqualsToAssertThat.java | 156 ++++---- .../JUnitAssertEqualsToAssertThat.java | 156 +++----- .../assertj/JUnitAssertFalseToAssertThat.java | 85 ++-- .../JUnitAssertInstanceOfToAssertThat.java | 18 +- .../JUnitAssertNotEqualsToAssertThat.java | 163 +++----- .../JUnitAssertNotNullToAssertThat.java | 88 ++--- .../assertj/JUnitAssertNullToAssertThat.java | 86 ++-- .../assertj/JUnitAssertSameToAssertThat.java | 90 ++--- ...UnitAssertThrowsToAssertExceptionType.java | 70 ++-- .../assertj/JUnitAssertTrueToAssertThat.java | 87 ++--- .../assertj/JUnitFailToAssertJFail.java | 162 +++----- .../assertj/SimplifyAssertJAssertion.java | 54 ++- .../SimplifyChainedAssertJAssertion.java | 165 ++++---- ...AssertThrowsToAssertExceptionTypeTest.java | 11 +- 15 files changed, 719 insertions(+), 1041 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/assertj/AdoptAssertJDurationAssertions.java b/src/main/java/org/openrewrite/java/testing/assertj/AdoptAssertJDurationAssertions.java index ef26a84bd..b84ca6133 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/AdoptAssertJDurationAssertions.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/AdoptAssertJDurationAssertions.java @@ -32,17 +32,48 @@ import java.util.*; -public class AdoptAssertJDurationAssertions extends Recipe { - - static final String DURATION_ASSERT_HAS_LONG = "org.assertj.core.api.AbstractDurationAssert has*(long)"; +import static org.openrewrite.Preconditions.or; - static final String INTEGER_ASSERT_IS_EQUAL_TO = "org.assertj.core.api.AbstractIntegerAssert isEqualTo(..)"; - static final String INTEGER_ASSERT_IS_GREATER_THAN = "org.assertj.core.api.AbstractIntegerAssert isGreaterThan(..)"; - static final String INTEGER_ASSERT_IS_LESS_THAN = "org.assertj.core.api.AbstractIntegerAssert isLessThan(..)"; +public class AdoptAssertJDurationAssertions extends Recipe { - static final String LONG_ASSERT_IS_LESS_THAN = "org.assertj.core.api.AbstractLongAssert isLessThan(..)"; - static final String LONG_ASSERT_IS_GREATER_THAN = "org.assertj.core.api.AbstractLongAssert isGreaterThan(..)"; - static final String LONG_ASSERT_IS_EQUAL_TO = "org.assertj.core.api.AbstractLongAssert isEqualTo(..)"; + private static final String DURATION_ASSERT_HAS_LONG = "org.assertj.core.api.AbstractDurationAssert has*(long)"; + private static final String INTEGER_ASSERT_IS_EQUAL_TO = "org.assertj.core.api.AbstractIntegerAssert isEqualTo(..)"; + private static final String INTEGER_ASSERT_IS_GREATER_THAN = "org.assertj.core.api.AbstractIntegerAssert isGreaterThan(..)"; + private static final String INTEGER_ASSERT_IS_LESS_THAN = "org.assertj.core.api.AbstractIntegerAssert isLessThan(..)"; + private static final String LONG_ASSERT_IS_LESS_THAN = "org.assertj.core.api.AbstractLongAssert isLessThan(..)"; + private static final String LONG_ASSERT_IS_GREATER_THAN = "org.assertj.core.api.AbstractLongAssert isGreaterThan(..)"; + private static final String LONG_ASSERT_IS_EQUAL_TO = "org.assertj.core.api.AbstractLongAssert isEqualTo(..)"; + + private static final MethodMatcher ASSERT_THAT_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); + private static final MethodMatcher GET_NANO_MATCHER = new MethodMatcher("java.time.Duration getNano()"); + private static final MethodMatcher GET_SECONDS_MATCHER = new MethodMatcher("java.time.Duration getSeconds()"); + private static final MethodMatcher AS_MATCHER = new MethodMatcher("org.assertj.core.api.AbstractObjectAssert as(..)"); + private static final MethodMatcher TIME_UNIT_MATCHERS = new MethodMatcher(DURATION_ASSERT_HAS_LONG, true); + + private static final List IS_MATCHERS = Arrays.asList( + new MethodMatcher(INTEGER_ASSERT_IS_EQUAL_TO, true), + new MethodMatcher(INTEGER_ASSERT_IS_GREATER_THAN, true), + new MethodMatcher(INTEGER_ASSERT_IS_LESS_THAN, true), + + new MethodMatcher(LONG_ASSERT_IS_EQUAL_TO, true), + new MethodMatcher(LONG_ASSERT_IS_GREATER_THAN, true), + new MethodMatcher(LONG_ASSERT_IS_LESS_THAN, true) + ); + + private static final Map METHOD_MAP = new HashMap() {{ + put("getSeconds", "hasSeconds"); + put("getNano", "hasNanos"); + + put("hasNanos", "hasMillis"); + put("hasMillis", "hasSeconds"); + put("hasSeconds", "hasMinutes"); + put("hasMinutes", "hasHours"); + put("hasHours", "hasDays"); + + put("isGreaterThan", "isPositive"); + put("isLessThan", "isNegative"); + put("isEqualTo", "isZero"); + }}; @Override public String getDisplayName() { @@ -56,190 +87,156 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(Preconditions.or( + return Preconditions.check( + or( new UsesMethod<>(DURATION_ASSERT_HAS_LONG, true), - new UsesMethod<>(INTEGER_ASSERT_IS_EQUAL_TO, true), new UsesMethod<>(INTEGER_ASSERT_IS_GREATER_THAN, true), new UsesMethod<>(INTEGER_ASSERT_IS_LESS_THAN, true), - new UsesMethod<>(LONG_ASSERT_IS_EQUAL_TO, true), new UsesMethod<>(LONG_ASSERT_IS_GREATER_THAN, true), new UsesMethod<>(LONG_ASSERT_IS_LESS_THAN, true) - ), new AdoptAssertJDurationAssertionsVisitor() - ); - } - - @SuppressWarnings("DataFlowIssue") - private static class AdoptAssertJDurationAssertionsVisitor extends JavaIsoVisitor { - private static final MethodMatcher ASSERT_THAT_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); - private static final MethodMatcher GET_NANO_MATCHER = new MethodMatcher("java.time.Duration getNano()"); - private static final MethodMatcher GET_SECONDS_MATCHER = new MethodMatcher("java.time.Duration getSeconds()"); - private static final MethodMatcher AS_MATCHER = new MethodMatcher("org.assertj.core.api.AbstractObjectAssert as(..)"); - private static final MethodMatcher TIME_UNIT_MATCHERS = new MethodMatcher(DURATION_ASSERT_HAS_LONG, true); - private static final List IS_MATCHERS = Arrays.asList( - new MethodMatcher(INTEGER_ASSERT_IS_EQUAL_TO, true), - new MethodMatcher(INTEGER_ASSERT_IS_GREATER_THAN, true), - new MethodMatcher(INTEGER_ASSERT_IS_LESS_THAN, true), - - new MethodMatcher(LONG_ASSERT_IS_EQUAL_TO, true), - new MethodMatcher(LONG_ASSERT_IS_GREATER_THAN, true), - new MethodMatcher(LONG_ASSERT_IS_LESS_THAN, true) - ); - private static final Map METHOD_MAP = new HashMap() {{ - put("getSeconds", "hasSeconds"); - put("getNano", "hasNanos"); - - put("hasNanos", "hasMillis"); - put("hasMillis", "hasSeconds"); - put("hasSeconds", "hasMinutes"); - put("hasMinutes", "hasHours"); - put("hasHours", "hasDays"); - - put("isGreaterThan", "isPositive"); - put("isLessThan", "isNegative"); - put("isEqualTo", "isZero"); - }}; - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); - if (TIME_UNIT_MATCHERS.matches(mi)) { - return simplifyTimeUnits(mi, ctx); - } else if (IS_MATCHERS.stream().anyMatch(matcher -> matcher.matches(mi))) { - return simplifyMultipleAssertions(mi, ctx); - } - return mi; - } - - private J.MethodInvocation simplifyMultipleAssertions(J.MethodInvocation m, ExecutionContext ctx) { - Expression isEqualToArg = m.getArguments().get(0); - Expression select = m.getSelect(); - List templateParameters = new ArrayList<>(); - templateParameters.add(null); - Expression asDescription = null; - - if (AS_MATCHER.matches(select)) { - asDescription = ((J.MethodInvocation) select).getArguments().get(0); - select = ((J.MethodInvocation) select).getSelect(); - templateParameters.add(asDescription); - } - - if (!ASSERT_THAT_MATCHER.matches(select)) { - return m; - } - - Expression assertThatArgumentExpr = ((J.MethodInvocation) select).getArguments().get(0); - if (!(assertThatArgumentExpr instanceof J.MethodInvocation)) { - return m; - } - J.MethodInvocation assertThatArg = (J.MethodInvocation) assertThatArgumentExpr; - - if (isZero(isEqualToArg) && checkIfRelatedToDuration(assertThatArg)) { - String formatted_template = formatTemplate("assertThat(#{any()}).%s();", m.getSimpleName(), asDescription); - templateParameters.set(0, assertThatArg); - return applyTemplate(ctx, m, formatted_template, templateParameters.toArray()); - } - - if (GET_NANO_MATCHER.matches(assertThatArg) || GET_SECONDS_MATCHER.matches(assertThatArg)) { - Expression assertThatArgSelect = assertThatArg.getSelect(); - String methodName = assertThatArg.getSimpleName(); - String formatted_template = formatTemplate("assertThat(#{any()}).%s(#{any()});", methodName, asDescription); - templateParameters.set(0, assertThatArgSelect); - templateParameters.add(isEqualToArg); - - return applyTemplate(ctx, m, formatted_template, templateParameters.toArray()); - } - - return m; - } - - private boolean isZero(Expression isEqualToArg) { - if (isEqualToArg instanceof J.Literal) { - J.Literal literal = (J.Literal) isEqualToArg; - return literal.getValue() instanceof Number && ((Number) literal.getValue()).longValue() == 0; - } - return false; - } - - private J.MethodInvocation simplifyTimeUnits(J.MethodInvocation m, ExecutionContext ctx) { - Expression arg = m.getArguments().get(0); - Long argValue = SimplifyDurationCreationUnits.getConstantIntegralValue(arg); - if (argValue == null) { - return m; - } - - List unitInfo = getUnitInfo(m.getSimpleName(), Math.toIntExact(argValue)); - String methodName = (String) unitInfo.get(0); - int methodArg = (int) unitInfo.get(1); - if (!(m.getSimpleName().equals(methodName))) { - // update method invocation with new name and arg - String template = String.format("#{any()}.%s(%d)", methodName, methodArg); - return applyTemplate(ctx, m, template, m.getSelect()); - } - - return m; - } - - private static List getUnitInfo(String name, int argValue) { - final int timeLength; - if (name.equals("hasSeconds") || name.equals("hasMinutes")) { - timeLength = 60; - } else if (name.equals("hasNanos") || name.equals("hasMillis")) { - timeLength = 1000; - } else if (name.equals("hasHours")) { - timeLength = 24; - } else { - return Arrays.asList(name, argValue); - } - - if (argValue % timeLength == 0) { - String newName = METHOD_MAP.get(name); - return getUnitInfo(newName, argValue / timeLength); - } else { - // returning name, newArg - return Arrays.asList(name, argValue); - } - } - - private J.MethodInvocation applyTemplate(ExecutionContext ctx, J.MethodInvocation m, String template, Object... parameters) { - J.MethodInvocation invocation = JavaTemplate.builder(template) - .contextSensitive() - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) - .build() - .apply(getCursor(), m.getCoordinates().replace(), parameters); - - // retain whitespace formatting - if (invocation.getPadding().getSelect() != null && m.getPadding().getSelect() != null) { - return invocation.getPadding() - .withSelect( - invocation.getPadding().getSelect() - .withAfter(m.getPadding().getSelect().getAfter()) - ); - } - return invocation; - } - - private boolean checkIfRelatedToDuration(J.MethodInvocation argument) { - // assertThat(.).isEqual(0) - if (argument.getSelect() != null) { - if (argument.getSelect() instanceof J.MethodInvocation) { - J.MethodInvocation selectMethod = (J.MethodInvocation) argument.getSelect(); - return TypeUtils.isOfType(selectMethod.getType(), JavaType.buildType("java.time.Duration")); + ), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (TIME_UNIT_MATCHERS.matches(mi)) { + return simplifyTimeUnits(mi, ctx); + } else if (IS_MATCHERS.stream().anyMatch(matcher -> matcher.matches(mi))) { + return simplifyMultipleAssertions(mi, ctx); + } + return mi; + } + + private J.MethodInvocation simplifyMultipleAssertions(J.MethodInvocation m, ExecutionContext ctx) { + Expression isEqualToArg = m.getArguments().get(0); + Expression select = m.getSelect(); + List templateParameters = new ArrayList<>(); + templateParameters.add(null); + Expression asDescription = null; + + if (AS_MATCHER.matches(select)) { + asDescription = ((J.MethodInvocation) select).getArguments().get(0); + select = ((J.MethodInvocation) select).getSelect(); + templateParameters.add(asDescription); + } + + if (!ASSERT_THAT_MATCHER.matches(select)) { + return m; + } + + Expression assertThatArgumentExpr = ((J.MethodInvocation) select).getArguments().get(0); + if (!(assertThatArgumentExpr instanceof J.MethodInvocation)) { + return m; + } + J.MethodInvocation assertThatArg = (J.MethodInvocation) assertThatArgumentExpr; + + if (isZero(isEqualToArg) && checkIfRelatedToDuration(assertThatArg)) { + String formatted_template = formatTemplate("assertThat(#{any()}).%s();", m.getSimpleName(), asDescription); + templateParameters.set(0, assertThatArg); + return applyTemplate(ctx, m, formatted_template, templateParameters.toArray()); + } + + if (GET_NANO_MATCHER.matches(assertThatArg) || GET_SECONDS_MATCHER.matches(assertThatArg)) { + Expression assertThatArgSelect = assertThatArg.getSelect(); + String methodName = assertThatArg.getSimpleName(); + String formatted_template = formatTemplate("assertThat(#{any()}).%s(#{any()});", methodName, asDescription); + templateParameters.set(0, assertThatArgSelect); + templateParameters.add(isEqualToArg); + + return applyTemplate(ctx, m, formatted_template, templateParameters.toArray()); + } + + return m; + } + + private boolean isZero(Expression isEqualToArg) { + if (isEqualToArg instanceof J.Literal) { + J.Literal literal = (J.Literal) isEqualToArg; + return literal.getValue() instanceof Number && ((Number) literal.getValue()).longValue() == 0; + } + return false; + } + + private J.MethodInvocation simplifyTimeUnits(J.MethodInvocation m, ExecutionContext ctx) { + Expression arg = m.getArguments().get(0); + Long argValue = SimplifyDurationCreationUnits.getConstantIntegralValue(arg); + if (argValue == null) { + return m; + } + + List unitInfo = getUnitInfo(m.getSimpleName(), Math.toIntExact(argValue)); + String methodName = (String) unitInfo.get(0); + int methodArg = (int) unitInfo.get(1); + if (!(m.getSimpleName().equals(methodName))) { + // update method invocation with new name and arg + String template = String.format("#{any()}.%s(%d)", methodName, methodArg); + return applyTemplate(ctx, m, template, m.getSelect()); + } + + return m; + } + + private List getUnitInfo(String name, int argValue) { + final int timeLength; + if (name.equals("hasSeconds") || name.equals("hasMinutes")) { + timeLength = 60; + } else if (name.equals("hasNanos") || name.equals("hasMillis")) { + timeLength = 1000; + } else if (name.equals("hasHours")) { + timeLength = 24; + } else { + return Arrays.asList(name, argValue); + } + + if (argValue % timeLength == 0) { + String newName = METHOD_MAP.get(name); + return getUnitInfo(newName, argValue / timeLength); + } else { + // returning name, newArg + return Arrays.asList(name, argValue); + } + } + + private J.MethodInvocation applyTemplate(ExecutionContext ctx, J.MethodInvocation m, String template, Object... parameters) { + J.MethodInvocation invocation = JavaTemplate.builder(template) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), m.getCoordinates().replace(), parameters); + + // retain whitespace formatting + if (invocation.getPadding().getSelect() != null && m.getPadding().getSelect() != null) { + return invocation.getPadding() + .withSelect( + invocation.getPadding().getSelect() + .withAfter(m.getPadding().getSelect().getAfter()) + ); + } + return invocation; + } + + private boolean checkIfRelatedToDuration(J.MethodInvocation argument) { + if (argument.getSelect() != null) { + if (argument.getSelect() instanceof J.MethodInvocation) { + J.MethodInvocation selectMethod = (J.MethodInvocation) argument.getSelect(); + return TypeUtils.isOfType(selectMethod.getType(), JavaType.buildType("java.time.Duration")); + } + } + return false; + } + + @SuppressWarnings("ConstantValue") + private String formatTemplate(String template, String methodName, Object asDescriptionArg) { + String replacementMethod = METHOD_MAP.get(methodName); + if (asDescriptionArg == null) { + return String.format(template, replacementMethod); + } + StringBuilder newTemplate = new StringBuilder(template); + newTemplate.insert(newTemplate.indexOf(").") + 1, ".as(#{any()})"); + return String.format(newTemplate.toString(), replacementMethod); + } } - } - return false; - } - - @SuppressWarnings("ConstantValue") - private String formatTemplate(String template, String methodName, Object asDescriptionArg) { - String replacementMethod = METHOD_MAP.get(methodName); - if (asDescriptionArg == null) { - return String.format(template, replacementMethod); - } - StringBuilder newTemplate = new StringBuilder(template); - newTemplate.insert(newTemplate.indexOf(").") + 1, ".as(#{any()})"); - return String.format(newTemplate.toString(), replacementMethod); - } + ); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertArrayEqualsToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertArrayEqualsToAssertThat.java index ecdde2479..2c636e98f 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertArrayEqualsToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertArrayEqualsToAssertThat.java @@ -23,7 +23,7 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; @@ -32,11 +32,14 @@ import java.util.List; public class JUnitAssertArrayEqualsToAssertThat extends Recipe { - private static final String JUNIT_QUALIFIED_ASSERTIONS_CLASS_NAME = "org.junit.jupiter.api.Assertions"; + + private static final String JUNIT = "org.junit.jupiter.api.Assertions"; + private static final String ASSERTJ = "org.assertj.core.api.Assertions"; + private static final MethodMatcher ASSERT_ARRAY_EQUALS_MATCHER = new MethodMatcher(JUNIT + " assertArrayEquals(..)", true); @Override public String getDisplayName() { - return "JUnit `assertArrayEquals` To AssertJ"; + return "JUnit `assertArrayEquals` to assertJ"; } @Override @@ -46,93 +49,72 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>(JUNIT_QUALIFIED_ASSERTIONS_CLASS_NAME, false), new AssertArrayEqualsToAssertThatVisitor()); - } - - public static class AssertArrayEqualsToAssertThatVisitor extends JavaIsoVisitor { - private static final MethodMatcher JUNIT_ASSERT_EQUALS = new MethodMatcher(JUNIT_QUALIFIED_ASSERTIONS_CLASS_NAME + " assertArrayEquals(..)"); - - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_EQUALS.matches(method)) { - return method; - } - - List args = method.getArguments(); - Expression expected = args.get(0); - Expression actual = args.get(1); - - // Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - maybeRemoveImport(JUNIT_QUALIFIED_ASSERTIONS_CLASS_NAME); - - if (args.size() == 2) { - return JavaTemplate.builder("assertThat(#{anyArray()}).containsExactly(#{anyArray()});") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply(getCursor(), method.getCoordinates().replace(), actual, expected); - } else if (args.size() == 3 && !isFloatingPointType(args.get(2))) { - Expression message = args.get(2); - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{anyArray()}).as(#{any(String)}).containsExactly(#{anyArray()});") : - JavaTemplate.builder("assertThat(#{anyArray()}).as(#{any(java.util.function.Supplier)}).containsExactly(#{anyArray()});"); - return template - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply(getCursor(), method.getCoordinates().replace(), actual, message, expected); - } else if (args.size() == 3) { - maybeAddImport("org.assertj.core.api.Assertions", "within", false); - // assert is using floating points with a delta and no message. - return JavaTemplate.builder("assertThat(#{anyArray()}).containsExactly(#{anyArray()}, within(#{any()}));") - .staticImports("org.assertj.core.api.Assertions.assertThat", "org.assertj.core.api.Assertions.within") - .javaParser(assertionsParser(ctx)) + return Preconditions.check(new UsesMethod<>(ASSERT_ARRAY_EQUALS_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation md = super.visitMethodInvocation(method, ctx); + if (!ASSERT_ARRAY_EQUALS_MATCHER.matches(md)) { + return md; + } + + maybeAddImport(ASSERTJ, "assertThat", false); + maybeRemoveImport(JUNIT); + + List args = md.getArguments(); + Expression expected = args.get(0); + Expression actual = args.get(1); + if (args.size() == 2) { + return JavaTemplate.builder("assertThat(#{anyArray()}).containsExactly(#{anyArray()});") + .staticImports(ASSERTJ + ".assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), md.getCoordinates().replace(), actual, expected); + } + if (args.size() == 3 && isFloatingPointType(args.get(2))) { + maybeAddImport(ASSERTJ, "within", false); + // assert is using floating points with a delta and no message. + return JavaTemplate.builder("assertThat(#{anyArray()}).containsExactly(#{anyArray()}, within(#{any()}));") + .staticImports(ASSERTJ + ".assertThat", ASSERTJ + ".within") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), md.getCoordinates().replace(), actual, expected, args.get(2)); + } + if (args.size() == 3) { + Expression message = args.get(2); + return JavaTemplate.builder("assertThat(#{anyArray()}).as(#{any()}).containsExactly(#{anyArray()});") + .staticImports(ASSERTJ + ".assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), md.getCoordinates().replace(), actual, message, expected); + } + + maybeAddImport(ASSERTJ, "within", false); + + // The assertEquals is using a floating point with a delta argument and a message. + Expression message = args.get(3); + return JavaTemplate.builder("assertThat(#{anyArray()}).as(#{any()}).containsExactly(#{anyArray()}, within(#{}));") + .staticImports(ASSERTJ + ".assertThat", ASSERTJ + ".within") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply(getCursor(), method.getCoordinates().replace(), actual, expected, args.get(2)); + .apply(getCursor(), md.getCoordinates().replace(), actual, message, expected, args.get(2)); } - // The assertEquals is using a floating point with a delta argument and a message. - Expression message = args.get(3); - maybeAddImport("org.assertj.core.api.Assertions", "within", false); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{anyArray()}).as(#{any(String)}).containsExactly(#{anyArray()}, within(#{any()}));") : - JavaTemplate.builder("assertThat(#{anyArray()}).as(#{any(java.util.function.Supplier)}).containsExactly(#{anyArray()}, within(#{}));"); - return template - .staticImports("org.assertj.core.api.Assertions.assertThat", "org.assertj.core.api.Assertions.within") - .javaParser(assertionsParser(ctx)) - .build() - .apply(getCursor(), method.getCoordinates().replace(), actual, message, expected, args.get(2)); - } - - /** - * Returns true if the expression's type is either a primitive float/double or their object forms Float/Double - * - * @param expression The expression parsed from the original AST. - * @return true if the type is a floating point number. - */ - private static boolean isFloatingPointType(Expression expression) { - - JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(expression.getType()); - if (fullyQualified != null) { - String typeName = fullyQualified.getFullyQualifiedName(); - return "java.lang.Double".equals(typeName) || "java.lang.Float".equals(typeName); + /** + * Returns true if the expression's type is either a primitive float/double or their object forms Float/Double + * + * @param expression The expression parsed from the original AST. + * @return true if the type is a floating point number. + */ + private boolean isFloatingPointType(Expression expression) { + JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(expression.getType()); + if (fullyQualified != null) { + String typeName = fullyQualified.getFullyQualifiedName(); + return "java.lang.Double".equals(typeName) || "java.lang.Float".equals(typeName); + } + + JavaType.Primitive parameterType = TypeUtils.asPrimitive(expression.getType()); + return parameterType == JavaType.Primitive.Double || parameterType == JavaType.Primitive.Float; } - - JavaType.Primitive parameterType = TypeUtils.asPrimitive(expression.getType()); - return parameterType == JavaType.Primitive.Double || parameterType == JavaType.Primitive.Float; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertEqualsToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertEqualsToAssertThat.java index 276c3870d..cbfad48c2 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertEqualsToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertEqualsToAssertThat.java @@ -23,7 +23,7 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; @@ -33,6 +33,10 @@ public class JUnitAssertEqualsToAssertThat extends Recipe { + private static final String JUNIT = "org.junit.jupiter.api.Assertions"; + private static final String ASSERTJ = "org.assertj.core.api.Assertions"; + private static final MethodMatcher ASSERT_EQUALS_MATCHER = new MethodMatcher(JUNIT + " assertEquals(..)", true); + @Override public String getDisplayName() { return "JUnit `assertEquals` to AssertJ"; @@ -45,105 +49,67 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertEqualsToAssertThatVisitor()); - } - - public static class AssertEqualsToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_EQUALS = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertEquals(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_EQUALS.matches(method)) { - return method; - } - - List args = method.getArguments(); - Expression expected = args.get(0); - Expression actual = args.get(1); - - //always add the import (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - // Remove import for "org.junit.jupiter.api.Assertions" if no longer used. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); - - if (args.size() == 2) { - return JavaTemplate.builder("assertThat(#{any()}).isEqualTo(#{any()});") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply(getCursor(), method.getCoordinates().replace(), actual, expected); - } else if (args.size() == 3 && !isFloatingPointType(args.get(2))) { - Expression message = args.get(2); - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isEqualTo(#{any()});") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isEqualTo(#{any()});"); - return template - .staticImports("org.assertj.core.api.Assertions.assertThat") + return Preconditions.check(new UsesMethod<>(ASSERT_EQUALS_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_EQUALS_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport(ASSERTJ, "assertThat", false); + maybeRemoveImport(JUNIT); + + List args = mi.getArguments(); + Expression expected = args.get(0); + Expression actual = args.get(1); + if (args.size() == 2) { + return JavaTemplate.builder("assertThat(#{any()}).isEqualTo(#{any()});") + .staticImports(ASSERTJ + ".assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, expected); + } + if (args.size() == 3 && !isFloatingPointType(args.get(2))) { + Expression message = args.get(2); + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isEqualTo(#{any()});") + .staticImports(ASSERTJ + ".assertThat") + .imports("java.util.function.Supplier") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, message, expected); + } + if (args.size() == 3) { + maybeAddImport(ASSERTJ, "within", false); + return JavaTemplate.builder("assertThat(#{any()}).isCloseTo(#{any()}, within(#{any()}));") + .staticImports(ASSERTJ + ".assertThat", ASSERTJ + ".within") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, expected, args.get(2)); + } + + maybeAddImport(ASSERTJ, "within", false); + + // The assertEquals is using a floating point with a delta argument and a message. + Expression message = args.get(3); + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isCloseTo(#{any()}, within(#{any()}));") + .staticImports(ASSERTJ + ".assertThat", ASSERTJ + ".within") .imports("java.util.function.Supplier") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message, - expected - ); - } else if (args.size() == 3) { - //always add the import (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "within", false); - return JavaTemplate.builder("assertThat(#{any()}).isCloseTo(#{any()}, within(#{any()}));") - .staticImports("org.assertj.core.api.Assertions.assertThat", "org.assertj.core.api.Assertions.within") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply(getCursor(), method.getCoordinates().replace(), actual, expected, args.get(2)); - + .apply(getCursor(), mi.getCoordinates().replace(), actual, message, expected, args.get(2)); } - // The assertEquals is using a floating point with a delta argument and a message. - Expression message = args.get(3); - - //always add the import (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "within", false); - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isCloseTo(#{any()}, within(#{any()}));") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isCloseTo(#{any()}, within(#{any()}));"); - return template - .staticImports("org.assertj.core.api.Assertions.assertThat", "org.assertj.core.api.Assertions.within") - .imports("java.util.function.Supplier") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message, - expected, - args.get(2) - ); - } + private boolean isFloatingPointType(Expression expression) { + JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(expression.getType()); + if (fullyQualified != null) { + String typeName = fullyQualified.getFullyQualifiedName(); + return "java.lang.Double".equals(typeName) || "java.lang.Float".equals(typeName); + } - private static boolean isFloatingPointType(Expression expression) { - - JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(expression.getType()); - if (fullyQualified != null) { - String typeName = fullyQualified.getFullyQualifiedName(); - return "java.lang.Double".equals(typeName) || "java.lang.Float".equals(typeName); + JavaType.Primitive parameterType = TypeUtils.asPrimitive(expression.getType()); + return parameterType == JavaType.Primitive.Double || parameterType == JavaType.Primitive.Float; } - - JavaType.Primitive parameterType = TypeUtils.asPrimitive(expression.getType()); - return parameterType == JavaType.Primitive.Double || parameterType == JavaType.Primitive.Float; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertFalseToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertFalseToAssertThat.java index 149e5b3df..84d1462a1 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertFalseToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertFalseToAssertThat.java @@ -23,15 +23,16 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.TypeUtils; import java.util.List; public class JUnitAssertFalseToAssertThat extends Recipe { + private static final MethodMatcher ASSERT_FALSE_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertFalse(boolean, ..)", true); + @Override public String getDisplayName() { return "JUnit `assertFalse` to AssertJ"; @@ -44,66 +45,34 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertFalseToAssertThatVisitor()); - } - - public static class AssertFalseToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_FALSE = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertFalse(boolean, ..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_FALSE.matches(method)) { - return method; - } + return Preconditions.check(new UsesMethod<>(ASSERT_FALSE_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_FALSE_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + List args = mi.getArguments(); + Expression actual = args.get(0); + if (args.size() == 1) { + return JavaTemplate.builder("assertThat(#{any(boolean)}).isFalse();") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual); + } - List args = method.getArguments(); - Expression actual = args.get(0); - - if (args.size() == 1) { - method = JavaTemplate.builder("assertThat(#{any(boolean)}).isFalse();") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual - ); - } else { Expression message = args.get(1); - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any(boolean)}).as(#{any(String)}).isFalse();") : - JavaTemplate.builder("assertThat(#{any(boolean)}).as(#{any(java.util.function.Supplier)}).isFalse();"); - - method = template + return JavaTemplate.builder("assertThat(#{any(boolean)}).as(#{any()}).isFalse();") .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message - ); + .apply(getCursor(), mi.getCoordinates().replace(), actual, message); } - - //Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - // Remove import for "org.junit.jupiter.api.Assertions" if no longer used. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); - - return method; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java index 6a727a403..f5921f80c 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertInstanceOfToAssertThat.java @@ -46,30 +46,30 @@ public TreeVisitor getVisitor() { return Preconditions.check(new UsesMethod<>(ASSERT_INSTANCE_OF_MATCHER), new JavaIsoVisitor() { @Override public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - J.MethodInvocation md = super.visitMethodInvocation(method, ctx); - if (!ASSERT_INSTANCE_OF_MATCHER.matches(md)) { - return md; + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_INSTANCE_OF_MATCHER.matches(mi)) { + return mi; } maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); maybeRemoveImport("org.junit.jupiter.api.Assertions"); - Expression expectedType = md.getArguments().get(0); - Expression actualValue = md.getArguments().get(1); - if (md.getArguments().size() == 2) { + Expression expected = mi.getArguments().get(0); + Expression actual = mi.getArguments().get(1); + if (mi.getArguments().size() == 2) { return JavaTemplate.builder("assertThat(#{any()}).isInstanceOf(#{any()});") .staticImports("org.assertj.core.api.Assertions.assertThat") .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply(getCursor(), method.getCoordinates().replace(), actualValue, expectedType); + .apply(getCursor(), method.getCoordinates().replace(), actual, expected); } - Expression messageOrSupplier = md.getArguments().get(2); + Expression messageOrSupplier = mi.getArguments().get(2); return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isInstanceOf(#{any()});") .staticImports("org.assertj.core.api.Assertions.assertThat") .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply(getCursor(), method.getCoordinates().replace(), actualValue, messageOrSupplier, expectedType); + .apply(getCursor(), method.getCoordinates().replace(), actual, messageOrSupplier, expected); } }); } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotEqualsToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotEqualsToAssertThat.java index d78506810..f8dfce9e7 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotEqualsToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotEqualsToAssertThat.java @@ -23,7 +23,7 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaType; @@ -33,6 +33,10 @@ public class JUnitAssertNotEqualsToAssertThat extends Recipe { + private static final String JUNIT = "org.junit.jupiter.api.Assertions"; + private static final String ASSERTJ = "org.assertj.core.api.Assertions"; + private static final MethodMatcher ASSERT_NOT_EQUALS_MATCHER = new MethodMatcher(JUNIT + " assertNotEquals(..)", true); + @Override public String getDisplayName() { return "JUnit `assertNotEquals` to AssertJ"; @@ -45,117 +49,64 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertNotEqualsToAssertThatVisitor()); - } - - public static class AssertNotEqualsToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_EQUALS = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertNotEquals(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_EQUALS.matches(method)) { - return method; - } - - List args = method.getArguments(); - - Expression expected = args.get(0); - Expression actual = args.get(1); - - if (args.size() == 2) { - method = JavaTemplate.builder("assertThat(#{any()}).isNotEqualTo(#{any()});") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - expected - ); - } else if (args.size() == 3 && !isFloatingPointType(args.get(2))) { - Expression message = args.get(2); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isNotEqualTo(#{any()});") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isNotEqualTo(#{any()});"); - + return Preconditions.check(new UsesMethod<>(ASSERT_NOT_EQUALS_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_NOT_EQUALS_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport(ASSERTJ, "assertThat", false); + maybeRemoveImport(JUNIT); + + List args = mi.getArguments(); + Expression expected = args.get(0); + Expression actual = args.get(1); + if (args.size() == 2) { + return JavaTemplate.builder("assertThat(#{any()}).isNotEqualTo(#{any()});") + .staticImports(ASSERTJ + ".assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, expected); + } + if (args.size() == 3 && isFloatingPointType(args.get(2))) { + maybeAddImport(ASSERTJ, "within", false); + return JavaTemplate.builder("assertThat(#{any()}).isNotCloseTo(#{any()}, within(#{any()}));") + .staticImports(ASSERTJ + ".assertThat", ASSERTJ + ".within") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, expected, args.get(2)); + } + if (args.size() == 3) { + Expression message = args.get(2); + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isNotEqualTo(#{any()});") + .staticImports(ASSERTJ + ".assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, message, expected); + } + + maybeAddImport(ASSERTJ, "within", false); - method = template - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message, - expected - ); - } else if (args.size() == 3) { - method = JavaTemplate.builder("assertThat(#{any()}).isNotCloseTo(#{any()}, within(#{any()}));") - .staticImports("org.assertj.core.api.Assertions.assertThat", "org.assertj.core.api.Assertions.within") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - expected, - args.get(2) - ); - maybeAddImport("org.assertj.core.api.Assertions", "within", false); - } else { Expression message = args.get(3); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isNotCloseTo(#{any()}, within(#{any()}));") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isNotCloseTo(#{any()}, within(#{any()}));"); - - method = template - .staticImports("org.assertj.core.api.Assertions.assertThat", "org.assertj.core.api.Assertions.within") - .javaParser(assertionsParser(ctx)) + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isNotCloseTo(#{any()}, within(#{any()}));") + .staticImports(ASSERTJ + ".assertThat", ASSERTJ + ".within") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message, - expected, - args.get(2) - ); - - maybeAddImport("org.assertj.core.api.Assertions", "within", false); + .apply(getCursor(), method.getCoordinates().replace(), actual, message, expected, args.get(2)); } - //Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - // Remove import for "org.junit.jupiter.api.Assertions" if no longer used. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); + private boolean isFloatingPointType(Expression expression) { + JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(expression.getType()); + if (fullyQualified != null) { + String typeName = fullyQualified.getFullyQualifiedName(); + return "java.lang.Double".equals(typeName) || "java.lang.Float".equals(typeName); + } - return method; - } - - private static boolean isFloatingPointType(Expression expression) { - JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(expression.getType()); - if (fullyQualified != null) { - String typeName = fullyQualified.getFullyQualifiedName(); - return "java.lang.Double".equals(typeName) || "java.lang.Float".equals(typeName); + JavaType.Primitive parameterType = TypeUtils.asPrimitive(expression.getType()); + return parameterType == JavaType.Primitive.Double || parameterType == JavaType.Primitive.Float; } - - JavaType.Primitive parameterType = TypeUtils.asPrimitive(expression.getType()); - return parameterType == JavaType.Primitive.Double || parameterType == JavaType.Primitive.Float; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotNullToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotNullToAssertThat.java index dea4c6ffe..f6d4696ad 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotNullToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNotNullToAssertThat.java @@ -23,15 +23,16 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.TypeUtils; import java.util.List; public class JUnitAssertNotNullToAssertThat extends Recipe { + private static final MethodMatcher ASSERT_NOT_NULL_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertNotNull(..)", true); + @Override public String getDisplayName() { return "JUnit `assertNotNull` to AssertJ"; @@ -44,68 +45,35 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertNotNullToAssertThatVisitor()); - } - - public static class AssertNotNullToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_NOT_NULL_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertNotNull(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_NOT_NULL_MATCHER.matches(method)) { - return method; - } - - List args = method.getArguments(); - Expression actual = args.get(0); + return Preconditions.check(new UsesMethod<>(ASSERT_NOT_NULL_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_NOT_NULL_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + List args = mi.getArguments(); + Expression actual = args.get(0); + if (args.size() == 1) { + return JavaTemplate.builder("assertThat(#{any()}).isNotNull();") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual); + + } - if (args.size() == 1) { - method = JavaTemplate.builder("assertThat(#{any()}).isNotNull();") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual - ); - - } else { Expression message = args.get(1); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isNotNull();") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isNotNull();"); - - method = template + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isNotNull();") .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message - ); + .apply(getCursor(), mi.getCoordinates().replace(), actual, message); } - - //Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - //And if there are no longer references to the JUnit assertions class, we can remove the import. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); - - return method; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNullToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNullToAssertThat.java index c2c916f20..7dc9586e8 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNullToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertNullToAssertThat.java @@ -23,15 +23,16 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.TypeUtils; import java.util.List; public class JUnitAssertNullToAssertThat extends Recipe { + private static final MethodMatcher ASSERT_NULL_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertNull(..)", true); + @Override public String getDisplayName() { return "JUnit `assertNull` to AssertJ"; @@ -44,67 +45,34 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertNullToAssertThatVisitor()); - } - - public static class AssertNullToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_NULL_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertNull(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_NULL_MATCHER.matches(method)) { - return method; - } + return Preconditions.check(new UsesMethod<>(ASSERT_NULL_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_NULL_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + List args = mi.getArguments(); + Expression actual = args.get(0); + if (args.size() == 1) { + return JavaTemplate.builder("assertThat(#{any()}).isNull();") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual); + } - List args = method.getArguments(); - Expression actual = args.get(0); - - if (args.size() == 1) { - method = JavaTemplate.builder("assertThat(#{any()}).isNull();") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual - ); - } else { Expression message = args.get(1); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isNull();") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isNull();"); - - method = template + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isNull();") .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message - ); + .apply(getCursor(), mi.getCoordinates().replace(), actual, message); } - - // Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - // Remove import for "org.junit.jupiter.api.Assertions" if no longer used. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); - - return method; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertSameToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertSameToAssertThat.java index 1241d70e0..88a3a584e 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertSameToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertSameToAssertThat.java @@ -23,15 +23,16 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.TypeUtils; import java.util.List; public class JUnitAssertSameToAssertThat extends Recipe { + private static final MethodMatcher ASSERT_SAME_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertSame(..)", true); + @Override public String getDisplayName() { return "JUnit `assertSame` to AssertJ"; @@ -44,70 +45,35 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertSameToAssertThatVisitor()); - } - - public static class AssertSameToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_SAME_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertSame(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_SAME_MATCHER.matches(method)) { - return method; - } + return Preconditions.check(new UsesMethod<>(ASSERT_SAME_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_SAME_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + List args = mi.getArguments(); + Expression expected = args.get(0); + Expression actual = args.get(1); + if (args.size() == 2) { + return JavaTemplate.builder("assertThat(#{any()}).isSameAs(#{any()});") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual, expected); + } - List args = method.getArguments(); - Expression expected = args.get(0); - Expression actual = args.get(1); - - if (args.size() == 2) { - method = JavaTemplate.builder("assertThat(#{any()}).isSameAs(#{any()});") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - expected - ); - } else { Expression message = args.get(2); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isSameAs(#{any()});") : - JavaTemplate.builder("assertThat(#{any()}).as(#{any(java.util.function.Supplier)}).isSameAs(#{any()});"); - - method = template + return JavaTemplate.builder("assertThat(#{any()}).as(#{any()}).isSameAs(#{any()});") .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message, - expected - ); + .apply(getCursor(), mi.getCoordinates().replace(), actual, message, expected); } - - // Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - // Remove import for "org.junit.jupiter.api.Assertions" if no longer used. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); - - return method; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java index 6a880f816..0960100d0 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionType.java @@ -30,6 +30,9 @@ public class JUnitAssertThrowsToAssertExceptionType extends Recipe { + private static final MethodMatcher ASSERT_THROWS_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertThrows(..)"); + private static final JavaType THROWING_CALLABLE_TYPE = JavaType.buildType("org.assertj.core.api.ThrowableAssert.ThrowingCallable"); + @Override public String getDisplayName() { return "JUnit AssertThrows to AssertJ exceptionType"; @@ -42,47 +45,38 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesMethod<>("org.junit.jupiter.api.Assertions assertThrows(..)"), new AssertExceptionTypeVisitor()); - } - - private static class AssertExceptionTypeVisitor extends JavaIsoVisitor { - private static final MethodMatcher ASSERT_THROWS_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertThrows(..)"); - private static final JavaType THROWING_CALLABLE_TYPE = JavaType.buildType("org.assertj.core.api.ThrowableAssert.ThrowingCallable"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); - if (ASSERT_THROWS_MATCHER.matches(mi) && - mi.getArguments().size() == 2 && - getCursor().getParentTreeCursor().getValue() instanceof J.Block) { - J executable = mi.getArguments().get(1); - if (executable instanceof J.Lambda) { - executable = ((J.Lambda) executable).withType(THROWING_CALLABLE_TYPE); - } else if (executable instanceof J.MemberReference) { - executable = ((J.MemberReference) executable).withType(THROWING_CALLABLE_TYPE); - } else { - executable = null; - } + return Preconditions.check(new UsesMethod<>(ASSERT_THROWS_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (ASSERT_THROWS_MATCHER.matches(mi) && + mi.getArguments().size() == 2 && + getCursor().getParentTreeCursor().getValue() instanceof J.Block) { + J executable = mi.getArguments().get(1); + if (executable instanceof J.Lambda) { + executable = ((J.Lambda) executable).withType(THROWING_CALLABLE_TYPE); + } else if (executable instanceof J.MemberReference) { + executable = ((J.MemberReference) executable).withType(THROWING_CALLABLE_TYPE); + } else { + executable = null; + } - if (executable != null) { - mi = JavaTemplate - .builder("assertThatExceptionOfType(#{any(java.lang.Class)}).isThrownBy(#{any(org.assertj.core.api.ThrowableAssert.ThrowingCallable)})") - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) - .staticImports("org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType") - .build() - .apply( - getCursor(), - mi.getCoordinates().replace(), - mi.getArguments().get(0), executable - ); - maybeAddImport("org.assertj.core.api.AssertionsForClassTypes", "assertThatExceptionOfType", false); - maybeRemoveImport("org.junit.jupiter.api.Assertions.assertThrows"); - maybeRemoveImport("org.junit.jupiter.api.Assertions"); + if (executable != null) { + mi = JavaTemplate + .builder("assertThatExceptionOfType(#{any(java.lang.Class)}).isThrownBy(#{any(org.assertj.core.api.ThrowableAssert.ThrowingCallable)})") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .staticImports("org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType") + .build() + .apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), executable); + maybeAddImport("org.assertj.core.api.AssertionsForClassTypes", "assertThatExceptionOfType", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions.assertThrows"); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); - doAfterVisit(new LambdaBlockToExpression().getVisitor()); + doAfterVisit(new LambdaBlockToExpression().getVisitor()); + } } + return mi; } - return mi; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertTrueToAssertThat.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertTrueToAssertThat.java index b478716dc..8541a4f2c 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertTrueToAssertThat.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitAssertTrueToAssertThat.java @@ -23,14 +23,16 @@ import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; -import org.openrewrite.java.tree.TypeUtils; import java.util.List; public class JUnitAssertTrueToAssertThat extends Recipe { + + private static final MethodMatcher ASSERT_TRUE_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertTrue(boolean, ..)"); + @Override public String getDisplayName() { return "JUnit `assertTrue` to AssertJ"; @@ -43,67 +45,34 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new AssertTrueToAssertThatVisitor()); - } - - public static class AssertTrueToAssertThatVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_ASSERT_TRUE = new MethodMatcher("org.junit.jupiter.api.Assertions" + " assertTrue(boolean, ..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!JUNIT_ASSERT_TRUE.matches(method)) { - return method; - } + return Preconditions.check(new UsesMethod<>(ASSERT_TRUE_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!ASSERT_TRUE_MATCHER.matches(mi)) { + return mi; + } + + maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + + List args = mi.getArguments(); + Expression actual = args.get(0); + if (args.size() == 1) { + return JavaTemplate.builder("assertThat(#{any(boolean)}).isTrue();") + .staticImports("org.assertj.core.api.Assertions.assertThat") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), actual); + } - List args = method.getArguments(); - Expression actual = args.get(0); - - if (args.size() == 1) { - method = JavaTemplate.builder("assertThat(#{any(boolean)}).isTrue();") - .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual - ); - } else { Expression message = args.get(1); - - JavaTemplate.Builder template = TypeUtils.isString(message.getType()) ? - JavaTemplate.builder("assertThat(#{any(boolean)}).as(#{any(String)}).isTrue();") : - JavaTemplate.builder("assertThat(#{any(boolean)}).as(#{any(java.util.function.Supplier)}).isTrue();"); - - method = template + return JavaTemplate.builder("assertThat(#{any()}).as(#{any(String)}).isTrue();") .staticImports("org.assertj.core.api.Assertions.assertThat") - .javaParser(assertionsParser(ctx)) + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - actual, - message - ); + .apply(getCursor(), mi.getCoordinates().replace(), actual, message); } - - //Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "assertThat", false); - - // Remove import for "org.junit.jupiter.api.Assertions" if no longer used. - maybeRemoveImport("org.junit.jupiter.api.Assertions"); - - return method; - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/JUnitFailToAssertJFail.java b/src/main/java/org/openrewrite/java/testing/assertj/JUnitFailToAssertJFail.java index b93ee3c9e..aef7ddfde 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/JUnitFailToAssertJFail.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/JUnitFailToAssertJFail.java @@ -20,14 +20,20 @@ import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; import org.openrewrite.java.*; -import org.openrewrite.java.search.UsesType; +import org.openrewrite.java.search.UsesMethod; import org.openrewrite.java.tree.Expression; import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.TypeUtils; +import java.util.Collections; import java.util.List; public class JUnitFailToAssertJFail extends Recipe { + + private static final String JUNIT = "org.junit.jupiter.api.Assertions"; + private static final String ASSERTJ = "org.assertj.core.api.Assertions"; + private static final MethodMatcher FAIL_MATCHER = new MethodMatcher(JUNIT + " fail(..)"); + @Override public String getDisplayName() { return "JUnit fail to AssertJ"; @@ -40,118 +46,70 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return Preconditions.check(new UsesType<>("org.junit.jupiter.api.Assertions", false), new JUnitFailToAssertJFailVisitor()); - } - - public static class JUnitFailToAssertJFailVisitor extends JavaIsoVisitor { - private JavaParser.Builder assertionsParser; - - private JavaParser.Builder assertionsParser(ExecutionContext ctx) { - if (assertionsParser == null) { - assertionsParser = JavaParser.fromJavaVersion() - .classpathFromResources(ctx, "assertj-core-3.24"); - } - return assertionsParser; - } - - private static final MethodMatcher JUNIT_FAIL_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions" + " fail(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - J.MethodInvocation m = method; - - if (!JUNIT_FAIL_MATCHER.matches(m)) { - return m; - } - - List args = m.getArguments(); + return Preconditions.check(new UsesMethod<>(FAIL_MATCHER), new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = method; + if (!FAIL_MATCHER.matches(mi)) { + return mi; + } - if (args.size() == 1) { - // fail(), fail(String), fail(Supplier), fail(Throwable) - if (args.get(0) instanceof J.Empty) { - m = JavaTemplate.builder("org.assertj.core.api.Assertions.fail(\"\");") - .javaParser(assertionsParser(ctx)) - .build() - .apply(getCursor(), m.getCoordinates().replace()); - } else if (args.get(0) instanceof J.Literal || - TypeUtils.isAssignableTo("java.lang.String", args.get(0).getType())) { - m = JavaTemplate.builder("org.assertj.core.api.Assertions.fail(#{any()});") - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - m.getCoordinates().replace(), - args.get(0) - ); + List args = mi.getArguments(); + if (args.size() == 1) { + // fail(), fail(String), fail(Supplier), fail(Throwable) + if (args.get(0) instanceof J.Empty) { + mi = JavaTemplate.builder(ASSERTJ + ".fail(\"\");") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace()); + } else if (args.get(0) instanceof J.Literal || + TypeUtils.isAssignableTo("java.lang.String", args.get(0).getType())) { + mi = JavaTemplate.builder(ASSERTJ + ".fail(#{any()});") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), args.get(0)); + } else { + mi = JavaTemplate.builder(ASSERTJ + ".fail(\"\", #{any()});") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), args.get(0)); + } } else { - m = JavaTemplate.builder("org.assertj.core.api.Assertions.fail(\"\", #{any()});") - .javaParser(assertionsParser(ctx)) + // fail(String, Throwable) + String anyArgs = String.join(",", Collections.nCopies(args.size(), "#{any()}")); + mi = JavaTemplate.builder(ASSERTJ + ".fail(" + anyArgs + ");") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) .build() - .apply( - getCursor(), - m.getCoordinates().replace(), - args.get(0) - ); + .apply(getCursor(), mi.getCoordinates().replace(), args.toArray()); } - } else { - // fail(String, Throwable) - StringBuilder templateBuilder = new StringBuilder("org.assertj.core.api.Assertions.fail("); - for (int i = 0; i < args.size(); i++) { - templateBuilder.append("#{any()}"); - if (i < args.size() - 1) { - templateBuilder.append(", "); - } - } - templateBuilder.append(");"); - m = JavaTemplate.builder(templateBuilder.toString()) - .javaParser(assertionsParser(ctx)) - .build() - .apply( - getCursor(), - m.getCoordinates().replace(), - args.toArray() - ); + doAfterVisit(new RemoveUnusedImports().getVisitor()); + doAfterVisit(new UnqualifiedMethodInvocations()); + return mi; } - doAfterVisit(new RemoveUnusedImports().getVisitor()); - doAfterVisit(new UnqualifiedMethodInvocations()); - return m; - } + class UnqualifiedMethodInvocations extends JavaIsoVisitor { + private final MethodMatcher INTERNAL_FAIL_MATCHER = new MethodMatcher(ASSERTJ + " fail(..)"); - private static class UnqualifiedMethodInvocations extends JavaIsoVisitor { - private static final MethodMatcher ASSERTJ_FAIL_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions" + " fail(..)"); + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); + if (!INTERNAL_FAIL_MATCHER.matches(mi)) { + return mi; + } - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { - if (!ASSERTJ_FAIL_MATCHER.matches(method)) { - return method; - } + maybeAddImport(ASSERTJ, "fail", false); + maybeRemoveImport(JUNIT + ".fail"); - StringBuilder templateBuilder = new StringBuilder("fail("); - List arguments = method.getArguments(); - for (int i = 0; i < arguments.size(); i++) { - templateBuilder.append("#{any()}"); - if (i < arguments.size() - 1) { - templateBuilder.append(", "); - } + List arguments = mi.getArguments(); + String anyArgs = String.join(",", Collections.nCopies(arguments.size(), "#{any()}")); + return JavaTemplate.builder("fail(" + anyArgs + ");") + .staticImports(ASSERTJ + ".fail") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), arguments.toArray()); } - templateBuilder.append(");"); - - method = JavaTemplate.builder(templateBuilder.toString()) - .staticImports("org.assertj.core.api.Assertions" + ".fail") - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) - .build() - .apply( - getCursor(), - method.getCoordinates().replace(), - arguments.toArray() - ); - //Make sure there is a static import for "org.assertj.core.api.Assertions.assertThat" (even if not referenced) - maybeAddImport("org.assertj.core.api.Assertions", "fail", false); - maybeRemoveImport("org.junit.jupiter.api.Assertions.fail"); - return super.visitMethodInvocation(method, ctx); } - } + }); } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java index 1d3685955..de1d6be55 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJAssertion.java @@ -33,6 +33,8 @@ @NoArgsConstructor public class SimplifyAssertJAssertion extends Recipe { + private static final MethodMatcher ASSERT_THAT_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); + @Option(displayName = "AssertJ assertion", description = "The assertion method that should be replaced.", example = "hasSize", @@ -67,38 +69,34 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new ShorthenChainedAssertJAssertionsVisitor(); - } - - private class ShorthenChainedAssertJAssertionsVisitor extends JavaIsoVisitor { - private final MethodMatcher ASSERT_THAT_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); - private final MethodMatcher ASSERT_TO_REPLACE = new MethodMatcher("org.assertj.core.api.* " + assertToReplace + "(..)"); + final MethodMatcher assertToReplace = new MethodMatcher("org.assertj.core.api.* " + this.assertToReplace + "(..)"); + return new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(method, ctx); - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { - J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); + // Match the end of the chain first, then the select to avoid matching the wrong method chain + if (!assertToReplace.matches(mi) || !ASSERT_THAT_MATCHER.matches(mi.getSelect())) { + return mi; + } - // Match the end of the chain first, then the select to avoid matching the wrong method chain - if (!ASSERT_TO_REPLACE.matches(mi) || !ASSERT_THAT_MATCHER.matches(mi.getSelect())) { - return mi; - } + // Compare argument with passed in literal + if (!(mi.getArguments().get(0) instanceof J.Literal) || + !literalArgument.equals(((J.Literal) mi.getArguments().get(0)).getValueSource())) { // Implies "null" is `null` + return mi; + } - // Compare argument with passed in literal - if (!(mi.getArguments().get(0) instanceof J.Literal) || - !literalArgument.equals(((J.Literal) mi.getArguments().get(0)).getValueSource())) { // Implies "null" is `null` - return mi; - } + // Check argument type of assertThat + if (!TypeUtils.isAssignableTo(requiredType, ((J.MethodInvocation) mi.getSelect()).getArguments().get(0).getType())) { + return mi; + } - // Check argument type of assertThat - if (!TypeUtils.isAssignableTo(requiredType, ((J.MethodInvocation) mi.getSelect()).getArguments().get(0).getType())) { - return mi; + // Assume zero argument replacement method + return JavaTemplate.builder("#{any()}." + dedicatedAssertion + "()") + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), mi.getSelect()); } - - // Assume zero argument replacement method - return JavaTemplate.builder("#{any()}." + dedicatedAssertion + "()") - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "assertj-core-3.24")) - .build() - .apply(getCursor(), mi.getCoordinates().replace(), mi.getSelect()); - } + }; } } diff --git a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java index ba431a43c..e6d37912e 100644 --- a/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java +++ b/src/main/java/org/openrewrite/java/testing/assertj/SimplifyChainedAssertJAssertion.java @@ -35,6 +35,7 @@ @AllArgsConstructor @NoArgsConstructor public class SimplifyChainedAssertJAssertion extends Recipe { + @Option(displayName = "AssertJ chained assertion", description = "The chained AssertJ assertion to move to dedicated assertion.", example = "equals", @@ -81,95 +82,89 @@ public String getDescription() { @Override public TreeVisitor getVisitor() { - return new SimplifyChainedAssertJAssertionsVisitor(); - } - - private class SimplifyChainedAssertJAssertionsVisitor extends JavaIsoVisitor { - private final MethodMatcher ASSERT_THAT_MATCHER = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); - private final MethodMatcher CHAINED_ASSERT_MATCHER = new MethodMatcher("java..* " + chainedAssertion + "(..)"); - private final MethodMatcher ASSERT_TO_REPLACE = new MethodMatcher("org.assertj.core.api.* " + assertToReplace + "(..)"); - - @Override - public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { - J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); - - // assert has correct assertion - if (!ASSERT_TO_REPLACE.matches(mi) || mi.getArguments().size() != 1) { - return mi; + MethodMatcher assertThatMatcher = new MethodMatcher("org.assertj.core.api.Assertions assertThat(..)"); + MethodMatcher chainedAssertMatcher = new MethodMatcher("java..* " + chainedAssertion + "(..)"); + MethodMatcher assertToReplace = new MethodMatcher("org.assertj.core.api.* " + this.assertToReplace + "(..)"); + + return new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); + + // assert has correct assertion + if (!assertToReplace.matches(mi) || mi.getArguments().size() != 1) { + return mi; + } + + // assertThat has method call + J.MethodInvocation assertThat = (J.MethodInvocation) mi.getSelect(); + if (!assertThatMatcher.matches(assertThat) || !(assertThat.getArguments().get(0) instanceof J.MethodInvocation)) { + return mi; + } + + J.MethodInvocation assertThatArg = (J.MethodInvocation) assertThat.getArguments().get(0); + if (!chainedAssertMatcher.matches(assertThatArg)) { + return mi; + } + + // Extract the actual argument for the new assertThat call + Expression actual = assertThatArg.getSelect() != null ? assertThatArg.getSelect() : assertThatArg; + if (!TypeUtils.isAssignableTo(requiredType, actual.getType())) { + return mi; + } + List arguments = new ArrayList<>(); + arguments.add(actual); + + String template = getStringTemplateAndAppendArguments(assertThatArg, mi, arguments); + return JavaTemplate.builder(String.format(template, dedicatedAssertion)) + .contextSensitive() + .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "junit-jupiter-api-5.9", "assertj-core-3.24")) + .build() + .apply(getCursor(), mi.getCoordinates().replace(), arguments.toArray()); } - // assertThat has method call - J.MethodInvocation assertThat = (J.MethodInvocation) mi.getSelect(); - if (!ASSERT_THAT_MATCHER.matches(assertThat) || !(assertThat.getArguments().get(0) instanceof J.MethodInvocation)) { - return mi; + private String getStringTemplateAndAppendArguments(J.MethodInvocation assertThatArg, J.MethodInvocation methodToReplace, List arguments) { + Expression assertThatArgument = assertThatArg.getArguments().get(0); + Expression methodToReplaceArgument = methodToReplace.getArguments().get(0); + boolean assertThatArgumentIsEmpty = assertThatArgument instanceof J.Empty; + boolean methodToReplaceArgumentIsEmpty = methodToReplaceArgument instanceof J.Empty; + + // If both arguments are empty, then the select is already added to the arguments list, and we use a minimal template + if (assertThatArgumentIsEmpty && methodToReplaceArgumentIsEmpty) { + return "assertThat(#{any()}).%s()"; + } + + // If both arguments are not empty, then we add both to the arguments to the arguments list, and return a template with two arguments + if (!assertThatArgumentIsEmpty && !methodToReplaceArgumentIsEmpty) { + // This should only happen for map assertions using a key and value + arguments.add(assertThatArgument); + arguments.add(methodToReplaceArgument); + return "assertThat(#{any()}).%s(#{any()}, #{any()})"; + } + + // If either argument is empty, we choose which one to add to the arguments list, and optionally extract the select + arguments.add(extractEitherArgument(assertThatArgumentIsEmpty, assertThatArgument, methodToReplaceArgument)); + + // Special case for Path.of() assertions + if ("java.nio.file.Path".equals(requiredType) && dedicatedAssertion.contains("Raw") && + TypeUtils.isAssignableTo("java.lang.String", assertThatArgument.getType())) { + maybeAddImport("java.nio.file.Path"); + return "assertThat(#{any()}).%s(Path.of(#{any()}))"; + } + + return "assertThat(#{any()}).%s(#{any()})"; } - J.MethodInvocation assertThatArg = (J.MethodInvocation) assertThat.getArguments().get(0); - if (!CHAINED_ASSERT_MATCHER.matches(assertThatArg)) { - return mi; - } - - // Extract the actual argument for the new assertThat call - Expression actual = assertThatArg.getSelect() != null ? assertThatArg.getSelect() : assertThatArg; - if (!TypeUtils.isAssignableTo(requiredType, actual.getType())) { - return mi; - } - List arguments = new ArrayList<>(); - arguments.add(actual); - - String template = getStringTemplateAndAppendArguments(assertThatArg, mi, arguments); - return applyTemplate(String.format(template, dedicatedAssertion), arguments, mi, ctx); - } - - private J.MethodInvocation applyTemplate(String formattedTemplate, List arguments, J.MethodInvocation mi, ExecutionContext ctx) { - return JavaTemplate.builder(formattedTemplate) - .contextSensitive() - .javaParser(JavaParser.fromJavaVersion().classpathFromResources(ctx, "junit-jupiter-api-5.9", "assertj-core-3.24")) - .build() - .apply(getCursor(), mi.getCoordinates().replace(), arguments.toArray()); - } - - private String getStringTemplateAndAppendArguments(J.MethodInvocation assertThatArg, J.MethodInvocation methodToReplace, List arguments) { - Expression assertThatArgument = assertThatArg.getArguments().get(0); - Expression methodToReplaceArgument = methodToReplace.getArguments().get(0); - boolean assertThatArgumentIsEmpty = assertThatArgument instanceof J.Empty; - boolean methodToReplaceArgumentIsEmpty = methodToReplaceArgument instanceof J.Empty; - - // If both arguments are empty, then the select is already added to the arguments list, and we use a minimal template - if (assertThatArgumentIsEmpty && methodToReplaceArgumentIsEmpty) { - return "assertThat(#{any()}).%s()"; - } - - // If both arguments are not empty, then we add both to the arguments to the arguments list, and return a template with two arguments - if (!assertThatArgumentIsEmpty && !methodToReplaceArgumentIsEmpty) { - // This should only happen for map assertions using a key and value - arguments.add(assertThatArgument); - arguments.add(methodToReplaceArgument); - return "assertThat(#{any()}).%s(#{any()}, #{any()})"; - } - - // If either argument is empty, we choose which one to add to the arguments list, and optionally extract the select - arguments.add(extractEitherArgument(assertThatArgumentIsEmpty, assertThatArgument, methodToReplaceArgument)); - - // Special case for Path.of() assertions - if ("java.nio.file.Path".equals(requiredType) && dedicatedAssertion.contains("Raw") && - TypeUtils.isAssignableTo("java.lang.String", assertThatArgument.getType())) { - maybeAddImport("java.nio.file.Path"); - return "assertThat(#{any()}).%s(Path.of(#{any()}))"; - } - - return "assertThat(#{any()}).%s(#{any()})"; - } - - private Expression extractEitherArgument(boolean assertThatArgumentIsEmpty, Expression assertThatArgument, Expression methodToReplaceArgument) { - if (assertThatArgumentIsEmpty) { - return methodToReplaceArgument; - } - // Only on the assertThat argument do we possibly replace the argument with the select; such as list.size() -> list - if (CHAINED_ASSERT_MATCHER.matches(assertThatArgument)) { - return Objects.requireNonNull(((J.MethodInvocation) assertThatArgument).getSelect()); + private Expression extractEitherArgument(boolean assertThatArgumentIsEmpty, Expression assertThatArgument, Expression methodToReplaceArgument) { + if (assertThatArgumentIsEmpty) { + return methodToReplaceArgument; + } + // Only on the assertThat argument do we possibly replace the argument with the select; such as list.size() -> list + if (chainedAssertMatcher.matches(assertThatArgument)) { + return Objects.requireNonNull(((J.MethodInvocation) assertThatArgument).getSelect()); + } + return assertThatArgument; } - return assertThatArgument; - } + }; } } diff --git a/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java b/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java index 1b5e7fd24..85b9f6a01 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/JUnitAssertThrowsToAssertExceptionTypeTest.java @@ -44,12 +44,10 @@ void toAssertExceptionOfType() { java( """ import static org.junit.jupiter.api.Assertions.assertThrows; - + public class SimpleExpectedExceptionTest { public void throwsExceptionWithSpecificType() { - assertThrows(NullPointerException.class, () -> { - foo(); - }); + assertThrows(NullPointerException.class, () -> foo()); } void foo() { throw new NullPointerException(); @@ -58,11 +56,10 @@ void foo() { """, """ import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; - + public class SimpleExpectedExceptionTest { public void throwsExceptionWithSpecificType() { - assertThatExceptionOfType(NullPointerException.class).isThrownBy(() -> - foo()); + assertThatExceptionOfType(NullPointerException.class).isThrownBy(() -> foo()); } void foo() { throw new NullPointerException(); From eb1e066ff0eab4d1766eb8e6787e4197d389eb41 Mon Sep 17 00:00:00 2001 From: Shannon Pamperl Date: Mon, 11 Nov 2024 16:20:49 +0000 Subject: [PATCH 104/118] refactor: Update Gradle wrapper Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.gradle.UpdateGradleWrapper?organizationId=T3BlblJld3JpdGU%3D#defaults=W3sibmFtZSI6ImFkZElmTWlzc2luZyIsInZhbHVlIjoiRmFsc2UifV0= Co-authored-by: Moderne --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7c553f646..571bbea59 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26 +distributionSha256Sum=57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9 From 9a5b4448ac33f470743bf428d11e9023a062eb76 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Tue, 12 Nov 2024 12:19:21 +0100 Subject: [PATCH 105/118] Document that the JUnit to AssertJ migration includes Jupiter --- src/main/resources/META-INF/rewrite/assertj.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index 173f603bb..302b76692 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -16,7 +16,7 @@ --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.Assertj -displayName: Assertj +displayName: AssertJ best practices description: Migrates JUnit asserts to AssertJ and applies best practices to assertions. tags: - testing @@ -449,7 +449,10 @@ recipeList: type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.assertj.JUnitToAssertj displayName: Migrate JUnit asserts to AssertJ -description: AssertJ provides a rich set of assertions, truly helpful error messages, improves test code readability. Converts assertions from `org.junit.jupiter.api.Assertions` to `org.assertj.core.api.Assertions`. +description: >- + AssertJ provides a rich set of assertions, truly helpful error messages, improves test code readability. + Converts assertions from `org.junit.jupiter.api.Assertions` to `org.assertj.core.api.Assertions`. + Will convert JUnit 4 to JUnit Jupiter if necessary to match and modify assertions. tags: - testing - assertj From ef62c319fd5b4b77b030fcb409b11402debdf121 Mon Sep 17 00:00:00 2001 From: Sam Snyder Date: Tue, 12 Nov 2024 14:09:53 -0800 Subject: [PATCH 106/118] Create a mockito upgrade recipe that just does 4 -> 5, so it can be included in Spring 3.1 upgrade. Both "Migrate to Spring Boot 2.4" and "Mockito 5.x upgrade" include "Mockito 4.x upgrade" So if we add "Mockito 5.x upgrade" into "Migrate to Spring Boot 3.1" then "Mockito 4.x upgrade", and all its constituent recipes, will be run twice. The performance cost of this is not dire, but the spring boot migration is already a very large recipe with ~2k steps. --- src/main/resources/META-INF/rewrite/mockito.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/rewrite/mockito.yml b/src/main/resources/META-INF/rewrite/mockito.yml index dc569f5e0..e75ef742d 100644 --- a/src/main/resources/META-INF/rewrite/mockito.yml +++ b/src/main/resources/META-INF/rewrite/mockito.yml @@ -31,6 +31,17 @@ type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.Mockito1to5Migration displayName: Mockito 5.x upgrade description: Upgrade Mockito from 1.x to 5.x. +tags: + - testing + - mockito +recipeList: + - org.openrewrite.java.testing.mockito.Mockito1to4Migration + - org.openrewrite.java.testing.mockito.Mockito4to5Only +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.testing.mockito.Mockito4to5Only +displayName: Mockito 4 to 5.x upgrade only +description: Upgrade Mockito from 4.x to 5.x. Does not include 1.x to 4.x migration. tags: - testing - mockito @@ -49,7 +60,6 @@ recipeList: artifactId: byte-buddy* newVersion: 1.15.x - org.openrewrite.maven.RemoveDuplicateDependencies - --- type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.java.testing.mockito.Mockito1to4Migration From a04dd14271fdd7f1fc88a183b3bd5d1e67d92164 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 13 Nov 2024 16:59:14 +0100 Subject: [PATCH 107/118] Drop workaround following upstream fix https://github.com/openrewrite/rewrite/commit/f50e53baafaeaee463d434be3fa1353c594d1c44 --- .../java/testing/junit5/MockitoJUnitToMockitoExtension.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java index 16939a286..6836be849 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java @@ -129,11 +129,6 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex maybeAddImport("org.mockito.junit.jupiter.MockitoSettings", false); maybeAddImport("org.mockito.quality.Strictness", false); } - - // Workaround first modifier incorrectly getting a trailing space as part of the prefix - cd = cd.withModifiers(ListUtils.mapFirst(cd.getModifiers(), - modifier -> modifier.withPrefix(modifier.getPrefix().withWhitespace( - modifier.getPrefix().getLastWhitespace().replaceAll(" $", ""))))); } } From 89968a524d76b592832151016ee975ebdc1657d2 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Thu, 14 Nov 2024 09:31:56 +0000 Subject: [PATCH 108/118] refactor: OpenRewrite best practices Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.recipes.OpenRewriteBestPractices?organizationId=T3BlblJld3JpdGU%3D Co-authored-by: Moderne --- .../java/testing/junit5/MockitoJUnitToMockitoExtension.java | 1 - .../java/testing/assertj/AssertJBestPracticesTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java index 6836be849..194d0e056 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/MockitoJUnitToMockitoExtension.java @@ -19,7 +19,6 @@ import org.openrewrite.Preconditions; import org.openrewrite.Recipe; import org.openrewrite.TreeVisitor; -import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaParser; import org.openrewrite.java.JavaTemplate; diff --git a/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java index b6c37a621..a23205627 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/AssertJBestPracticesTest.java @@ -319,5 +319,5 @@ void test(%2$s x, %2$s y, Object value) { template.formatted(imprt, argumentsType, dedicatedAssertion))); } } - + } From 5091a381fea9d8e28afe03e1cc242a7c41387e2e Mon Sep 17 00:00:00 2001 From: sullis Date: Sun, 17 Nov 2024 02:37:07 -0800 Subject: [PATCH 109/118] don't exclude junit4 for testcontainers jupiter (#641) * don't exclude junit4 for testcontainers jupiter * Use glob to remove junit exclusion from `org.testcontainers:*` --------- Co-authored-by: Tim te Beek --- .../resources/META-INF/rewrite/junit5.yml | 2 +- .../testing/junit5/JUnit5MigrationTest.java | 62 +++++++++++++------ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/main/resources/META-INF/rewrite/junit5.yml b/src/main/resources/META-INF/rewrite/junit5.yml index b4a71a983..481a4d71d 100755 --- a/src/main/resources/META-INF/rewrite/junit5.yml +++ b/src/main/resources/META-INF/rewrite/junit5.yml @@ -106,7 +106,7 @@ recipeList: # Workaround for https://github.com/testcontainers/testcontainers-java/issues/970: - org.openrewrite.maven.RemoveExclusion: groupId: org.testcontainers - artifactId: testcontainers + artifactId: '*' exclusionGroupId: junit exclusionArtifactId: junit # Similar for https://github.com/openrewrite/rewrite-testing-frameworks/issues/477 diff --git a/src/test/java/org/openrewrite/java/testing/junit5/JUnit5MigrationTest.java b/src/test/java/org/openrewrite/java/testing/junit5/JUnit5MigrationTest.java index 17478e64c..71752bbb3 100644 --- a/src/test/java/org/openrewrite/java/testing/junit5/JUnit5MigrationTest.java +++ b/src/test/java/org/openrewrite/java/testing/junit5/JUnit5MigrationTest.java @@ -55,7 +55,7 @@ void classReference() { java( """ import org.junit.Test; - + public class Sample { void method() { Class c = Test.class; @@ -64,7 +64,7 @@ void method() { """, """ import org.junit.jupiter.api.Test; - + public class Sample { void method() { Class c = Test.class; @@ -85,10 +85,10 @@ void assertThatReceiver() { """ import org.junit.Assert; import org.junit.Test; - + import static java.util.Arrays.asList; import static org.hamcrest.Matchers.containsInAnyOrder; - + public class SampleTest { @SuppressWarnings("ALL") @Test @@ -100,11 +100,11 @@ public void filterShouldRemoveUnusedConfig() { """, """ import org.junit.jupiter.api.Test; - + import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; - + public class SampleTest { @SuppressWarnings("ALL") @Test @@ -178,6 +178,30 @@ void dontExcludeJunit4DependencyfromTestcontainers() { rewriteRun(pomXml(before, before)); } + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/429") + void dontExcludeJunit4DependencyfromTestcontainersJupiter() { + //language=xml + String before = """ + + 4.0.0 + com.example.jackson + test-plugins + 1.0.0 + + + org.testcontainers + junit-jupiter + 1.18.3 + test + + + + """; + // Output identical, but we want to make sure we don't exclude junit4 from testcontainers + rewriteRun(pomXml(before, before)); + } + @Test @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/477") void dontExcludeJunit4DependencyfromSpringBootTestcontainers() { @@ -231,7 +255,7 @@ void assertEqualsWithArrayArgumentToAssertArrayEquals() { java( """ import org.junit.Assert; - + class MyTest { void test() { Assert.assertEquals(new Object[1], new Object[1]); @@ -240,7 +264,7 @@ void test() { """, """ import org.junit.jupiter.api.Assertions; - + class MyTest { void test() { Assertions.assertArrayEquals(new Object[1], new Object[1]); @@ -261,16 +285,16 @@ void migrateInheritedTestBeforeAfterAnnotations() { import org.junit.After; import org.junit.Before; import org.junit.Test; - + public class AbstractTest { @Before public void before() { } - + @After public void after() { } - + @Test public void test() { } @@ -280,16 +304,16 @@ public void test() { import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - + public class AbstractTest { @BeforeEach public void before() { } - + @AfterEach public void after() { } - + @Test public void test() { } @@ -301,10 +325,10 @@ public void test() { public class A extends AbstractTest { public void before() { } - + public void after() { } - + public void test() { } } @@ -313,16 +337,16 @@ public void test() { import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - + public class A extends AbstractTest { @BeforeEach public void before() { } - + @AfterEach public void after() { } - + @Test public void test() { } From 93d76cf14e92ad5abe362c18acb4e25e94422018 Mon Sep 17 00:00:00 2001 From: Greg Oledzki <762437+mccartney@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:15:06 +0100 Subject: [PATCH 110/118] Use JUnit5's `assertSame` or `assertNotSame` instead of `assertTrue(... == ...)` (#642) * Adding UseAssertSame recipe * Uses -> Use * Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Switch to `visitMethodInvocation` & change method type too * Extract method matchers to constants --------- Co-authored-by: Tim te Beek Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tim te Beek --- .../java/testing/junit5/UseAssertSame.java | 89 ++++++++ .../testing/junit5/UseAssertSameTest.java | 192 ++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java create mode 100644 src/test/java/org/openrewrite/java/testing/junit5/UseAssertSameTest.java diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java b/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java new file mode 100644 index 000000000..920855977 --- /dev/null +++ b/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java @@ -0,0 +1,89 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.openrewrite.ExecutionContext; +import org.openrewrite.Preconditions; +import org.openrewrite.Recipe; +import org.openrewrite.TreeVisitor; +import org.openrewrite.java.JavaIsoVisitor; +import org.openrewrite.java.MethodMatcher; +import org.openrewrite.java.search.UsesMethod; +import org.openrewrite.java.tree.Expression; +import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; + +import java.util.ArrayList; +import java.util.List; + +public class UseAssertSame extends Recipe { + @Override + public String getDisplayName() { + return "Use JUnit5's `assertSame` or `assertNotSame` instead of `assertTrue(... == ...)`"; + } + + @Override + public String getDescription() { + return "Prefers the usage of `assertSame` or `assertNotSame` methods instead of using of vanilla assertTrue " + + "or assertFalse with a boolean comparison."; + } + + private static final MethodMatcher ASSERT_TRUE_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertTrue(..)"); + private static final MethodMatcher ASSERT_FALSE_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertFalse(..)"); + + @Override + public TreeVisitor getVisitor() { + JavaIsoVisitor visitor = new JavaIsoVisitor() { + @Override + public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocation, ExecutionContext ctx) { + J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); + if (!ASSERT_TRUE_MATCHER.matches(mi) && !ASSERT_FALSE_MATCHER.matches(mi)) { + return mi; + } + + Expression firstArgument = mi.getArguments().get(0); + if (!(firstArgument instanceof J.Binary)) { + return mi; + } + J.Binary binary = (J.Binary) firstArgument; + if (binary.getOperator() != J.Binary.Type.Equal && binary.getOperator() != J.Binary.Type.NotEqual) { + return mi; + } + List newArguments = new ArrayList<>(); + newArguments.add(binary.getLeft()); + newArguments.add(binary.getRight()); + newArguments.addAll(mi.getArguments().subList(1, mi.getArguments().size())); + + String newMethodName = binary.getOperator() == J.Binary.Type.Equal == ASSERT_TRUE_MATCHER.matches(mi) ? + "assertSame" : "assertNotSame"; + + maybeRemoveImport("org.junit.jupiter.api.Assertions"); + maybeAddImport("org.junit.jupiter.api.Assertions", newMethodName); + + JavaType.Method newType = ((JavaType.Method) mi.getName().getType()).withName(newMethodName); + return mi.withName(mi.getName().withSimpleName(newMethodName).withType(newType)) + .withMethodType(newType) + .withArguments(newArguments); + } + }; + return Preconditions.check( + Preconditions.or( + new UsesMethod<>(ASSERT_TRUE_MATCHER), + new UsesMethod<>(ASSERT_FALSE_MATCHER)), + visitor); + } + +} diff --git a/src/test/java/org/openrewrite/java/testing/junit5/UseAssertSameTest.java b/src/test/java/org/openrewrite/java/testing/junit5/UseAssertSameTest.java new file mode 100644 index 000000000..d68d05f27 --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/junit5/UseAssertSameTest.java @@ -0,0 +1,192 @@ +/* + * Copyright 2024 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.junit5; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class UseAssertSameTest implements RewriteTest { + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion() + .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9")) + .recipe(new UseAssertSame()); + } + + @DocumentExample + @Test + void assertSameForSimpleBooleanComparison() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertTrue; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = number; + assertTrue(number == otherNumber); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertSame; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = number; + assertSame(number, otherNumber); + } + } + """ + ) + ); + } + + @Test + void usingStringMessage() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertTrue; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = number; + assertTrue(number == otherNumber, "Something is not right"); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertSame; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = number; + assertSame(number, otherNumber, "Something is not right"); + } + } + """ + ) + ); + } + + @Test + void assertFalse() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertFalse; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = "thirty-seven"; + assertFalse(number == otherNumber); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertNotSame; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = "thirty-seven"; + assertNotSame(number, otherNumber); + } + } + """ + ) + ); + } + + @Test + void notEqual() { + //language=java + rewriteRun( + java( + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertTrue; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = "thirty-seven"; + assertTrue(number != otherNumber); + } + } + """, + """ + import org.junit.jupiter.api.Test; + + import static org.junit.jupiter.api.Assertions.assertNotSame; + + class MyTest { + + @Test + public void test() { + String number = "thirty-six"; + String otherNumber = "thirty-seven"; + assertNotSame(number, otherNumber); + } + } + """ + ) + ); + } +} From b20da71aabf8144b4efc4aab2198518428252201 Mon Sep 17 00:00:00 2001 From: Adam Birem Date: Mon, 18 Nov 2024 14:33:07 +0100 Subject: [PATCH 111/118] Add support for Junit 4 matchers on AssertionsArgumentOrder (#637) * Add support for Junit 4 matchers * Rework handling of junit 4 matchers starting with a message. Added support for junit4 assertArrayEquals and assertNull. * Remove excess newline between tests --------- Co-authored-by: Tim te Beek --- .../cleanup/AssertionsArgumentOrder.java | 42 ++- .../cleanup/AssertionsArgumentOrderTest.java | 257 ++++++++++++++++-- 2 files changed, 278 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrder.java b/src/main/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrder.java index 6ff67c3bf..2a56bcca0 100644 --- a/src/main/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrder.java +++ b/src/main/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrder.java @@ -37,8 +37,21 @@ public class AssertionsArgumentOrder extends Recipe { new MethodMatcher("org.junit.jupiter.api.Assertions assertEquals(..)"), new MethodMatcher("org.junit.jupiter.api.Assertions assertNotEquals(..)"), new MethodMatcher("org.junit.jupiter.api.Assertions assertSame(..)"), - new MethodMatcher("org.junit.jupiter.api.Assertions assertNotSame(..)"), - new MethodMatcher("org.junit.jupiter.api.Assertions assertArrayEquals(..)") + new MethodMatcher("org.junit.jupiter.api.Assertions assertNotSame(..)") + }; + + private static final MethodMatcher[] junitAssertMatchers = new MethodMatcher[]{ + new MethodMatcher("org.junit.Assert assertEquals(..)"), + new MethodMatcher("org.junit.Assert assertEquals(..)"), + new MethodMatcher("org.junit.Assert assertArrayEquals(..)"), + new MethodMatcher("org.junit.Assert assertSame(..)"), + new MethodMatcher("org.junit.Assert assertNotSame(..)"), + new MethodMatcher("org.junit.Assert assert*Null(String, Object)") + }; + + private static final MethodMatcher[] junitAssertWithMessageMatchers = new MethodMatcher[]{ + new MethodMatcher("org.junit.Assert assertEquals(String, ..)"), + new MethodMatcher("org.junit.Assert assertArrayEquals(String, ..)") }; private static final MethodMatcher jupiterAssertIterableEqualsMatcher = new MethodMatcher("org.junit.jupiter.api.Assertions assertIterableEquals(..)"); @@ -56,6 +69,8 @@ public class AssertionsArgumentOrder extends Recipe { static { List matchers = new ArrayList<>(Arrays.asList(jupiterAssertionMatchers)); + matchers.addAll(Arrays.asList(junitAssertMatchers)); + matchers.addAll(Arrays.asList(junitAssertWithMessageMatchers)); matchers.add(jupiterAssertIterableEqualsMatcher); matchers.add(jupiterAssertNullMatcher); matchers.addAll(Arrays.asList(testNgMatcher)); @@ -97,7 +112,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu final Expression expected; final Expression actual; - if (isJupiterAssertion(mi)) { + if (isJunitAssertEqualsWithMessage(mi)) { + expected = mi.getArguments().get(1); + actual = mi.getArguments().get(2); + } else if (isJunitAssertion(mi) || isJupiterAssertion(mi)) { expected = mi.getArguments().get(0); actual = mi.getArguments().get(1); } else if (isTestNgAssertion(mi)) { @@ -174,5 +192,23 @@ private boolean isTestNgAssertion(J.MethodInvocation mi) { } return false; } + + private boolean isJunitAssertion(J.MethodInvocation mi) { + for (MethodMatcher assertionMethodMatcher : junitAssertMatchers) { + if (assertionMethodMatcher.matches(mi)) { + return true; + } + } + return false; + } + + private boolean isJunitAssertEqualsWithMessage(J.MethodInvocation mi) { + for (MethodMatcher actExpMatcher : junitAssertWithMessageMatchers) { + if (actExpMatcher.matches(mi)) { + return true; + } + } + return false; + } } } diff --git a/src/test/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrderTest.java b/src/test/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrderTest.java index 80e79f1d6..962faa04e 100644 --- a/src/test/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrderTest.java +++ b/src/test/java/org/openrewrite/java/testing/cleanup/AssertionsArgumentOrderTest.java @@ -18,6 +18,7 @@ import org.junit.jupiter.api.Test; import org.openrewrite.DocumentExample; import org.openrewrite.InMemoryExecutionContext; +import org.openrewrite.Issue; import org.openrewrite.java.JavaParser; import org.openrewrite.test.RecipeSpec; import org.openrewrite.test.RewriteTest; @@ -29,7 +30,7 @@ class AssertionsArgumentOrderTest implements RewriteTest { public void defaults(RecipeSpec spec) { spec.recipe(new AssertionsArgumentOrder()) .parser(JavaParser.fromJavaVersion() - .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9", "testng-7.7")); + .classpathFromResources(new InMemoryExecutionContext(), "junit-jupiter-api-5.9", "testng-7.7", "junit-4.13")); } @DocumentExample @@ -40,7 +41,7 @@ void junitAssertEqualsHavingPrimitiveArg() { java( """ import static org.junit.jupiter.api.Assertions.assertEquals; - + class MyTest { void someMethod() { assertEquals(result(), "result"); @@ -54,7 +55,7 @@ String result() { """, """ import static org.junit.jupiter.api.Assertions.assertEquals; - + class MyTest { void someMethod() { assertEquals("result", result()); @@ -71,14 +72,98 @@ String result() { } @Test - void junitAssertNullAndAssertNotNull() { + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/636") + void junit4AssertEqualsHavingStringArg() { + rewriteRun( + //language=java + java( + """ + import static org.junit.Assert.assertEquals; + + class MyTest { + void someMethod() { + assertEquals(result(), "result"); + assertEquals("result", result()); + assertEquals("message", result(), "result"); + assertEquals("message", "result", result()); + } + String result() { + return "result"; + } + } + """, + """ + import static org.junit.Assert.assertEquals; + + class MyTest { + void someMethod() { + assertEquals("result", result()); + assertEquals("result", result()); + assertEquals("message", "result", result()); + assertEquals("message", "result", result()); + } + String result() { + return "result"; + } + } + """ + ) + ); + } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/636") + void junit4AssertEqualsHavingPrimitiveArg() { + rewriteRun( + //language=java + java( + """ + import static org.junit.Assert.assertEquals; + + class MyTest { + void someMethod() { + assertEquals(0L, 1L); + assertEquals(1L, 0L); + assertEquals(longResult(), 0L); + assertEquals(0L, longResult()); + assertEquals("message", 0L, longResult()); + assertEquals("message", longResult(), 0L); + } + long longResult() { + return 0L; + } + } + """, + """ + import static org.junit.Assert.assertEquals; + + class MyTest { + void someMethod() { + assertEquals(0L, 1L); + assertEquals(1L, 0L); + assertEquals(0L, longResult()); + assertEquals(0L, longResult()); + assertEquals("message", 0L, longResult()); + assertEquals("message", 0L, longResult()); + } + long longResult() { + return 0L; + } + } + """ + ) + ); + } + + @Test + void jupiterAssertNullAndAssertNotNull() { rewriteRun( //language=java java( """ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; - + class MyTest { void someMethod() { assertNull(result(), "message"); @@ -94,7 +179,7 @@ String result() { """ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; - + class MyTest { void someMethod() { assertNull(result(), "message"); @@ -111,6 +196,48 @@ String result() { ); } + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/636") + void junitAssertNullAndAssertNotNull() { + rewriteRun( + //language=java + java( + """ + import static org.junit.Assert.assertNotNull; + import static org.junit.Assert.assertNull; + + class MyTest { + void someMethod() { + assertNull(result(), "message"); + assertNull("message", result()); + assertNotNull(result(), "message"); + assertNotNull("message", result()); + } + String result() { + return "result"; + } + } + """, + """ + import static org.junit.Assert.assertNotNull; + import static org.junit.Assert.assertNull; + + class MyTest { + void someMethod() { + assertNull("message", result()); + assertNull("message", result()); + assertNotNull("message", result()); + assertNotNull("message", result()); + } + String result() { + return "result"; + } + } + """ + ) + ); + } + @Test void jupiterAssertSameNotSame() { rewriteRun( @@ -119,7 +246,7 @@ void jupiterAssertSameNotSame() { """ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertNotSame; - + class MyTest { private static final Integer LIMIT = 0; private static String MESSAGE = ""; @@ -127,7 +254,7 @@ void someMethod() { assertSame(getCount(), LIMIT); assertSame(getCount(), MyTest.LIMIT); assertSame(LIMIT, getCount()); - + assertNotSame(getMsg(), MESSAGE); } String getMsg() { @@ -141,7 +268,61 @@ Integer getCount() { """ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertNotSame; - + + class MyTest { + private static final Integer LIMIT = 0; + private static String MESSAGE = ""; + void someMethod() { + assertSame(LIMIT, getCount()); + assertSame(MyTest.LIMIT, getCount()); + assertSame(LIMIT, getCount()); + + assertNotSame(getMsg(), MESSAGE); + } + String getMsg() { + return ""; + } + Integer getCount() { + return 1; + } + } + """ + ) + ); + } + + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/636") + void junit4AssertSameNotSame() { + rewriteRun( + //language=java + java( + """ + import static org.junit.Assert.assertSame; + import static org.junit.Assert.assertNotSame; + + class MyTest { + private static final Integer LIMIT = 0; + private static String MESSAGE = ""; + void someMethod() { + assertSame(getCount(), LIMIT); + assertSame(getCount(), MyTest.LIMIT); + assertSame(LIMIT, getCount()); + + assertNotSame(getMsg(), MESSAGE); + } + String getMsg() { + return ""; + } + Integer getCount() { + return 1; + } + } + """, + """ + import static org.junit.Assert.assertSame; + import static org.junit.Assert.assertNotSame; + class MyTest { private static final Integer LIMIT = 0; private static String MESSAGE = ""; @@ -149,7 +330,7 @@ void someMethod() { assertSame(LIMIT, getCount()); assertSame(MyTest.LIMIT, getCount()); assertSame(LIMIT, getCount()); - + assertNotSame(getMsg(), MESSAGE); } String getMsg() { @@ -171,7 +352,7 @@ void jupiterAssertArrayEquals() { java( """ import static org.junit.jupiter.api.Assertions.assertArrayEquals; - + class MyTest { void someMethod() { assertArrayEquals(result(), new String[]{""}); @@ -184,7 +365,7 @@ String[] result() { """, """ import static org.junit.jupiter.api.Assertions.assertArrayEquals; - + class MyTest { void someMethod() { assertArrayEquals(new String[]{""}, result()); @@ -199,6 +380,46 @@ String[] result() { ); } + @Test + @Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/636") + void junitAssertArrayEquals() { + rewriteRun( + //language=java + java( + """ + import static org.junit.Assert.assertArrayEquals; + + class MyTest { + void someMethod() { + assertArrayEquals(result(), new String[]{""}); + assertArrayEquals(new String[]{""}, result()); + assertArrayEquals("message", new String[]{""}, result()); + assertArrayEquals("message", result(), new String[]{""}); + } + String[] result() { + return null; + } + } + """, + """ + import static org.junit.Assert.assertArrayEquals; + + class MyTest { + void someMethod() { + assertArrayEquals(new String[]{""}, result()); + assertArrayEquals(new String[]{""}, result()); + assertArrayEquals("message", new String[]{""}, result()); + assertArrayEquals("message", new String[]{""}, result()); + } + String[] result() { + return null; + } + } + """ + ) + ); + } + @Test void junitIterableEquals() { rewriteRun( @@ -208,9 +429,9 @@ void junitIterableEquals() { import java.util.ArrayList; import java.util.Collections; import java.util.List; - + import static org.junit.jupiter.api.Assertions.assertIterableEquals; - + class MyTest { static final Iterable COSNT_LIST = new ArrayList<>(); void someTest() { @@ -227,9 +448,9 @@ List doubleList() { import java.util.ArrayList; import java.util.Collections; import java.util.List; - + import static org.junit.jupiter.api.Assertions.assertIterableEquals; - + class MyTest { static final Iterable COSNT_LIST = new ArrayList<>(); void someTest() { @@ -253,7 +474,7 @@ void ngAssertions() { java( """ import static org.testng.Assert.assertEquals; - + class MyTest { void someTest() { assertEquals("abc", someString()); @@ -266,7 +487,7 @@ String someString() { """, """ import static org.testng.Assert.assertEquals; - + class MyTest { void someTest() { assertEquals(someString(), "abc"); From d16c0a79ea57045f0e4ed46f1d1010115077a8bf Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Wed, 20 Nov 2024 08:55:17 +0100 Subject: [PATCH 112/118] Polish `UseAssertSame` Try a bit harder to find and apply the correct `JavaType.Method` so that other recipes can rely on correct type attribution. --- .../java/testing/junit5/UseAssertSame.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java b/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java index 920855977..1dc6f250f 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UseAssertSame.java @@ -37,8 +37,8 @@ public String getDisplayName() { @Override public String getDescription() { - return "Prefers the usage of `assertSame` or `assertNotSame` methods instead of using of vanilla assertTrue " + - "or assertFalse with a boolean comparison."; + return "Prefers the usage of `assertSame` or `assertNotSame` methods instead of using of vanilla `assertTrue` " + + "or `assertFalse` with a boolean comparison."; } private static final MethodMatcher ASSERT_TRUE_MATCHER = new MethodMatcher("org.junit.jupiter.api.Assertions assertTrue(..)"); @@ -52,6 +52,8 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocat J.MethodInvocation mi = super.visitMethodInvocation(methodInvocation, ctx); if (!ASSERT_TRUE_MATCHER.matches(mi) && !ASSERT_FALSE_MATCHER.matches(mi)) { return mi; + } else if (mi.getMethodType() == null) { + return mi; } Expression firstArgument = mi.getArguments().get(0); @@ -73,11 +75,26 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocat maybeRemoveImport("org.junit.jupiter.api.Assertions"); maybeAddImport("org.junit.jupiter.api.Assertions", newMethodName); - JavaType.Method newType = ((JavaType.Method) mi.getName().getType()).withName(newMethodName); + JavaType.Method newType = assertSameMethodType(mi, newMethodName); return mi.withName(mi.getName().withSimpleName(newMethodName).withType(newType)) .withMethodType(newType) .withArguments(newArguments); } + + private JavaType.Method assertSameMethodType(J.MethodInvocation mi, String newMethodName) { + JavaType.Method assertTrue = mi.getMethodType(); + assert assertTrue != null; + int parameterCount = assertTrue.getParameterTypes().size(); + JavaType.FullyQualified assertions = assertTrue.getDeclaringType(); + for (JavaType.Method method : assertions.getMethods()) { + if (method.getName().equals("assertSame") && method.getParameterNames().size() == parameterCount + 1 && + assertTrue.getParameterTypes().get(parameterCount - 1).equals(method.getParameterTypes().get(parameterCount))) { + return method; + } + } + // fallback when type attribution was stubbed + return assertTrue.withName(newMethodName); + } }; return Preconditions.check( Preconditions.or( From f9cc74cd747fd815bc428cef52606ee083186a32 Mon Sep 17 00:00:00 2001 From: Shannon Pamperl Date: Wed, 20 Nov 2024 21:38:51 +0000 Subject: [PATCH 113/118] refactor: Update Gradle wrapper Use this link to re-run the recipe: https://app.moderne.io/recipes/org.openrewrite.gradle.UpdateGradleWrapper?organizationId=T3BlblJld3JpdGU%3D#defaults=W3sibmFtZSI6ImFkZElmTWlzc2luZyIsInZhbHVlIjoiRmFsc2UifV0= Co-authored-by: Moderne --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 571bbea59..2f2f53604 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionSha256Sum=57dafb5c2622c6cc08b993c85b7c06956a2f53536432a30ead46166dbca0f1e9 +distributionSha256Sum=f397b287023acdba1e9f6fc5ea72d22dd63669d59ed4a289a29b1a76eee151c6 From a530dbe676a1f93e88fbfe1009fbe72c1ad71554 Mon Sep 17 00:00:00 2001 From: Sam Snyder Date: Thu, 21 Nov 2024 12:57:35 -0800 Subject: [PATCH 114/118] Unconditionally add the import for assertThrows, got a report where the template adds the method successfully but with missing type attribution for assertThrows so the import was missing --- .../java/testing/junit5/ExpectedExceptionToAssertThrows.java | 4 +++- .../openrewrite/java/testing/junit5/UpdateTestAnnotation.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java index 9d4dfb004..78a5d3fe5 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/ExpectedExceptionToAssertThrows.java @@ -182,7 +182,9 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration methodDecl m = m.withBody(m.getBody().withPrefix(thrown.get(0).getPrefix())).withThrows(Collections.emptyList()); } - maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows"); + // Unconditionally add the import for assertThrows, got a report where the above template adds the method successfully + // but with missing type attribution for assertThrows so the import was missing + maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows", false); if (expectMessageMethodInvocation != null && !isExpectMessageArgAMatcher && m.getBody() != null) { m = JavaTemplate.builder("assertTrue(exception.getMessage().contains(#{any(java.lang.String)}));") diff --git a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java index 7031cf792..ddae37181 100644 --- a/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java +++ b/src/main/java/org/openrewrite/java/testing/junit5/UpdateTestAnnotation.java @@ -150,7 +150,9 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex .build() .apply(updateCursor(m), m.getCoordinates().replaceBody(), cta.expectedException, lambda); m = m.withThrows(Collections.emptyList()); - maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows"); + // Unconditionally add the import for assertThrows, got a report where the above template adds the method successfully + // but with missing type attribution for assertThrows so the import was missing + maybeAddImport("org.junit.jupiter.api.Assertions", "assertThrows", false); } } if (cta.timeout != null) { From 0f8f8381bde682789f7b0f72b3aa7668c041935b Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sat, 23 Nov 2024 16:13:28 +0100 Subject: [PATCH 115/118] Move HtmlUnit migrations to rewrite-testing-frameworks (#643) * Move HtmlUnit migrations to rewrite-testing-frameworks Coming from rewrite-jenkins * Add explicit new 3.x versions --- build.gradle.kts | 1 + .../resources/META-INF/rewrite/htmlunit.yml | 45 ++++++++++ .../htmlunit/UpgradeHtmlUnit3Test.java | 90 +++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 src/main/resources/META-INF/rewrite/htmlunit.yml create mode 100644 src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java diff --git a/build.gradle.kts b/build.gradle.kts index d29963509..c43a20a97 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -67,6 +67,7 @@ dependencies { testRuntimeOnly("net.datafaker:datafaker:latest.release") { exclude(group = "org.yaml", module = "snakeyaml") } + testRuntimeOnly("net.sourceforge.htmlunit:htmlunit:2.+") testRuntimeOnly("org.mockito.kotlin:mockito-kotlin:latest.release") testRuntimeOnly("org.testcontainers:testcontainers:latest.release") testRuntimeOnly("org.testcontainers:nginx:latest.release") diff --git a/src/main/resources/META-INF/rewrite/htmlunit.yml b/src/main/resources/META-INF/rewrite/htmlunit.yml new file mode 100644 index 000000000..3995efa2f --- /dev/null +++ b/src/main/resources/META-INF/rewrite/htmlunit.yml @@ -0,0 +1,45 @@ +# +# Copyright 2024 the original author or authors. +#

    +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +#

    +# https://www.apache.org/licenses/LICENSE-2.0 +#

    +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.testing.htmlunit.UpgradeHtmlUnit_3 +displayName: Migrate to HtmlUnit 3.x +description: >- + Automates the HtmlUnit [migration guide](https://htmlunit.sourceforge.io/migration.html) from 2.x to 3.x. +recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: net.sourceforge.htmlunit + oldArtifactId: '*' + newGroupId: org.htmlunit + newVersion: 3.x + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: com.gargoylesoftware + oldArtifactId: HTMLUnit + newGroupId: org.htmlunit + newArtifactId: htmlunit + newVersion: 3.x + - org.openrewrite.java.ChangePackage: + oldPackageName: com.gargoylesoftware.htmlunit + newPackageName: org.htmlunit + recursive: true + - org.openrewrite.java.ChangeMethodName: + methodPattern: org.htmlunit.html.HtmlInput getValueAttribute() + newMethodName: getValue + matchOverrides: true + - org.openrewrite.java.ChangeMethodName: + methodPattern: org.htmlunit.html.HtmlInput setValueAttribute(String) + newMethodName: setValue + matchOverrides: true diff --git a/src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java b/src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java new file mode 100644 index 000000000..f4de2f45d --- /dev/null +++ b/src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java @@ -0,0 +1,90 @@ +/* + * Copyright 2023 the original author or authors. + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * https://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.java.testing.htmlunit; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.java.JavaParser; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class UpgradeHtmlUnit3Test implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec + .parser(JavaParser.fromJavaVersion().classpath("htmlunit")) + .recipeFromResource("/META-INF/rewrite/htmlunit.yml", "org.openrewrite.java.testing.htmlunit.UpgradeHtmlUnit_3"); + } + + @Test + @DocumentExample + void shouldUpdateHtmlUnit() { + rewriteRun( + //language=java + java( + """ + import com.gargoylesoftware.htmlunit.WebClient; + import com.gargoylesoftware.htmlunit.html.HtmlForm; + import com.gargoylesoftware.htmlunit.html.HtmlInput; + import com.gargoylesoftware.htmlunit.html.HtmlPage; + + import java.io.IOException; + + public class HtmlUnitUse { + void run() throws IOException { + try (WebClient webClient = new WebClient()) { + HtmlPage page = webClient.getPage("https://htmlunit.sourceforge.io/"); + HtmlForm form = page.getFormByName("config"); + HtmlInput a = form.getInputByName("a"); + String value = a.getValueAttribute(); + assert "".equals(value); + a.setAttribute("value", "up2"); + a.setAttribute("value2", "leave"); + a.setValueAttribute("updated"); + } + } + } + """, + """ + import org.htmlunit.WebClient; + import org.htmlunit.html.HtmlForm; + import org.htmlunit.html.HtmlInput; + import org.htmlunit.html.HtmlPage; + + import java.io.IOException; + + public class HtmlUnitUse { + void run() throws IOException { + try (WebClient webClient = new WebClient()) { + HtmlPage page = webClient.getPage("https://htmlunit.sourceforge.io/"); + HtmlForm form = page.getFormByName("config"); + HtmlInput a = form.getInputByName("a"); + String value = a.getValue(); + assert "".equals(value); + a.setAttribute("value", "up2"); + a.setAttribute("value2", "leave"); + a.setValue("updated"); + } + } + } + """ + ) + ); + } +} From 72dbc65f6fa12a93d0cf42a79330491d0f5865b4 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Mon, 25 Nov 2024 17:56:52 +0100 Subject: [PATCH 116/118] Prevent class cast exception in MockitoWhenOnStaticToMockStatic Fixes #644 --- .../MockitoWhenOnStaticToMockStatic.java | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java b/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java index 7836ca0e9..52c9c9200 100644 --- a/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java +++ b/src/main/java/org/openrewrite/java/testing/mockito/MockitoWhenOnStaticToMockStatic.java @@ -75,34 +75,19 @@ private List maybeWrapStatementsInTryWithResourcesMockedStatic(J.Meth if (when != null && when.getArguments().get(0) instanceof J.MethodInvocation) { J.MethodInvocation whenArg = (J.MethodInvocation) when.getArguments().get(0); if (whenArg.getMethodType() != null && whenArg.getMethodType().hasFlags(Flag.Static)) { - J.Identifier clazz = (J.Identifier) whenArg.getSelect(); - if (clazz != null && clazz.getType() != null) { - String mockName = VariableNameUtils.generateVariableName("mock" + clazz.getSimpleName(), updateCursor(m), VariableNameUtils.GenerationStrategy.INCREMENT_NUMBER); - maybeAddImport("org.mockito.MockedStatic", false); - maybeAddImport("org.mockito.Mockito", "mockStatic"); - String template = String.format( - "try(MockedStatic<%1$s> %2$s = mockStatic(%1$s.class)) {\n" + - " %2$s.when(#{any()}).thenReturn(#{any()});\n" + - "}", clazz.getSimpleName(), mockName); - J.Try try_ = (J.Try) ((J.MethodDeclaration) JavaTemplate.builder(template) - .contextSensitive() - .imports("org.mockito.MockedStatic") - .staticImports("org.mockito.Mockito.mockStatic") - .build() - .apply(getCursor(), m.getCoordinates().replaceBody(), - whenArg, ((J.MethodInvocation) statement).getArguments().get(0))) - .getBody().getStatements().get(0); - - restInTry.set(true); - - List precedingStatements = remainingStatements.subList(0, index); - return try_.withBody(try_.getBody().withStatements(ListUtils.concatAll( - try_.getBody().getStatements(), - maybeWrapStatementsInTryWithResourcesMockedStatic( - m.withBody(m.getBody().withStatements(ListUtils.concat(precedingStatements, try_))), - remainingStatements.subList(index + 1, remainingStatements.size()) - )))) - .withPrefix(statement.getPrefix()); + if (whenArg.getSelect() instanceof J.Identifier) { + J.Identifier clazz = (J.Identifier) whenArg.getSelect(); + if (clazz.getType() != null) { + return tryWithMockedStatic(m, remainingStatements, index, statement, clazz.getSimpleName(), whenArg, restInTry); + } + } else if (whenArg.getSelect() instanceof J.FieldAccess) { + J.FieldAccess fieldAccess = (J.FieldAccess) whenArg.getSelect(); + if (fieldAccess.getTarget() instanceof J.Identifier) { + J.Identifier clazz = (J.Identifier) fieldAccess.getTarget(); + if (clazz.getType() != null) { + return tryWithMockedStatic(m, remainingStatements, index, statement, clazz.getSimpleName(), whenArg, restInTry); + } + } } } } @@ -110,6 +95,42 @@ private List maybeWrapStatementsInTryWithResourcesMockedStatic(J.Meth return statement; }); } + + private J.Try tryWithMockedStatic( + J.MethodDeclaration m, + List remainingStatements, + Integer index, + Statement statement, + String simpleName, + J.MethodInvocation whenArg, + AtomicBoolean restInTry) { + String mockName = VariableNameUtils.generateVariableName("mock" + simpleName, updateCursor(m), VariableNameUtils.GenerationStrategy.INCREMENT_NUMBER); + maybeAddImport("org.mockito.MockedStatic", false); + maybeAddImport("org.mockito.Mockito", "mockStatic"); + String template = String.format( + "try(MockedStatic<%1$s> %2$s = mockStatic(%1$s.class)) {\n" + + " %2$s.when(#{any()}).thenReturn(#{any()});\n" + + "}", simpleName, mockName); + J.Try try_ = (J.Try) ((J.MethodDeclaration) JavaTemplate.builder(template) + .contextSensitive() + .imports("org.mockito.MockedStatic") + .staticImports("org.mockito.Mockito.mockStatic") + .build() + .apply(getCursor(), m.getCoordinates().replaceBody(), + whenArg, ((J.MethodInvocation) statement).getArguments().get(0))) + .getBody().getStatements().get(0); + + restInTry.set(true); + + List precedingStatements = remainingStatements.subList(0, index); + return try_.withBody(try_.getBody().withStatements(ListUtils.concatAll( + try_.getBody().getStatements(), + maybeWrapStatementsInTryWithResourcesMockedStatic( + m.withBody(m.getBody().withStatements(ListUtils.concat(precedingStatements, try_))), + remainingStatements.subList(index + 1, remainingStatements.size()) + )))) + .withPrefix(statement.getPrefix()); + } }); } } From ccbc1381a751eef29303aabf60e976219d545d98 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 27 Nov 2024 16:43:47 +0100 Subject: [PATCH 117/118] Drop HtmlUnit to prevent circular dependency --- build.gradle.kts | 1 - .../resources/META-INF/rewrite/htmlunit.yml | 45 ---------- .../htmlunit/UpgradeHtmlUnit3Test.java | 90 ------------------- 3 files changed, 136 deletions(-) delete mode 100644 src/main/resources/META-INF/rewrite/htmlunit.yml delete mode 100644 src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java diff --git a/build.gradle.kts b/build.gradle.kts index c43a20a97..d29963509 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -67,7 +67,6 @@ dependencies { testRuntimeOnly("net.datafaker:datafaker:latest.release") { exclude(group = "org.yaml", module = "snakeyaml") } - testRuntimeOnly("net.sourceforge.htmlunit:htmlunit:2.+") testRuntimeOnly("org.mockito.kotlin:mockito-kotlin:latest.release") testRuntimeOnly("org.testcontainers:testcontainers:latest.release") testRuntimeOnly("org.testcontainers:nginx:latest.release") diff --git a/src/main/resources/META-INF/rewrite/htmlunit.yml b/src/main/resources/META-INF/rewrite/htmlunit.yml deleted file mode 100644 index 3995efa2f..000000000 --- a/src/main/resources/META-INF/rewrite/htmlunit.yml +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright 2024 the original author or authors. -#

    -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -#

    -# https://www.apache.org/licenses/LICENSE-2.0 -#

    -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# ---- -type: specs.openrewrite.org/v1beta/recipe -name: org.openrewrite.java.testing.htmlunit.UpgradeHtmlUnit_3 -displayName: Migrate to HtmlUnit 3.x -description: >- - Automates the HtmlUnit [migration guide](https://htmlunit.sourceforge.io/migration.html) from 2.x to 3.x. -recipeList: - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: net.sourceforge.htmlunit - oldArtifactId: '*' - newGroupId: org.htmlunit - newVersion: 3.x - - org.openrewrite.java.dependencies.ChangeDependency: - oldGroupId: com.gargoylesoftware - oldArtifactId: HTMLUnit - newGroupId: org.htmlunit - newArtifactId: htmlunit - newVersion: 3.x - - org.openrewrite.java.ChangePackage: - oldPackageName: com.gargoylesoftware.htmlunit - newPackageName: org.htmlunit - recursive: true - - org.openrewrite.java.ChangeMethodName: - methodPattern: org.htmlunit.html.HtmlInput getValueAttribute() - newMethodName: getValue - matchOverrides: true - - org.openrewrite.java.ChangeMethodName: - methodPattern: org.htmlunit.html.HtmlInput setValueAttribute(String) - newMethodName: setValue - matchOverrides: true diff --git a/src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java b/src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java deleted file mode 100644 index f4de2f45d..000000000 --- a/src/test/java/org/openrewrite/java/testing/htmlunit/UpgradeHtmlUnit3Test.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2023 the original author or authors. - *

    - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

    - * https://www.apache.org/licenses/LICENSE-2.0 - *

    - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.openrewrite.java.testing.htmlunit; - -import org.junit.jupiter.api.Test; -import org.openrewrite.DocumentExample; -import org.openrewrite.java.JavaParser; -import org.openrewrite.test.RecipeSpec; -import org.openrewrite.test.RewriteTest; - -import static org.openrewrite.java.Assertions.java; - -class UpgradeHtmlUnit3Test implements RewriteTest { - - @Override - public void defaults(RecipeSpec spec) { - spec - .parser(JavaParser.fromJavaVersion().classpath("htmlunit")) - .recipeFromResource("/META-INF/rewrite/htmlunit.yml", "org.openrewrite.java.testing.htmlunit.UpgradeHtmlUnit_3"); - } - - @Test - @DocumentExample - void shouldUpdateHtmlUnit() { - rewriteRun( - //language=java - java( - """ - import com.gargoylesoftware.htmlunit.WebClient; - import com.gargoylesoftware.htmlunit.html.HtmlForm; - import com.gargoylesoftware.htmlunit.html.HtmlInput; - import com.gargoylesoftware.htmlunit.html.HtmlPage; - - import java.io.IOException; - - public class HtmlUnitUse { - void run() throws IOException { - try (WebClient webClient = new WebClient()) { - HtmlPage page = webClient.getPage("https://htmlunit.sourceforge.io/"); - HtmlForm form = page.getFormByName("config"); - HtmlInput a = form.getInputByName("a"); - String value = a.getValueAttribute(); - assert "".equals(value); - a.setAttribute("value", "up2"); - a.setAttribute("value2", "leave"); - a.setValueAttribute("updated"); - } - } - } - """, - """ - import org.htmlunit.WebClient; - import org.htmlunit.html.HtmlForm; - import org.htmlunit.html.HtmlInput; - import org.htmlunit.html.HtmlPage; - - import java.io.IOException; - - public class HtmlUnitUse { - void run() throws IOException { - try (WebClient webClient = new WebClient()) { - HtmlPage page = webClient.getPage("https://htmlunit.sourceforge.io/"); - HtmlForm form = page.getFormByName("config"); - HtmlInput a = form.getInputByName("a"); - String value = a.getValue(); - assert "".equals(value); - a.setAttribute("value", "up2"); - a.setAttribute("value2", "leave"); - a.setValue("updated"); - } - } - } - """ - ) - ); - } -} From b0df4ccdca79dcd145bdfc90bd45197b41af035f Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 27 Nov 2024 16:51:00 +0100 Subject: [PATCH 118/118] Add testImplementation("org.openrewrite:rewrite-test") --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index d29963509..7c8f3bcef 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -49,6 +49,7 @@ dependencies { testImplementation("org.openrewrite:rewrite-java-17") testImplementation("org.openrewrite:rewrite-groovy") + testImplementation("org.openrewrite:rewrite-test") testImplementation("org.openrewrite:rewrite-kotlin:$rewriteVersion") testImplementation("org.openrewrite.gradle.tooling:model:$rewriteVersion")