Update ClassNameGenerator to work with a ClassName target

This commit updates ClassNameGenerator so that it uses a ClassName for
its default target. This makes sure that a target that has been
generated can be used.

See gh-29027
This commit is contained in:
Stephane Nicoll
2022-09-22 14:22:17 +02:00
parent 1707a22c18
commit 8ef850ff91
9 changed files with 99 additions and 81 deletions

View File

@@ -32,71 +32,69 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
*/
class ClassNameGeneratorTests {
private final ClassNameGenerator generator = new ClassNameGenerator(Object.class);
private static final ClassName TEST_TARGET = ClassName.get("com.example", "Test");
private final ClassNameGenerator generator = new ClassNameGenerator(TEST_TARGET);
@Test
void generateClassNameWhenTargetClassIsNullUsesMainTarget() {
ClassName generated = this.generator.generateClassName("test", null);
assertThat(generated).hasToString("java.lang.Object__Test");
assertThat(generated).hasToString("com.example.Test__Test");
}
@Test
void generateClassNameUseFeatureNamePrefix() {
ClassName generated = new ClassNameGenerator(Object.class, "One")
.generateClassName("test", InputStream.class);
ClassName generated = new ClassNameGenerator(TEST_TARGET, "One")
.generateClassName("test", ClassName.get(InputStream.class));
assertThat(generated).hasToString("java.io.InputStream__OneTest");
}
@Test
void generateClassNameWithNoTextFeatureNamePrefix() {
ClassName generated = new ClassNameGenerator(Object.class, " ")
.generateClassName("test", InputStream.class);
ClassName generated = new ClassNameGenerator(TEST_TARGET, " ")
.generateClassName("test", ClassName.get(InputStream.class));
assertThat(generated).hasToString("java.io.InputStream__Test");
}
@Test
void generatedClassNameWhenFeatureIsEmptyThrowsException() {
assertThatIllegalArgumentException()
.isThrownBy(() -> this.generator.generateClassName("", InputStream.class))
.isThrownBy(() -> this.generator.generateClassName("", ClassName.get(InputStream.class)))
.withMessage("'featureName' must not be empty");
}
@Test
void generatedClassNameWhenFeatureIsNotAllLettersThrowsException() {
assertThat(this.generator.generateClassName("name!", InputStream.class))
assertThat(this.generator.generateClassName("name!", ClassName.get(InputStream.class)))
.hasToString("java.io.InputStream__Name");
assertThat(this.generator.generateClassName("1NameHere", InputStream.class))
assertThat(this.generator.generateClassName("1NameHere", ClassName.get(InputStream.class)))
.hasToString("java.io.InputStream__NameHere");
assertThat(this.generator.generateClassName("Y0pe", InputStream.class))
assertThat(this.generator.generateClassName("Y0pe", ClassName.get(InputStream.class)))
.hasToString("java.io.InputStream__YPe");
}
@Test
void generateClassNameWithClassWhenLowercaseFeatureNameGeneratesName() {
ClassName generated = this.generator.generateClassName("bytes", InputStream.class);
ClassName generated = this.generator.generateClassName("bytes", ClassName.get(InputStream.class));
assertThat(generated).hasToString("java.io.InputStream__Bytes");
}
@Test
void generateClassNameWithClassWhenInnerClassGeneratesName() {
ClassName generated = this.generator.generateClassName("EventListener", TestBean.class);
ClassName innerBean = ClassName.get("com.example", "Test", "InnerBean");
ClassName generated = this.generator.generateClassName("EventListener", innerBean);
assertThat(generated)
.hasToString("org.springframework.aot.generate.ClassNameGeneratorTests_TestBean__EventListener");
.hasToString("com.example.Test_InnerBean__EventListener");
}
@Test
void generateClassWithClassWhenMultipleCallsGeneratesSequencedName() {
ClassName generated1 = this.generator.generateClassName("bytes", InputStream.class);
ClassName generated2 = this.generator.generateClassName("bytes", InputStream.class);
ClassName generated3 = this.generator.generateClassName("bytes", InputStream.class);
ClassName generated1 = this.generator.generateClassName("bytes",ClassName.get(InputStream.class));
ClassName generated2 = this.generator.generateClassName("bytes", ClassName.get(InputStream.class));
ClassName generated3 = this.generator.generateClassName("bytes", ClassName.get(InputStream.class));
assertThat(generated1).hasToString("java.io.InputStream__Bytes");
assertThat(generated2).hasToString("java.io.InputStream__Bytes1");
assertThat(generated3).hasToString("java.io.InputStream__Bytes2");
}
static class TestBean {
}
}

View File

@@ -22,6 +22,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.GeneratedFiles.Kind;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.javapoet.ClassName;
import org.springframework.javapoet.TypeSpec;
import static org.assertj.core.api.Assertions.assertThat;
@@ -35,10 +36,12 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
*/
class DefaultGenerationContextTests {
private static final ClassName SAMPLE_TARGET = ClassName.get("com.example", "SampleTarget");
private static final Consumer<TypeSpec.Builder> typeSpecCustomizer = type -> {};
private final GeneratedClasses generatedClasses = new GeneratedClasses(
new ClassNameGenerator(SampleTarget.class));
new ClassNameGenerator(SAMPLE_TARGET));
private final InMemoryGeneratedFiles generatedFiles = new InMemoryGeneratedFiles();
@@ -48,7 +51,7 @@ class DefaultGenerationContextTests {
@Test
void createWithOnlyGeneratedFilesCreatesContext() {
DefaultGenerationContext context = new DefaultGenerationContext(
new ClassNameGenerator(SampleTarget.class), this.generatedFiles);
new ClassNameGenerator(SAMPLE_TARGET), this.generatedFiles);
assertThat(context.getGeneratedFiles()).isSameAs(this.generatedFiles);
assertThat(context.getRuntimeHints()).isInstanceOf(RuntimeHints.class);
}
@@ -109,7 +112,7 @@ class DefaultGenerationContextTests {
@Test
void withNameUpdateNamingConvention() {
DefaultGenerationContext context = new DefaultGenerationContext(
new ClassNameGenerator(SampleTarget.class), this.generatedFiles);
new ClassNameGenerator(SAMPLE_TARGET), this.generatedFiles);
GenerationContext anotherContext = context.withName("Another");
GeneratedClass generatedClass = anotherContext.getGeneratedClasses()
.addForFeature("Test", typeSpecCustomizer);
@@ -119,7 +122,7 @@ class DefaultGenerationContextTests {
@Test
void withNameKeepsTrackOfAllGeneratedFiles() {
DefaultGenerationContext context = new DefaultGenerationContext(
new ClassNameGenerator(SampleTarget.class), this.generatedFiles);
new ClassNameGenerator(SAMPLE_TARGET), this.generatedFiles);
context.getGeneratedClasses().addForFeature("Test", typeSpecCustomizer);
GenerationContext anotherContext = context.withName("Another");
assertThat(anotherContext.getGeneratedClasses()).isNotSameAs(context.getGeneratedClasses());
@@ -133,7 +136,7 @@ class DefaultGenerationContextTests {
@Test
void withNameGeneratesUniqueName() {
DefaultGenerationContext context = new DefaultGenerationContext(
new ClassNameGenerator(Object.class), this.generatedFiles);
new ClassNameGenerator(SAMPLE_TARGET), this.generatedFiles);
context.withName("Test").getGeneratedClasses()
.addForFeature("Feature", typeSpecCustomizer);
context.withName("Test").getGeneratedClasses()
@@ -142,11 +145,9 @@ class DefaultGenerationContextTests {
.addForFeature("Feature", typeSpecCustomizer);
context.writeGeneratedContent();
assertThat(this.generatedFiles.getGeneratedFiles(Kind.SOURCE)).containsOnlyKeys(
"java/lang/Object__TestFeature.java",
"java/lang/Object__Test1Feature.java",
"java/lang/Object__Test2Feature.java");
"com/example/SampleTarget__TestFeature.java",
"com/example/SampleTarget__Test1Feature.java",
"com/example/SampleTarget__Test2Feature.java");
}
static class SampleTarget {}
}

View File

@@ -22,6 +22,7 @@ import java.util.function.Consumer;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.GeneratedFiles.Kind;
import org.springframework.javapoet.ClassName;
import org.springframework.javapoet.TypeSpec;
import static org.assertj.core.api.Assertions.assertThat;
@@ -42,7 +43,7 @@ class GeneratedClassesTests {
private static final Consumer<TypeSpec.Builder> emptyTypeCustomizer = type -> {};
private final GeneratedClasses generatedClasses = new GeneratedClasses(
new ClassNameGenerator(Object.class));
new ClassNameGenerator(ClassName.get("com.example", "Test")));
@Test
void createWhenClassNameGeneratorIsNullThrowsException() {
@@ -76,7 +77,7 @@ class GeneratedClassesTests {
@Test
void addForFeatureUsesDefaultTarget() {
GeneratedClass generatedClass = this.generatedClasses.addForFeature("Test", emptyTypeCustomizer);
assertThat(generatedClass.getName()).hasToString("java.lang.Object__Test");
assertThat(generatedClass.getName()).hasToString("com.example.Test__Test");
}
@Test