Add modifiers support to TypeDeclaration

Closes gh-908
This commit is contained in:
Stephane Nicoll
2019-05-22 10:10:30 +02:00
parent c298a6d021
commit b0597aaca1
11 changed files with 142 additions and 60 deletions

View File

@@ -46,18 +46,21 @@ class JavaProjectGenerationDefaultContributorsConfiguration {
@Bean @Bean
public MainApplicationTypeCustomizer<JavaTypeDeclaration> mainMethodContributor() { public MainApplicationTypeCustomizer<JavaTypeDeclaration> mainMethodContributor() {
return (typeDeclaration) -> typeDeclaration return (typeDeclaration) -> {
.addMethodDeclaration(JavaMethodDeclaration.method("main") typeDeclaration.modifiers(Modifier.PUBLIC);
.modifiers(Modifier.PUBLIC | Modifier.STATIC).returning("void") typeDeclaration.addMethodDeclaration(JavaMethodDeclaration.method("main")
.parameters(new Parameter("java.lang.String[]", "args")) .modifiers(Modifier.PUBLIC | Modifier.STATIC).returning("void")
.body(new JavaExpressionStatement(new JavaMethodInvocation( .parameters(new Parameter("java.lang.String[]", "args"))
"org.springframework.boot.SpringApplication", "run", .body(new JavaExpressionStatement(new JavaMethodInvocation(
typeDeclaration.getName() + ".class", "args")))); "org.springframework.boot.SpringApplication", "run",
typeDeclaration.getName() + ".class", "args"))));
};
} }
@Bean @Bean
public TestApplicationTypeCustomizer<JavaTypeDeclaration> testMethodContributor() { public TestApplicationTypeCustomizer<JavaTypeDeclaration> testMethodContributor() {
return (typeDeclaration) -> { return (typeDeclaration) -> {
typeDeclaration.modifiers(Modifier.PUBLIC);
JavaMethodDeclaration method = JavaMethodDeclaration.method("contextLoads") JavaMethodDeclaration method = JavaMethodDeclaration.method("contextLoads")
.modifiers(Modifier.PUBLIC).returning("void").body(); .modifiers(Modifier.PUBLIC).returning("void").body();
method.annotate(Annotation.name("org.junit.Test")); method.annotate(Annotation.name("org.junit.Test"));
@@ -76,6 +79,7 @@ class JavaProjectGenerationDefaultContributorsConfiguration {
public ServletInitializerCustomizer<JavaTypeDeclaration> javaServletInitializerCustomizer( public ServletInitializerCustomizer<JavaTypeDeclaration> javaServletInitializerCustomizer(
ResolvedProjectDescription projectDescription) { ResolvedProjectDescription projectDescription) {
return (typeDeclaration) -> { return (typeDeclaration) -> {
typeDeclaration.modifiers(Modifier.PUBLIC);
JavaMethodDeclaration configure = JavaMethodDeclaration JavaMethodDeclaration configure = JavaMethodDeclaration
.method("configure").modifiers(Modifier.PROTECTED) .method("configure").modifiers(Modifier.PROTECTED)
.returning( .returning(

View File

@@ -49,18 +49,23 @@ import io.spring.initializr.generator.language.SourceCodeWriter;
*/ */
public class GroovySourceCodeWriter implements SourceCodeWriter<GroovySourceCode> { public class GroovySourceCodeWriter implements SourceCodeWriter<GroovySourceCode> {
private static final Map<Predicate<Integer>, String> TYPE_MODIFIERS;
private static final Map<Predicate<Integer>, String> METHOD_MODIFIERS; private static final Map<Predicate<Integer>, String> METHOD_MODIFIERS;
static { static {
Map<Predicate<Integer>, String> methodModifiers = new LinkedHashMap<>(); Map<Predicate<Integer>, String> typeModifiers = new LinkedHashMap<>();
methodModifiers.put(Modifier::isProtected, "protected"); typeModifiers.put(Modifier::isProtected, "protected");
methodModifiers.put(Modifier::isPrivate, "private"); typeModifiers.put(Modifier::isPrivate, "private");
methodModifiers.put(Modifier::isAbstract, "abstract"); typeModifiers.put(Modifier::isAbstract, "abstract");
methodModifiers.put(Modifier::isStatic, "static"); typeModifiers.put(Modifier::isStatic, "static");
methodModifiers.put(Modifier::isFinal, "final"); typeModifiers.put(Modifier::isFinal, "final");
typeModifiers.put(Modifier::isStrict, "strictfp");
TYPE_MODIFIERS = typeModifiers;
Map<Predicate<Integer>, String> methodModifiers = new LinkedHashMap<>(
typeModifiers);
methodModifiers.put(Modifier::isSynchronized, "synchronized"); methodModifiers.put(Modifier::isSynchronized, "synchronized");
methodModifiers.put(Modifier::isNative, "native"); methodModifiers.put(Modifier::isNative, "native");
methodModifiers.put(Modifier::isStrict, "strictfp");
METHOD_MODIFIERS = methodModifiers; METHOD_MODIFIERS = methodModifiers;
} }
@@ -97,6 +102,7 @@ public class GroovySourceCodeWriter implements SourceCodeWriter<GroovySourceCode
} }
for (GroovyTypeDeclaration type : compilationUnit.getTypeDeclarations()) { for (GroovyTypeDeclaration type : compilationUnit.getTypeDeclarations()) {
writeAnnotations(writer, type); writeAnnotations(writer, type);
writeModifiers(writer, TYPE_MODIFIERS, type.getModifiers());
writer.print("class " + type.getName()); writer.print("class " + type.getName());
if (type.getExtends() != null) { if (type.getExtends() != null) {
writer.print(" extends " + getUnqualifiedName(type.getExtends())); writer.print(" extends " + getUnqualifiedName(type.getExtends()));
@@ -167,7 +173,7 @@ public class GroovySourceCodeWriter implements SourceCodeWriter<GroovySourceCode
private void writeMethodDeclaration(IndentingWriter writer, private void writeMethodDeclaration(IndentingWriter writer,
GroovyMethodDeclaration methodDeclaration) { GroovyMethodDeclaration methodDeclaration) {
writeAnnotations(writer, methodDeclaration); writeAnnotations(writer, methodDeclaration);
writeMethodModifiers(writer, methodDeclaration); writeModifiers(writer, METHOD_MODIFIERS, methodDeclaration.getModifiers());
writer.print(getUnqualifiedName(methodDeclaration.getReturnType()) + " " writer.print(getUnqualifiedName(methodDeclaration.getReturnType()) + " "
+ methodDeclaration.getName() + "("); + methodDeclaration.getName() + "(");
List<Parameter> parameters = methodDeclaration.getParameters(); List<Parameter> parameters = methodDeclaration.getParameters();
@@ -196,10 +202,10 @@ public class GroovySourceCodeWriter implements SourceCodeWriter<GroovySourceCode
writer.println(); writer.println();
} }
private void writeMethodModifiers(IndentingWriter writer, private void writeModifiers(IndentingWriter writer,
GroovyMethodDeclaration methodDeclaration) { Map<Predicate<Integer>, String> availableModifiers, int declaredModifiers) {
String modifiers = METHOD_MODIFIERS.entrySet().stream() String modifiers = availableModifiers.entrySet().stream()
.filter((entry) -> entry.getKey().test(methodDeclaration.getModifiers())) .filter((entry) -> entry.getKey().test(declaredModifiers))
.map(Entry::getValue).collect(Collectors.joining(" ")); .map(Entry::getValue).collect(Collectors.joining(" "));
if (!modifiers.isEmpty()) { if (!modifiers.isEmpty()) {
writer.print(modifiers); writer.print(modifiers);

View File

@@ -28,12 +28,22 @@ import io.spring.initializr.generator.language.TypeDeclaration;
*/ */
public class GroovyTypeDeclaration extends TypeDeclaration { public class GroovyTypeDeclaration extends TypeDeclaration {
private int modifiers;
private final List<GroovyMethodDeclaration> methodDeclarations = new ArrayList<>(); private final List<GroovyMethodDeclaration> methodDeclarations = new ArrayList<>();
GroovyTypeDeclaration(String name) { GroovyTypeDeclaration(String name) {
super(name); super(name);
} }
public void modifiers(int modifiers) {
this.modifiers = modifiers;
}
public int getModifiers() {
return this.modifiers;
}
public void addMethodDeclaration(GroovyMethodDeclaration methodDeclaration) { public void addMethodDeclaration(GroovyMethodDeclaration methodDeclaration) {
this.methodDeclarations.add(methodDeclaration); this.methodDeclarations.add(methodDeclaration);
} }

View File

@@ -16,7 +16,6 @@
package io.spring.initializr.generator.language.java; package io.spring.initializr.generator.language.java;
import java.lang.reflect.Modifier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
@@ -99,7 +98,7 @@ public final class JavaMethodDeclaration implements Annotatable {
private String returnType = "void"; private String returnType = "void";
private int modifiers = Modifier.PUBLIC; private int modifiers;
private Builder(String name) { private Builder(String name) {
this.name = name; this.name = name;

View File

@@ -49,19 +49,24 @@ import io.spring.initializr.generator.language.SourceCodeWriter;
*/ */
public class JavaSourceCodeWriter implements SourceCodeWriter<JavaSourceCode> { public class JavaSourceCodeWriter implements SourceCodeWriter<JavaSourceCode> {
private static final Map<Predicate<Integer>, String> TYPE_MODIFIERS;
private static final Map<Predicate<Integer>, String> METHOD_MODIFIERS; private static final Map<Predicate<Integer>, String> METHOD_MODIFIERS;
static { static {
Map<Predicate<Integer>, String> methodModifiers = new LinkedHashMap<>(); Map<Predicate<Integer>, String> typeModifiers = new LinkedHashMap<>();
methodModifiers.put(Modifier::isPublic, "public"); typeModifiers.put(Modifier::isPublic, "public");
methodModifiers.put(Modifier::isProtected, "protected"); typeModifiers.put(Modifier::isProtected, "protected");
methodModifiers.put(Modifier::isPrivate, "private"); typeModifiers.put(Modifier::isPrivate, "private");
methodModifiers.put(Modifier::isAbstract, "abstract"); typeModifiers.put(Modifier::isAbstract, "abstract");
methodModifiers.put(Modifier::isStatic, "static"); typeModifiers.put(Modifier::isStatic, "static");
methodModifiers.put(Modifier::isFinal, "final"); typeModifiers.put(Modifier::isFinal, "final");
typeModifiers.put(Modifier::isStrict, "strictfp");
TYPE_MODIFIERS = typeModifiers;
Map<Predicate<Integer>, String> methodModifiers = new LinkedHashMap<>(
typeModifiers);
methodModifiers.put(Modifier::isSynchronized, "synchronized"); methodModifiers.put(Modifier::isSynchronized, "synchronized");
methodModifiers.put(Modifier::isNative, "native"); methodModifiers.put(Modifier::isNative, "native");
methodModifiers.put(Modifier::isStrict, "strictfp");
METHOD_MODIFIERS = methodModifiers; METHOD_MODIFIERS = methodModifiers;
} }
@@ -98,7 +103,8 @@ public class JavaSourceCodeWriter implements SourceCodeWriter<JavaSourceCode> {
} }
for (JavaTypeDeclaration type : compilationUnit.getTypeDeclarations()) { for (JavaTypeDeclaration type : compilationUnit.getTypeDeclarations()) {
writeAnnotations(writer, type); writeAnnotations(writer, type);
writer.print("public class " + type.getName()); writeModifiers(writer, TYPE_MODIFIERS, type.getModifiers());
writer.print("class " + type.getName());
if (type.getExtends() != null) { if (type.getExtends() != null) {
writer.print(" extends " + getUnqualifiedName(type.getExtends())); writer.print(" extends " + getUnqualifiedName(type.getExtends()));
} }
@@ -169,7 +175,7 @@ public class JavaSourceCodeWriter implements SourceCodeWriter<JavaSourceCode> {
private void writeMethodDeclaration(IndentingWriter writer, private void writeMethodDeclaration(IndentingWriter writer,
JavaMethodDeclaration methodDeclaration) { JavaMethodDeclaration methodDeclaration) {
writeAnnotations(writer, methodDeclaration); writeAnnotations(writer, methodDeclaration);
writeMethodModifiers(writer, methodDeclaration); writeModifiers(writer, METHOD_MODIFIERS, methodDeclaration.getModifiers());
writer.print(getUnqualifiedName(methodDeclaration.getReturnType()) + " " writer.print(getUnqualifiedName(methodDeclaration.getReturnType()) + " "
+ methodDeclaration.getName() + "("); + methodDeclaration.getName() + "(");
List<Parameter> parameters = methodDeclaration.getParameters(); List<Parameter> parameters = methodDeclaration.getParameters();
@@ -199,10 +205,10 @@ public class JavaSourceCodeWriter implements SourceCodeWriter<JavaSourceCode> {
writer.println(); writer.println();
} }
private void writeMethodModifiers(IndentingWriter writer, private void writeModifiers(IndentingWriter writer,
JavaMethodDeclaration methodDeclaration) { Map<Predicate<Integer>, String> availableModifiers, int declaredModifiers) {
String modifiers = METHOD_MODIFIERS.entrySet().stream() String modifiers = availableModifiers.entrySet().stream()
.filter((entry) -> entry.getKey().test(methodDeclaration.getModifiers())) .filter((entry) -> entry.getKey().test(declaredModifiers))
.map(Entry::getValue).collect(Collectors.joining(" ")); .map(Entry::getValue).collect(Collectors.joining(" "));
if (!modifiers.isEmpty()) { if (!modifiers.isEmpty()) {
writer.print(modifiers); writer.print(modifiers);

View File

@@ -28,12 +28,22 @@ import io.spring.initializr.generator.language.TypeDeclaration;
*/ */
public class JavaTypeDeclaration extends TypeDeclaration { public class JavaTypeDeclaration extends TypeDeclaration {
private int modifiers;
private final List<JavaMethodDeclaration> methodDeclarations = new ArrayList<>(); private final List<JavaMethodDeclaration> methodDeclarations = new ArrayList<>();
JavaTypeDeclaration(String name) { JavaTypeDeclaration(String name) {
super(name); super(name);
} }
public void modifiers(int modifiers) {
this.modifiers = modifiers;
}
public int getModifiers() {
return this.modifiers;
}
public void addMethodDeclaration(JavaMethodDeclaration methodDeclaration) { public void addMethodDeclaration(JavaMethodDeclaration methodDeclaration) {
this.methodDeclarations.add(methodDeclaration); this.methodDeclarations.add(methodDeclaration);
} }

View File

@@ -78,6 +78,7 @@ public class KotlinSourceCodeWriter implements SourceCodeWriter<KotlinSourceCode
} }
for (KotlinTypeDeclaration type : compilationUnit.getTypeDeclarations()) { for (KotlinTypeDeclaration type : compilationUnit.getTypeDeclarations()) {
writeAnnotations(writer, type); writeAnnotations(writer, type);
writeModifiers(writer, type.getModifiers());
writer.print("class " + type.getName()); writer.print("class " + type.getName());
if (type.getExtends() != null) { if (type.getExtends() != null) {
writer.print(" : " + getUnqualifiedName(type.getExtends()) + "()"); writer.print(" : " + getUnqualifiedName(type.getExtends()) + "()");
@@ -113,7 +114,7 @@ public class KotlinSourceCodeWriter implements SourceCodeWriter<KotlinSourceCode
KotlinFunctionDeclaration functionDeclaration) { KotlinFunctionDeclaration functionDeclaration) {
writer.println(); writer.println();
writeAnnotations(writer, functionDeclaration); writeAnnotations(writer, functionDeclaration);
writeMethodModifiers(writer, functionDeclaration); writeModifiers(writer, functionDeclaration.getModifiers());
writer.print("fun "); writer.print("fun ");
writer.print(functionDeclaration.getName() + "("); writer.print(functionDeclaration.getName() + "(");
List<Parameter> parameters = functionDeclaration.getParameters(); List<Parameter> parameters = functionDeclaration.getParameters();
@@ -195,9 +196,9 @@ public class KotlinSourceCodeWriter implements SourceCodeWriter<KotlinSourceCode
return (values.size() > 1) ? "[" + result + "]" : result; return (values.size() > 1) ? "[" + result + "]" : result;
} }
private void writeMethodModifiers(IndentingWriter writer, private void writeModifiers(IndentingWriter writer,
KotlinFunctionDeclaration functionDeclaration) { List<KotlinModifier> declaredModifiers) {
String modifiers = functionDeclaration.getModifiers().stream() String modifiers = declaredModifiers.stream()
.filter((entry) -> !entry.equals(KotlinModifier.PUBLIC)).sorted() .filter((entry) -> !entry.equals(KotlinModifier.PUBLIC)).sorted()
.map((entry) -> entry.toString().toLowerCase(Locale.ENGLISH)) .map((entry) -> entry.toString().toLowerCase(Locale.ENGLISH))
.collect(Collectors.joining(" ")); .collect(Collectors.joining(" "));

View File

@@ -17,6 +17,7 @@
package io.spring.initializr.generator.language.kotlin; package io.spring.initializr.generator.language.kotlin;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import io.spring.initializr.generator.language.TypeDeclaration; import io.spring.initializr.generator.language.TypeDeclaration;
@@ -28,12 +29,22 @@ import io.spring.initializr.generator.language.TypeDeclaration;
*/ */
public class KotlinTypeDeclaration extends TypeDeclaration { public class KotlinTypeDeclaration extends TypeDeclaration {
private List<KotlinModifier> modifiers = new ArrayList<>();
private final List<KotlinFunctionDeclaration> functionDeclarations = new ArrayList<>(); private final List<KotlinFunctionDeclaration> functionDeclarations = new ArrayList<>();
KotlinTypeDeclaration(String name) { KotlinTypeDeclaration(String name) {
super(name); super(name);
} }
public void modifiers(KotlinModifier... modifiers) {
this.modifiers = Arrays.asList(modifiers);
}
List<KotlinModifier> getModifiers() {
return this.modifiers;
}
public void addFunctionDeclaration(KotlinFunctionDeclaration methodDeclaration) { public void addFunctionDeclaration(KotlinFunctionDeclaration methodDeclaration) {
this.functionDeclarations.add(methodDeclaration); this.functionDeclarations.add(methodDeclaration);
} }

View File

@@ -64,6 +64,18 @@ class GroovySourceCodeWriterTests {
"}"); "}");
} }
@Test
void emptyTypeDeclarationWithModifiers() throws IOException {
GroovySourceCode sourceCode = new GroovySourceCode();
GroovyCompilationUnit compilationUnit = sourceCode
.createCompilationUnit("com.example", "Test");
GroovyTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.modifiers(Modifier.PUBLIC | Modifier.ABSTRACT);
List<String> lines = writeSingleType(sourceCode, "com/example/Test.groovy");
assertThat(lines).containsExactly("package com.example", "",
"abstract class Test {", "", "}");
}
@Test @Test
void emptyTypeDeclarationWithSuperClass() throws IOException { void emptyTypeDeclarationWithSuperClass() throws IOException {
GroovySourceCode sourceCode = new GroovySourceCode(); GroovySourceCode sourceCode = new GroovySourceCode();

View File

@@ -60,8 +60,20 @@ class JavaSourceCodeWriterTests {
.createCompilationUnit("com.example", "Test"); .createCompilationUnit("com.example", "Test");
compilationUnit.createTypeDeclaration("Test"); compilationUnit.createTypeDeclaration("Test");
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java"); List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", "class Test {", "",
"}");
}
@Test
void emptyTypeDeclarationWithModifiers() throws IOException {
JavaSourceCode sourceCode = new JavaSourceCode();
JavaCompilationUnit compilationUnit = sourceCode
.createCompilationUnit("com.example", "Test");
JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.modifiers(Modifier.PROTECTED | Modifier.ABSTRACT);
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"public class Test {", "", "}"); "protected abstract class Test {", "", "}");
} }
@Test @Test
@@ -74,7 +86,7 @@ class JavaSourceCodeWriterTests {
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java"); List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import com.example.build.TestParent;", "", "import com.example.build.TestParent;", "",
"public class Test extends TestParent {", "", "}"); "class Test extends TestParent {", "", "}");
} }
@Test @Test
@@ -83,15 +95,15 @@ class JavaSourceCodeWriterTests {
JavaCompilationUnit compilationUnit = sourceCode JavaCompilationUnit compilationUnit = sourceCode
.createCompilationUnit("com.example", "Test"); .createCompilationUnit("com.example", "Test");
JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test"); JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addMethodDeclaration( test.addMethodDeclaration(JavaMethodDeclaration.method("trim")
JavaMethodDeclaration.method("trim").returning("java.lang.String") .returning("java.lang.String").modifiers(Modifier.PUBLIC)
.parameters(new Parameter("java.lang.String", "value")) .parameters(new Parameter("java.lang.String", "value"))
.body(new JavaReturnStatement( .body(new JavaReturnStatement(
new JavaMethodInvocation("value", "trim")))); new JavaMethodInvocation("value", "trim"))));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java"); List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "", "class Test {", "",
"public class Test {", "", " public String trim(String value) {", " public String trim(String value) {", " return value.trim();",
" return value.trim();", " }", "", "}"); " }", "", "}");
} }
@Test @Test
@@ -112,7 +124,7 @@ class JavaSourceCodeWriterTests {
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import org.springframework.boot.SpringApplication;", "import org.springframework.boot.SpringApplication;",
"import org.springframework.boot.autoconfigure.SpringBootApplication;", "import org.springframework.boot.autoconfigure.SpringBootApplication;",
"", "@SpringBootApplication", "public class Test {", "", "", "@SpringBootApplication", "class Test {", "",
" public static void main(String[] args) {", " public static void main(String[] args) {",
" SpringApplication.run(Test.class, args);", " }", "", "}"); " SpringApplication.run(Test.class, args);", " }", "", "}");
} }
@@ -124,7 +136,7 @@ class JavaSourceCodeWriterTests {
(builder) -> builder.attribute("counter", Integer.class, "42"))); (builder) -> builder.attribute("counter", Integer.class, "42")));
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import org.springframework.test.TestApplication;", "", "import org.springframework.test.TestApplication;", "",
"@TestApplication(counter = 42)", "public class Test {", "", "}"); "@TestApplication(counter = 42)", "class Test {", "", "}");
} }
@Test @Test
@@ -134,7 +146,7 @@ class JavaSourceCodeWriterTests {
(builder) -> builder.attribute("name", String.class, "test"))); (builder) -> builder.attribute("name", String.class, "test")));
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import org.springframework.test.TestApplication;", "", "import org.springframework.test.TestApplication;", "",
"@TestApplication(name = \"test\")", "public class Test {", "", "}"); "@TestApplication(name = \"test\")", "class Test {", "", "}");
} }
@Test @Test
@@ -144,7 +156,7 @@ class JavaSourceCodeWriterTests {
(builder) -> builder.attribute("value", String.class, "test"))); (builder) -> builder.attribute("value", String.class, "test")));
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import org.springframework.test.TestApplication;", "", "import org.springframework.test.TestApplication;", "",
"@TestApplication(\"test\")", "public class Test {", "", "}"); "@TestApplication(\"test\")", "class Test {", "", "}");
} }
@Test @Test
@@ -156,8 +168,7 @@ class JavaSourceCodeWriterTests {
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import java.time.temporal.ChronoUnit;", "import java.time.temporal.ChronoUnit;",
"import org.springframework.test.TestApplication;", "", "import org.springframework.test.TestApplication;", "",
"@TestApplication(unit = ChronoUnit.SECONDS)", "public class Test {", "", "@TestApplication(unit = ChronoUnit.SECONDS)", "class Test {", "", "}");
"}");
} }
@Test @Test
@@ -169,8 +180,8 @@ class JavaSourceCodeWriterTests {
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import com.example.One;", "import com.example.Two;", "import com.example.One;", "import com.example.Two;",
"import org.springframework.test.TestApplication;", "", "import org.springframework.test.TestApplication;", "",
"@TestApplication(target = { One.class, Two.class })", "@TestApplication(target = { One.class, Two.class })", "class Test {", "",
"public class Test {", "", "}"); "}");
} }
@Test @Test
@@ -184,7 +195,7 @@ class JavaSourceCodeWriterTests {
"import com.example.One;", "import java.time.temporal.ChronoUnit;", "import com.example.One;", "import java.time.temporal.ChronoUnit;",
"import org.springframework.test.TestApplication;", "", "import org.springframework.test.TestApplication;", "",
"@TestApplication(target = One.class, unit = ChronoUnit.NANOS)", "@TestApplication(target = One.class, unit = ChronoUnit.NANOS)",
"public class Test {", "", "}"); "class Test {", "", "}");
} }
private List<String> writeClassAnnotation(Annotation annotation) throws IOException { private List<String> writeClassAnnotation(Annotation annotation) throws IOException {
@@ -208,8 +219,8 @@ class JavaSourceCodeWriterTests {
test.addMethodDeclaration(method); test.addMethodDeclaration(method);
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java"); List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", assertThat(lines).containsExactly("package com.example;", "",
"import com.example.test.TestAnnotation;", "", "public class Test {", "", "import com.example.test.TestAnnotation;", "", "class Test {", "",
" @TestAnnotation", " public void something() {", " }", "", "}"); " @TestAnnotation", " void something() {", " }", "", "}");
} }
private List<String> writeSingleType(JavaSourceCode sourceCode, String location) private List<String> writeSingleType(JavaSourceCode sourceCode, String location)

View File

@@ -62,6 +62,18 @@ class KotlinSourceCodeWriterTests {
assertThat(lines).containsExactly("package com.example", "", "class Test"); assertThat(lines).containsExactly("package com.example", "", "class Test");
} }
@Test
void emptyTypeDeclarationWithModifiers() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode
.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.modifiers(KotlinModifier.PUBLIC, KotlinModifier.ABSTRACT);
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "",
"abstract class Test");
}
@Test @Test
void emptyTypeDeclarationWithSuperClass() throws IOException { void emptyTypeDeclarationWithSuperClass() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode(); KotlinSourceCode sourceCode = new KotlinSourceCode();