Adding field declaration for code generation

See gh-881
This commit is contained in:
Matt Berteaux
2019-03-31 18:52:39 -06:00
committed by Stephane Nicoll
parent d8a5be76f5
commit e7d5f8ffaf
40 changed files with 2372 additions and 239 deletions

View File

@@ -26,6 +26,7 @@ import java.util.List;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.language.Annotation;
import io.spring.initializr.generator.language.Parameter;
import io.spring.initializr.generator.language.java.JavaPrimitives;
import io.spring.initializr.generator.test.io.TextTestUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
@@ -114,6 +115,61 @@ class GroovySourceCodeWriterTests {
" SpringApplication.run(Test, args)", " }", "", "}");
}
@Test
void field() throws IOException {
GroovySourceCode sourceCode = new GroovySourceCode();
GroovyCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
GroovyTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addFieldDeclaration(GroovyFieldDeclaration.field("testString").returning(GroovyString.CLASS_NAME));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.groovy");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "", " String testString", "",
"}");
}
@Test
void fieldsWithValues() throws IOException {
GroovySourceCode sourceCode = new GroovySourceCode();
GroovyCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
GroovyTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addFieldDeclaration(GroovyFieldDeclaration.field("testInteger").value(GroovyPrimitives.integerValue(42))
.returning(GroovyPrimitives.GroovyInteger.BOXED_CLASS_NAME));
test.addFieldDeclaration(GroovyFieldDeclaration.field("testDouble").modifiers(Modifier.PRIVATE)
.value(GroovyPrimitives.doubleValue(1986d)).returning(JavaPrimitives.JavaDouble.TYPE));
test.addFieldDeclaration(GroovyFieldDeclaration.field("testLong").value(GroovyPrimitives.longValue(1986L))
.returning(GroovyPrimitives.GroovyLong.TYPE));
test.addFieldDeclaration(GroovyFieldDeclaration.field("testNullBoolean")
.value(GroovyPrimitives.booleanValue(null)).returning(GroovyPrimitives.GroovyBoolean.BOXED_CLASS_NAME));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.groovy");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "", " Integer testInteger = 42",
"", " private double testDouble = 1986.0", "", " long testLong = 1986L", "",
" Boolean testNullBoolean = null", "", "}");
}
@Test
void privateField() throws IOException {
GroovySourceCode sourceCode = new GroovySourceCode();
GroovyCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
GroovyTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addFieldDeclaration(GroovyFieldDeclaration.field("testString").modifiers(Modifier.PRIVATE)
.returning(GroovyString.CLASS_NAME));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.groovy");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" private String testString", "", "}");
}
@Test
void fieldAnnotation() throws IOException {
GroovySourceCode sourceCode = new GroovySourceCode();
GroovyCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
GroovyTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addFieldDeclaration(GroovyFieldDeclaration.field("testString")
.withAnnotation(Annotation.name("org.springframework.beans.factory.annotation.Autowired"))
.returning(GroovyString.CLASS_NAME));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.groovy");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "", " @Autowired",
" String testString", "", "}");
}
@Test
void annotationWithSimpleAttribute() throws IOException {
List<String> lines = writeClassAnnotation(Annotation.name("org.springframework.test.TestApplication",

View File

@@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link JavaSourceCodeWriter}.
*
* @author Andy Wilkinson
* @author Matt Berteaux
*/
class JavaSourceCodeWriterTests {
@@ -88,13 +89,70 @@ class JavaSourceCodeWriterTests {
JavaCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addMethodDeclaration(JavaMethodDeclaration.method("trim").returning("java.lang.String")
.modifiers(Modifier.PUBLIC).parameters(new Parameter("java.lang.String", "value"))
.modifiers(Modifier.PUBLIC).parameters(new Parameter(JavaString.CLASS_NAME, "value"))
.body(new JavaReturnStatement(new JavaMethodInvocation("value", "trim"))));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", "class Test {", "",
" public String trim(String value) {", " return value.trim();", " }", "", "}");
}
@Test
void field() throws IOException {
JavaSourceCode sourceCode = new JavaSourceCode();
JavaCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.modifiers(Modifier.PUBLIC);
test.addFieldDeclaration(
JavaFieldDeclaration.field("testString").modifiers(Modifier.PRIVATE).returning(JavaString.CLASS_NAME));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", "public class Test {", "",
" private String testString;", "", "}");
}
@Test
void fieldAnnotation() throws IOException {
JavaSourceCode sourceCode = new JavaSourceCode();
JavaCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.modifiers(Modifier.PUBLIC);
JavaFieldDeclaration field = JavaFieldDeclaration.field("testString").modifiers(Modifier.PRIVATE)
.returning(JavaString.CLASS_NAME);
field.annotate(Annotation.name("org.springframework.beans.factory.annotation.Autowired"));
test.addFieldDeclaration(field);
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "",
"import org.springframework.beans.factory.annotation.Autowired;", "", "public class Test {", "",
" @Autowired", " private String testString;", "", "}");
}
@Test
void fields() throws IOException {
JavaSourceCode sourceCode = new JavaSourceCode();
JavaCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
JavaTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.modifiers(Modifier.PUBLIC);
test.addFieldDeclaration(JavaFieldDeclaration.field("testString").modifiers(Modifier.PRIVATE)
.value(JavaString.stringValue("Test String")).returning(JavaString.CLASS_NAME));
test.addFieldDeclaration(JavaFieldDeclaration.field("testChar").modifiers(Modifier.PRIVATE | Modifier.TRANSIENT)
.value(JavaPrimitives.charValue("\\u03a9")).returning(JavaPrimitives.JavaChar.TYPE));
test.addFieldDeclaration(JavaFieldDeclaration.field("testInt").modifiers(Modifier.PRIVATE | Modifier.FINAL)
.value(JavaPrimitives.integerValue(1337)).returning(JavaPrimitives.JavaInteger.TYPE));
test.addFieldDeclaration(JavaFieldDeclaration.field("testDouble").modifiers(Modifier.PRIVATE)
.value(JavaPrimitives.doubleValue(3.14)).returning(JavaPrimitives.JavaDouble.BOXED_CLASS_NAME));
test.addFieldDeclaration(JavaFieldDeclaration.field("testLong").modifiers(Modifier.PRIVATE)
.value(JavaPrimitives.longValue(1986L)).returning(JavaPrimitives.JavaLong.BOXED_CLASS_NAME));
test.addFieldDeclaration(JavaFieldDeclaration.field("testFloat").value(JavaPrimitives.floatValue(99.999f))
.returning(JavaPrimitives.JavaFloat.TYPE));
test.addFieldDeclaration(JavaFieldDeclaration.field("testBool").packagePrivate()
.value(JavaPrimitives.booleanValue(true)).returning(JavaPrimitives.JavaBoolean.TYPE));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.java");
assertThat(lines).containsExactly("package com.example;", "", "public class Test {", "",
" private String testString = \"Test String\";", "",
" private transient char testChar = '\\u03a9';", "", " private final int testInt = 1337;", "",
" private Double testDouble = 3.14;", "", " private Long testLong = 1986L;", "",
" public float testFloat = 99.999f;", "", " boolean testBool = true;", "", "}");
}
@Test
void springBootApplication() throws IOException {
JavaSourceCode sourceCode = new JavaSourceCode();

View File

@@ -89,7 +89,7 @@ class KotlinSourceCodeWriterTests {
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addFunctionDeclaration(KotlinFunctionDeclaration.function("reverse").returning("java.lang.String")
.parameters(new Parameter("java.lang.String", "echo"))
.body(new KotlinReturnStatement(new KotlinFunctionInvocation("echo", "reversed"))));
.body(new KotlinReturnStatement(new KotlinMethodInvocation("echo", "reversed"))));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" fun reverse(echo: String): String {", " return echo.reversed()", " }", "", "}");
@@ -103,7 +103,7 @@ class KotlinSourceCodeWriterTests {
test.addFunctionDeclaration(KotlinFunctionDeclaration.function("toString")
.modifiers(KotlinModifier.OVERRIDE, KotlinModifier.PUBLIC, KotlinModifier.OPEN)
.returning("java.lang.String")
.body(new KotlinReturnStatement(new KotlinFunctionInvocation("super", "toString"))));
.body(new KotlinReturnStatement(new KotlinMethodInvocation("super", "toString"))));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" open override fun toString(): String {", " return super.toString()", " }", "", "}");
@@ -178,6 +178,102 @@ class KotlinSourceCodeWriterTests {
"@TestApplication(target = One::class, unit = ChronoUnit.NANOS)", "class Test");
}
@Test
void valProperty() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(
KotlinPropertyDeclaration.val("testProp").returning(KotlinString.CLASS_NAME).emptyValue());
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "", " val testProp: String", "",
"}");
}
@Test
void valGetterProperty() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(KotlinPropertyDeclaration.val("testProp").returning(KotlinString.CLASS_NAME)
.value(KotlinString.stringValue("This is a TEST")));
test.addPropertyDeclaration(KotlinPropertyDeclaration.val("withGetter").returning(KotlinString.CLASS_NAME)
.getter().withBody(new KotlinExpressionStatement(new KotlinMethodInvocation("testProp", "toLowerCase")))
.buildAccessor().emptyValue());
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" val testProp: String = \"This is a TEST\"", "", " val withGetter: String",
" get() = testProp.toLowerCase()", "", "}");
}
@Test
void varProperty() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testProp").returning(KotlinString.CLASS_NAME)
.value(KotlinString.stringValue("This is a test")));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" var testProp: String = \"This is a test\"", "", "}");
}
@Test
void varPrivateSetterProperty() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testProp").returning(KotlinString.CLASS_NAME)
.setter().isPrivate().buildAccessor().value(KotlinString.stringValue("This is a test")));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" var testProp: String = \"This is a test\"", " private set", "", "}");
}
@Test
void varAnnotateSetterProperty() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testProp").returning(KotlinString.CLASS_NAME)
.setter().withAnnotation(Annotation.name("org.springframework.beans.factory.annotation.Autowired"))
.buildAccessor().value(KotlinString.stringValue("This is a test")));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "",
" var testProp: String = \"This is a test\"", " @Autowired set", "", "}");
}
@Test
void varProperties() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testProp")
.returning(KotlinPrimitives.KotlinInt.BOXED_CLASS_NAME).value(KotlinPrimitives.integerValue(42)));
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testDouble")
.returning(KotlinPrimitives.KotlinDouble.BOXED_CLASS_NAME).value(KotlinPrimitives.doubleValue(1986d)));
test.addPropertyDeclaration(
KotlinPropertyDeclaration.var("testFloat").value(KotlinPrimitives.floatValue(99.999f)));
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testLong")
.returning(KotlinPrimitives.KotlinLong.BOXED_CLASS_NAME).value(KotlinPrimitives.longValue(1986L)));
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "", " var testProp: Int = 42",
"", " var testDouble: Double = 1986.0", "", " var testFloat = 99.999f", "",
" var testLong: Long = 1986L", "", "}");
}
@Test
void varEmptyProperty() throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");
KotlinTypeDeclaration test = compilationUnit.createTypeDeclaration("Test");
test.addPropertyDeclaration(KotlinPropertyDeclaration.var("testProp")
.returning(KotlinPrimitives.KotlinInt.BOXED_CLASS_NAME).empty());
List<String> lines = writeSingleType(sourceCode, "com/example/Test.kt");
assertThat(lines).containsExactly("package com.example", "", "class Test {", "", " var testProp: Int", "",
"}");
}
private List<String> writeClassAnnotation(Annotation annotation) throws IOException {
KotlinSourceCode sourceCode = new KotlinSourceCode();
KotlinCompilationUnit compilationUnit = sourceCode.createCompilationUnit("com.example", "Test");