Skip to content

Commit 7a07f04

Browse files
authored
Limit Hamcrest replacements by type (#469)
Fixes #468
1 parent affabc8 commit 7a07f04

File tree

5 files changed

+128
-64
lines changed

5 files changed

+128
-64
lines changed

src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestIsMatcherToAssertJ.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation methodInvocat
5252
String replacement = 2 <= arguments.size() &&
5353
TypeUtils.asArray(arguments.get(arguments.size() - 2).getType()) != null ?
5454
"containsExactly" : "isEqualTo";
55-
doAfterVisit(new HamcrestMatcherToAssertJ("is", replacement).getVisitor());
55+
doAfterVisit(new HamcrestMatcherToAssertJ("is", replacement, null).getVisitor());
5656

5757
return super.visitMethodInvocation(methodInvocation, ctx);
5858
}

src/main/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJ.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.openrewrite.java.tree.Expression;
2929
import org.openrewrite.java.tree.J;
3030
import org.openrewrite.java.tree.JavaType;
31+
import org.openrewrite.java.tree.TypeUtils;
3132

3233
import java.util.ArrayList;
3334
import java.util.List;
@@ -51,6 +52,13 @@ public class HamcrestMatcherToAssertJ extends Recipe {
5152
@Nullable
5253
String assertion;
5354

55+
@Option(displayName = "Argument Type",
56+
description = "The type of the argument to the Hamcrest `Matcher`.",
57+
example = "java.math.BigDecimal",
58+
required = false)
59+
@Nullable
60+
String argumentType;
61+
5462
@Override
5563
public String getDisplayName() {
5664
return "Migrate from Hamcrest `Matcher` to AssertJ";
@@ -71,7 +79,6 @@ private class MigrateToAssertJVisitor extends JavaIsoVisitor<ExecutionContext> {
7179
private final MethodMatcher matchersMatcher = new MethodMatcher("org.hamcrest.*Matchers " + matcher + "(..)");
7280
private final MethodMatcher subMatcher = new MethodMatcher("org.hamcrest.*Matchers *(org.hamcrest.Matcher)");
7381

74-
7582
@Override
7683
public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
7784
J.MethodInvocation mi = super.visitMethodInvocation(method, ctx);
@@ -89,6 +96,10 @@ private J.MethodInvocation replace(J.MethodInvocation mi, ExecutionContext ctx)
8996
if (!matchersMatcher.matches(matcherArgument) || subMatcher.matches(matcherArgument)) {
9097
return mi;
9198
}
99+
if (argumentType != null && !TypeUtils.isOfClassType(actualArgument.getType(), argumentType)) {
100+
return mi;
101+
}
102+
92103
String actual = typeToIndicator(actualArgument.getType());
93104
J.MethodInvocation matcherArgumentMethod = (J.MethodInvocation) matcherArgument;
94105
JavaTemplate template = JavaTemplate.builder(String.format(

src/main/resources/META-INF/rewrite/hamcrest.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ recipeList:
5454
- org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ:
5555
matcher: comparesEqualTo
5656
assertion: isEqualTo
57+
argumentType: java.lang.String
58+
- org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ:
59+
matcher: comparesEqualTo
60+
assertion: isEqualByComparingTo
61+
5762
- org.openrewrite.java.testing.hamcrest.HamcrestMatcherToAssertJ:
5863
matcher: equalTo
5964
assertion: isEqualTo

src/test/java/org/openrewrite/java/testing/hamcrest/HamcrestMatcherToAssertJTest.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class DoNotConvert {
4141
@Test
4242
void notMatcher() {
4343
rewriteRun(
44-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("not", "isNotEqualTo")),
44+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("not", "isNotEqualTo", null)),
4545
//language=java
4646
java(
4747
"""
@@ -64,7 +64,7 @@ void test() {
6464
@Test
6565
void isMatcher() {
6666
rewriteRun(
67-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("is", "isEqualTo")),
67+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("is", "isEqualTo", null)),
6868
//language=java
6969
java(
7070
"""
@@ -87,7 +87,7 @@ void test() {
8787
@Test
8888
void anyOfVarargsMatcher() {
8989
rewriteRun(
90-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("is", "isEqualTo")),
90+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("is", "isEqualTo", null)),
9191
//language=java
9292
java(
9393
"""
@@ -110,7 +110,7 @@ void test() {
110110
@Test
111111
void anyOfIterableMatcher() {
112112
rewriteRun(
113-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("is", "isEqualTo")),
113+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("is", "isEqualTo", null)),
114114
//language=java
115115
java(
116116
"""
@@ -137,7 +137,7 @@ class NoArgument {
137137
@Test
138138
void isEmpty() {
139139
rewriteRun(
140-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("isEmptyString", "isEmpty")),
140+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("isEmptyString", "isEmpty", null)),
141141
//language=java
142142
java(
143143
"""
@@ -173,7 +173,7 @@ void test() {
173173
@Test
174174
void coreMatchers() {
175175
rewriteRun(
176-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("startsWith", "startsWith")),
176+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("startsWith", "startsWith", null)),
177177
//language=java
178178
java(
179179
"""
@@ -214,7 +214,7 @@ class TwoArguments {
214214
@DocumentExample
215215
void equalToString() {
216216
rewriteRun(
217-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo")),
217+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo", null)),
218218
//language=java
219219
java(
220220
"""
@@ -252,7 +252,7 @@ void test() {
252252
@Test
253253
void equalToStringLiteral() {
254254
rewriteRun(
255-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo")),
255+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo", null)),
256256
//language=java
257257
java(
258258
"""
@@ -288,7 +288,7 @@ void test() {
288288
@Test
289289
void equalToObject() {
290290
rewriteRun(
291-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo")),
291+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo", null)),
292292
//language=java
293293
java(
294294
"""
@@ -336,7 +336,7 @@ void test() {
336336
@Test
337337
void lessThanNumber() {
338338
rewriteRun(
339-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("lessThan", "isLessThan")),
339+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("lessThan", "isLessThan", null)),
340340
//language=java
341341
java(
342342
"""
@@ -375,7 +375,7 @@ void test() {
375375
@Test
376376
void containsInAnyOrderWithArray() {
377377
rewriteRun(
378-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("containsInAnyOrder", "containsExactlyInAnyOrder")),
378+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("containsInAnyOrder", "containsExactlyInAnyOrder", null)),
379379
//language=java
380380
java(
381381
"""
@@ -418,7 +418,7 @@ void test() {
418418
@Test
419419
void closeToTest() {
420420
rewriteRun(
421-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("closeTo", "isCloseTo")),
421+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("closeTo", "isCloseTo", null)),
422422
//language=java
423423
java(
424424
"""
@@ -453,7 +453,7 @@ void replaceCloseTo() {
453453
@Test
454454
void closeToWorksWithBigDecimal() {
455455
rewriteRun(
456-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("closeTo", "isCloseTo")),
456+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("closeTo", "isCloseTo", null)),
457457
//language=java
458458
java(
459459
"""
@@ -499,7 +499,7 @@ class ThreeArguments {
499499
@Test
500500
void reasonAsLiteral() {
501501
rewriteRun(
502-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo")),
502+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo", null)),
503503
//language=java
504504
java(
505505
"""
@@ -537,7 +537,7 @@ void test() {
537537
@Test
538538
void reasonAsMethodCall() {
539539
rewriteRun(
540-
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo")),
540+
spec -> spec.recipe(new HamcrestMatcherToAssertJ("equalTo", "isEqualTo", null)),
541541
//language=java
542542
java(
543543
"""

src/test/java/org/openrewrite/java/testing/hamcrest/MigrateHamcrestToAssertJTest.java

Lines changed: 95 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -60,55 +60,56 @@ void isEqualTo() {
6060
//language=java
6161
rewriteRun(
6262
java(
63-
"""
64-
class Biscuit {
65-
String name;
66-
Biscuit(String name) {
67-
this.name = name;
68-
}
69-
70-
int getChocolateChipCount() {
71-
return 10;
72-
}
63+
"""
64+
class Biscuit {
65+
String name;
66+
Biscuit(String name) {
67+
this.name = name;
68+
}
69+
70+
int getChocolateChipCount() {
71+
return 10;
72+
}
7373
74-
int getHazelnutCount() {
75-
return 3;
76-
}
77-
}
78-
"""),
74+
int getHazelnutCount() {
75+
return 3;
76+
}
77+
}
78+
"""),
7979
java(
80-
"""
81-
import org.junit.jupiter.api.Test;
82-
83-
import static org.hamcrest.MatcherAssert.assertThat;
84-
import static org.hamcrest.Matchers.*;
85-
86-
public class BiscuitTest {
87-
@Test
88-
public void biscuits() {
89-
Biscuit theBiscuit = new Biscuit("Ginger");
90-
Biscuit myBiscuit = new Biscuit("Ginger");
91-
assertThat(theBiscuit, equalTo(myBiscuit));
92-
assertThat("chocolate chips", theBiscuit.getChocolateChipCount(), equalTo(10));
93-
assertThat("hazelnuts", theBiscuit.getHazelnutCount(), equalTo(3));
94-
}
95-
}
96-
""", """
97-
import org.junit.jupiter.api.Test;
98-
99-
import static org.assertj.core.api.Assertions.assertThat;
100-
101-
public class BiscuitTest {
102-
@Test
103-
public void biscuits() {
104-
Biscuit theBiscuit = new Biscuit("Ginger");
105-
Biscuit myBiscuit = new Biscuit("Ginger");
106-
assertThat(theBiscuit).isEqualTo(myBiscuit);
107-
assertThat(theBiscuit.getChocolateChipCount()).as("chocolate chips").isEqualTo(10);
108-
assertThat(theBiscuit.getHazelnutCount()).as("hazelnuts").isEqualTo(3);
109-
}
110-
}
111-
"""));
80+
"""
81+
import org.junit.jupiter.api.Test;
82+
83+
import static org.hamcrest.MatcherAssert.assertThat;
84+
import static org.hamcrest.Matchers.*;
85+
86+
public class BiscuitTest {
87+
@Test
88+
public void biscuits() {
89+
Biscuit theBiscuit = new Biscuit("Ginger");
90+
Biscuit myBiscuit = new Biscuit("Ginger");
91+
assertThat(theBiscuit, equalTo(myBiscuit));
92+
assertThat("chocolate chips", theBiscuit.getChocolateChipCount(), equalTo(10));
93+
assertThat("hazelnuts", theBiscuit.getHazelnutCount(), equalTo(3));
94+
}
95+
}
96+
""",
97+
"""
98+
import org.junit.jupiter.api.Test;
99+
100+
import static org.assertj.core.api.Assertions.assertThat;
101+
102+
public class BiscuitTest {
103+
@Test
104+
public void biscuits() {
105+
Biscuit theBiscuit = new Biscuit("Ginger");
106+
Biscuit myBiscuit = new Biscuit("Ginger");
107+
assertThat(theBiscuit).isEqualTo(myBiscuit);
108+
assertThat(theBiscuit.getChocolateChipCount()).as("chocolate chips").isEqualTo(10);
109+
assertThat(theBiscuit.getHazelnutCount()).as("hazelnuts").isEqualTo(3);
110+
}
111+
}
112+
"""));
112113
}
113114

114115
@Test
@@ -623,4 +624,51 @@ void assertjGradleDependencyAddedWithTestScope() {
623624
}
624625
}
625626

627+
@Nested
628+
class Issues {
629+
@Test
630+
@Issue("https://github.com/openrewrite/rewrite-testing-frameworks/issues/468")
631+
void comparesEqualToBigDecimals() {
632+
//language=java
633+
rewriteRun(
634+
java(
635+
"""
636+
import static org.hamcrest.MatcherAssert.assertThat;
637+
import static org.hamcrest.Matchers.comparesEqualTo;
638+
import java.math.BigDecimal;
639+
640+
class A {
641+
void foo() {
642+
var a = new BigDecimal("1");
643+
var b = new BigDecimal("1.00");
644+
assertThat(a, comparesEqualTo(b));
645+
}
646+
void bar() {
647+
var a = "1";
648+
var b = "1.00";
649+
assertThat(a, comparesEqualTo(b));
650+
}
651+
}
652+
""",
653+
"""
654+
import static org.assertj.core.api.Assertions.assertThat;
655+
import java.math.BigDecimal;
656+
657+
class A {
658+
void foo() {
659+
var a = new BigDecimal("1");
660+
var b = new BigDecimal("1.00");
661+
assertThat(a).isEqualByComparingTo(b);
662+
}
663+
void bar() {
664+
var a = "1";
665+
var b = "1.00";
666+
assertThat(a).isEqualTo(b);
667+
}
668+
}
669+
"""
670+
)
671+
);
672+
}
673+
}
626674
}

0 commit comments

Comments
 (0)