Skip to content

Commit b7a4818

Browse files
Extract withSourceTypesOnClasspath to shared Assertions helper, add integration test
Move the withSourceTypesOnClasspath test helper from private methods in ChangePackageTest and ChangeTypeTest to a public static method in Assertions.java so it can be reused across test classes. Add an end-to-end integration test in ChangeDependencyGroupIdAndArtifactIdTest that composes ChangeDependencyGroupIdAndArtifactId with ChangePackage to verify that import renaming works correctly when the JavaSourceSet is updated by the dependency change recipe.
1 parent 48f89f5 commit b7a4818

4 files changed

Lines changed: 122 additions & 77 deletions

File tree

rewrite-java-test/src/test/java/org/openrewrite/java/ChangePackageTest.java

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,31 +20,26 @@
2020
import org.openrewrite.DocumentExample;
2121
import org.openrewrite.InMemoryExecutionContext;
2222
import org.openrewrite.Issue;
23-
import org.openrewrite.SourceFile;
24-
import org.openrewrite.java.marker.JavaSourceSet;
2523
import org.openrewrite.java.search.FindTypes;
2624
import org.openrewrite.java.tree.J;
2725
import org.openrewrite.java.tree.JavaType;
28-
import org.openrewrite.java.tree.JavaSourceFile;
2926
import org.openrewrite.java.tree.NameTree;
3027
import org.openrewrite.java.tree.TypeUtils;
3128
import org.openrewrite.test.RecipeSpec;
3229
import org.openrewrite.test.RewriteTest;
3330
import org.openrewrite.test.SourceSpec;
34-
import org.openrewrite.test.UncheckedConsumer;
3531

3632
import java.nio.file.Path;
3733
import java.nio.file.Paths;
38-
import java.util.ArrayList;
3934
import java.util.List;
40-
import java.util.Optional;
4135

4236
import static java.util.Collections.emptyList;
4337
import static org.assertj.core.api.Assertions.assertThat;
4438
import static org.assertj.core.api.Assertions.fail;
4539
import static org.openrewrite.java.Assertions.addTypesToSourceSet;
4640
import static org.openrewrite.java.Assertions.java;
4741
import static org.openrewrite.java.Assertions.srcMainJava;
42+
import static org.openrewrite.java.Assertions.withSourceTypesOnClasspath;
4843
import static org.openrewrite.properties.Assertions.properties;
4944
import static org.openrewrite.test.SourceSpecs.text;
5045
import static org.openrewrite.xml.Assertions.xml;
@@ -2158,39 +2153,4 @@ void changePackageInServiceProviderFileContentOnly() {
21582153
);
21592154
}
21602155

2161-
/**
2162-
* Enrich each source file's JavaSourceSet marker with types declared in other source files,
2163-
* so that classpath-based ambiguity detection works in tests where types come from source
2164-
* files rather than JARs.
2165-
*/
2166-
private static UncheckedConsumer<List<SourceFile>> withSourceTypesOnClasspath() {
2167-
return sourceFiles -> {
2168-
List<JavaType.FullyQualified> sourceTypes = new ArrayList<>();
2169-
for (SourceFile sf : sourceFiles) {
2170-
if (sf instanceof JavaSourceFile) {
2171-
for (J.ClassDeclaration classDecl : ((JavaSourceFile) sf).getClasses()) {
2172-
JavaType.FullyQualified type = classDecl.getType();
2173-
if (type != null) {
2174-
sourceTypes.add(type);
2175-
}
2176-
}
2177-
}
2178-
}
2179-
for (int i = 0; i < sourceFiles.size(); i++) {
2180-
SourceFile sf = sourceFiles.get(i);
2181-
Optional<JavaSourceSet> maybeSourceSet = sf.getMarkers().findFirst(JavaSourceSet.class);
2182-
JavaSourceSet ss;
2183-
if (maybeSourceSet.isPresent()) {
2184-
ss = maybeSourceSet.get();
2185-
List<JavaType.FullyQualified> enriched = new ArrayList<>(ss.getClasspath());
2186-
enriched.addAll(sourceTypes);
2187-
ss = ss.withClasspath(enriched);
2188-
} else {
2189-
ss = new JavaSourceSet(java.util.UUID.randomUUID(), "main", sourceTypes, java.util.Collections.emptyMap());
2190-
}
2191-
sourceFiles.set(i, sf.withMarkers(
2192-
sf.getMarkers().computeByType(ss, (orig, upd) -> upd)));
2193-
}
2194-
};
2195-
}
21962156
}

rewrite-java-test/src/test/java/org/openrewrite/java/ChangeTypeTest.java

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,19 @@
1919
import org.junit.jupiter.api.Disabled;
2020
import org.junit.jupiter.api.Test;
2121
import org.openrewrite.*;
22-
import org.openrewrite.java.marker.JavaSourceSet;
2322
import org.openrewrite.java.search.FindTypes;
2423
import org.openrewrite.java.tree.J;
25-
import org.openrewrite.java.tree.JavaSourceFile;
2624
import org.openrewrite.java.tree.JavaType;
2725
import org.openrewrite.java.tree.NameTree;
2826
import org.openrewrite.java.tree.TypeUtils;
2927
import org.openrewrite.test.RecipeSpec;
3028
import org.openrewrite.test.RewriteTest;
3129
import org.openrewrite.test.SourceSpec;
32-
import org.openrewrite.test.UncheckedConsumer;
33-
34-
import java.util.ArrayList;
35-
import java.util.Optional;
3630

3731
import static org.assertj.core.api.Assertions.assertThat;
3832
import static org.junit.jupiter.api.Assertions.assertEquals;
3933
import static org.openrewrite.java.Assertions.java;
34+
import static org.openrewrite.java.Assertions.withSourceTypesOnClasspath;
4035
import static org.openrewrite.properties.Assertions.properties;
4136
import static org.openrewrite.test.SourceSpecs.text;
4237
import static org.openrewrite.xml.Assertions.xml;
@@ -2657,34 +2652,4 @@ class Test {
26572652
);
26582653
}
26592654

2660-
private static UncheckedConsumer<java.util.List<SourceFile>> withSourceTypesOnClasspath() {
2661-
return sourceFiles -> {
2662-
java.util.List<JavaType.FullyQualified> sourceTypes = new ArrayList<>();
2663-
for (SourceFile sf : sourceFiles) {
2664-
if (sf instanceof JavaSourceFile) {
2665-
for (J.ClassDeclaration classDecl : ((JavaSourceFile) sf).getClasses()) {
2666-
JavaType.FullyQualified type = classDecl.getType();
2667-
if (type != null) {
2668-
sourceTypes.add(type);
2669-
}
2670-
}
2671-
}
2672-
}
2673-
for (int i = 0; i < sourceFiles.size(); i++) {
2674-
SourceFile sf = sourceFiles.get(i);
2675-
Optional<JavaSourceSet> maybeSourceSet = sf.getMarkers().findFirst(JavaSourceSet.class);
2676-
JavaSourceSet ss;
2677-
if (maybeSourceSet.isPresent()) {
2678-
ss = maybeSourceSet.get();
2679-
java.util.List<JavaType.FullyQualified> enriched = new ArrayList<>(ss.getClasspath());
2680-
enriched.addAll(sourceTypes);
2681-
ss = ss.withClasspath(enriched);
2682-
} else {
2683-
ss = new JavaSourceSet(java.util.UUID.randomUUID(), "main", sourceTypes, java.util.Collections.emptyMap());
2684-
}
2685-
sourceFiles.set(i, sf.withMarkers(
2686-
sf.getMarkers().computeByType(ss, (orig, upd) -> upd)));
2687-
}
2688-
};
2689-
}
26902655
}

rewrite-java/src/main/java/org/openrewrite/java/Assertions.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.openrewrite.java.search.FindMissingTypes;
2929
import org.openrewrite.java.tree.J;
3030
import org.openrewrite.java.tree.JavaSourceFile;
31+
import org.openrewrite.java.tree.JavaType;
3132
import org.openrewrite.test.SourceSpec;
3233
import org.openrewrite.test.SourceSpecs;
3334
import org.openrewrite.test.TypeValidation;
@@ -265,6 +266,42 @@ public static UncheckedConsumer<List<SourceFile>> addTypesToSourceSet(String sou
265266
return addTypesToSourceSet(sourceSetName, emptyList(), emptyList());
266267
}
267268

269+
/**
270+
* Enrich each source file's JavaSourceSet marker with types declared in other source files,
271+
* so that classpath-based ambiguity detection works in tests where types come from source
272+
* files rather than JARs.
273+
*/
274+
public static UncheckedConsumer<List<SourceFile>> withSourceTypesOnClasspath() {
275+
return sourceFiles -> {
276+
List<JavaType.FullyQualified> sourceTypes = new ArrayList<>();
277+
for (SourceFile sf : sourceFiles) {
278+
if (sf instanceof JavaSourceFile) {
279+
for (J.ClassDeclaration classDecl : ((JavaSourceFile) sf).getClasses()) {
280+
JavaType.FullyQualified type = classDecl.getType();
281+
if (type != null) {
282+
sourceTypes.add(type);
283+
}
284+
}
285+
}
286+
}
287+
for (int i = 0; i < sourceFiles.size(); i++) {
288+
SourceFile sf = sourceFiles.get(i);
289+
Optional<JavaSourceSet> maybeSourceSet = sf.getMarkers().findFirst(JavaSourceSet.class);
290+
JavaSourceSet ss;
291+
if (maybeSourceSet.isPresent()) {
292+
ss = maybeSourceSet.get();
293+
List<JavaType.FullyQualified> enriched = new ArrayList<>(ss.getClasspath());
294+
enriched.addAll(sourceTypes);
295+
ss = ss.withClasspath(enriched);
296+
} else {
297+
ss = new JavaSourceSet(Tree.randomId(), "main", sourceTypes, emptyMap());
298+
}
299+
sourceFiles.set(i, sf.withMarkers(
300+
sf.getMarkers().computeByType(ss, (orig, upd) -> upd)));
301+
}
302+
};
303+
}
304+
268305
public static JavaVersion javaVersion(int version) {
269306
return javaVersions.computeIfAbsent(version, v ->
270307
new JavaVersion(Tree.randomId(), "openjdk", "adoptopenjdk",

rewrite-maven/src/test/java/org/openrewrite/maven/ChangeDependencyGroupIdAndArtifactIdTest.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.openrewrite.DocumentExample;
2121
import org.openrewrite.Issue;
2222
import org.openrewrite.Validated;
23+
import org.openrewrite.java.ChangePackage;
2324
import org.openrewrite.java.marker.JavaSourceSet;
2425
import org.openrewrite.java.tree.JavaType;
2526
import org.openrewrite.test.RewriteTest;
@@ -3721,4 +3722,86 @@ void javaSourceSetGracefulWhenDownloadFails() {
37213722
);
37223723
}
37233724

3725+
@Test
3726+
void composedWithChangePackageUpdatesImports() {
3727+
rewriteRun(
3728+
spec -> spec.recipes(
3729+
new ChangeDependencyGroupIdAndArtifactId(
3730+
"javax.activation",
3731+
"javax.activation-api",
3732+
"jakarta.activation",
3733+
"jakarta.activation-api",
3734+
"2.0.1",
3735+
null,
3736+
false,
3737+
false
3738+
),
3739+
new ChangePackage("javax.activation", "jakarta.activation", true)
3740+
),
3741+
mavenProject("project",
3742+
srcMainJava(
3743+
java(
3744+
"""
3745+
import javax.activation.DataHandler;
3746+
import javax.activation.MimeType;
3747+
3748+
class A {
3749+
DataHandler handler;
3750+
MimeType type;
3751+
}
3752+
""",
3753+
"""
3754+
import jakarta.activation.DataHandler;
3755+
import jakarta.activation.MimeType;
3756+
3757+
class A {
3758+
DataHandler handler;
3759+
MimeType type;
3760+
}
3761+
""",
3762+
s -> s.afterRecipe(cu -> {
3763+
JavaSourceSet jss = cu.getMarkers().findFirst(JavaSourceSet.class).orElseThrow();
3764+
// New dependency types should be present on classpath
3765+
assertThat(jss.getClasspath())
3766+
.extracting(JavaType.FullyQualified::getFullyQualifiedName)
3767+
.anyMatch(fqn -> fqn.startsWith("jakarta.activation."));
3768+
})
3769+
)
3770+
),
3771+
pomXml(
3772+
"""
3773+
<project>
3774+
<modelVersion>4.0.0</modelVersion>
3775+
<groupId>com.mycompany.app</groupId>
3776+
<artifactId>my-app</artifactId>
3777+
<version>1</version>
3778+
<dependencies>
3779+
<dependency>
3780+
<groupId>javax.activation</groupId>
3781+
<artifactId>javax.activation-api</artifactId>
3782+
<version>1.2.0</version>
3783+
</dependency>
3784+
</dependencies>
3785+
</project>
3786+
""",
3787+
"""
3788+
<project>
3789+
<modelVersion>4.0.0</modelVersion>
3790+
<groupId>com.mycompany.app</groupId>
3791+
<artifactId>my-app</artifactId>
3792+
<version>1</version>
3793+
<dependencies>
3794+
<dependency>
3795+
<groupId>jakarta.activation</groupId>
3796+
<artifactId>jakarta.activation-api</artifactId>
3797+
<version>2.0.1</version>
3798+
</dependency>
3799+
</dependencies>
3800+
</project>
3801+
"""
3802+
)
3803+
)
3804+
);
3805+
}
3806+
37243807
}

0 commit comments

Comments
 (0)