From 6bf8323ece4b79f41ae2c38ed7e2a291d0534a65 Mon Sep 17 00:00:00 2001 From: amckenzie Date: Mon, 21 Aug 2017 14:54:36 +0100 Subject: [PATCH] add integration test for Enums --- .../integration/test/EnumGeneratorIT.java | 109 ++++++++++++++++++ .../generation/pojo/dom/ClassDefinition.java | 3 +- .../pojo/generators/EnumGenerator.java | 5 +- .../pojo/generators/JavaGeneratorFactory.java | 6 +- .../generators/StringElementGenerator.java | 43 ------- .../ElementGeneratableFactoryTest.java | 40 ------- .../generators/JavaGeneratorFactoryTest.java | 4 +- .../StringElementGeneratorTest.java | 31 ----- pom.xml | 2 +- 9 files changed, 118 insertions(+), 125 deletions(-) create mode 100644 integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/EnumGeneratorIT.java delete mode 100644 pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java delete mode 100644 pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java delete mode 100644 pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/EnumGeneratorIT.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/EnumGeneratorIT.java new file mode 100644 index 0000000..6ed263e --- /dev/null +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/test/EnumGeneratorIT.java @@ -0,0 +1,109 @@ +package uk.gov.justice.generation.pojo.integration.test; + +import static com.jayway.jsonassert.JsonAssert.with; +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.reducing; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.io.FileUtils.cleanDirectory; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import uk.gov.justice.generation.bootstrap.GenerationContextFactory; +import uk.gov.justice.generation.pojo.core.GenerationContext; +import uk.gov.justice.generation.pojo.dom.ClassDefinition; +import uk.gov.justice.generation.pojo.dom.ClassName; +import uk.gov.justice.generation.pojo.dom.EnumDefinition; +import uk.gov.justice.generation.pojo.dom.FieldDefinition; +import uk.gov.justice.generation.pojo.generators.JavaGeneratorFactory; +import uk.gov.justice.generation.pojo.integration.utils.ClassCompiler; +import uk.gov.justice.generation.pojo.write.SourceWriter; +import uk.gov.justice.services.common.converter.jackson.ObjectMapperProducer; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.util.List; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Before; +import org.junit.Test; + +public class EnumGeneratorIT { + + private final SourceWriter sourceWriter = new SourceWriter(); + private final ClassCompiler classCompiler = new ClassCompiler(); + + private final ObjectMapper objectMapper = new ObjectMapperProducer().objectMapper(); + private final JavaGeneratorFactory javaGeneratorFactory = new JavaGeneratorFactory(); + + private File sourceOutputDirectory; + private File classesOutputDirectory; + + @Before + @SuppressWarnings("ResultOfMethodCallIgnored") + public void setup() throws Exception { + sourceOutputDirectory = new File("./target/test-generation"); + classesOutputDirectory = new File("./target/test-classes"); + + sourceOutputDirectory.mkdirs(); + classesOutputDirectory.mkdirs(); + + if (sourceOutputDirectory.exists()) { + cleanDirectory(sourceOutputDirectory); + } + } + + @SuppressWarnings("unchecked") + @Test + public void shouldGenerateJavaClassSourceCode() throws Exception { + + final String packageName = "uk.gov.justice.pojo"; + + final GenerationContext generationContext = new GenerationContextFactory().create(sourceOutputDirectory); + final ClassDefinition studentDefinition = studentDefinition(packageName); + final EnumDefinition colourDefinition = colourDefinition(packageName); + + final List> classes = javaGeneratorFactory + .createClassGeneratorsFor(asList(colourDefinition, studentDefinition)) + .stream() + .map(classGenerator -> { + sourceWriter.write(classGenerator, generationContext); + return classCompiler.compile(classGenerator, sourceOutputDirectory, classesOutputDirectory); + }).collect(toList()); + + assertThat(classes.get(0).getName(), is(colourDefinition.getClassName().getFullyQualifiedName())); + assertThat(classes.get(1).getName(), is(studentDefinition.getClassName().getFullyQualifiedName())); + + final String enumName = colourDefinition.getEnumValues().get(0); + + + final Class enumClass = (Class) classes.get(0); + final Enum red = Enum.valueOf(enumClass, enumName.toUpperCase()); + + final Constructor studentConstructor = classes.get(1).getConstructor(String.class, Integer.class, classes.get(0)); + final String name = "Fred"; + final Integer age = 21; + final Object student = studentConstructor.newInstance(name, age, red); + + final String studentJson = objectMapper.writeValueAsString(student); + + with(studentJson) + .assertThat("$.name", is(name)) + .assertThat("$.age", is(age)) + .assertThat("$.favouriteColour", is("Red")) + ; + } + + private ClassDefinition studentDefinition(final String packageName) { + + return new ClassDefinition("student", new ClassName(packageName, "Student")) + .addFieldDefinition(new FieldDefinition("name", new ClassName(String.class))) + .addFieldDefinition(new FieldDefinition("age", new ClassName(Integer.class))) + .addFieldDefinition(new FieldDefinition("favouriteColour", new ClassName(packageName, "Colour"))) + ; + } + + private EnumDefinition colourDefinition(final String packageName) { + + return new EnumDefinition("favouriteColour", new ClassName(packageName, "Colour"), asList("Red", "Green", "Blue")); + } +} diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java index fc332ba..29330a6 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/ClassDefinition.java @@ -13,8 +13,9 @@ public ClassDefinition(final String fieldName, final ClassName className) { super(fieldName, className); } - public void addFieldDefinition(final Definition fieldDefinition) { + public ClassDefinition addFieldDefinition(final Definition fieldDefinition) { fieldDefinitions.add(fieldDefinition); + return this; } public List getFieldDefinitions() { diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java index 16bb8a0..093da3d 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/EnumGenerator.java @@ -12,6 +12,7 @@ import uk.gov.justice.generation.pojo.dom.EnumDefinition; import com.squareup.javapoet.TypeSpec; +import com.squareup.javapoet.TypeSpec.Builder; public class EnumGenerator implements ClassGeneratable { @@ -20,7 +21,7 @@ public class EnumGenerator implements ClassGeneratable { private final EnumDefinition enumDefinition; - public EnumGenerator(EnumDefinition enumDefinition) { + public EnumGenerator(final EnumDefinition enumDefinition) { this.enumDefinition = enumDefinition; } @@ -28,7 +29,7 @@ public EnumGenerator(EnumDefinition enumDefinition) { public TypeSpec generate() { final String className = enumDefinition.getClassName().getSimpleName(); - TypeSpec.Builder enumBuilder = enumBuilder(className).addModifiers(PUBLIC); + final Builder enumBuilder = enumBuilder(className).addModifiers(PUBLIC); enumDefinition.getEnumValues().forEach(enumValue -> { final String enumName = enumValue.isEmpty() ? BLANK_ENUM_NAME : enumValue.toUpperCase(); diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java index 74a8c2a..03b8de2 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactory.java @@ -13,14 +13,10 @@ public class JavaGeneratorFactory { public ElementGeneratable createGeneratorFor(final Definition definition) { - if (definition.getClass() == ClassDefinition.class) { + if (definition.getClass() == ClassDefinition.class || definition.getClass() == EnumDefinition.class) { return new ElementGenerator(definition); } - if (definition.getClass() == EnumDefinition.class) { - return new StringElementGenerator(definition); - } - return new FieldGenerator((FieldDefinition) definition); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java deleted file mode 100644 index 04063e6..0000000 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/StringElementGenerator.java +++ /dev/null @@ -1,43 +0,0 @@ -package uk.gov.justice.generation.pojo.generators; - -import static com.squareup.javapoet.FieldSpec.builder; -import static com.squareup.javapoet.MethodSpec.methodBuilder; -import static javax.lang.model.element.Modifier.FINAL; -import static javax.lang.model.element.Modifier.PRIVATE; -import static javax.lang.model.element.Modifier.PUBLIC; - -import uk.gov.justice.generation.pojo.dom.Definition; - -import java.util.stream.Stream; - -import com.squareup.javapoet.CodeBlock; -import com.squareup.javapoet.FieldSpec; -import com.squareup.javapoet.MethodSpec; - -public class StringElementGenerator implements ElementGeneratable { - - private final Definition classTypeDefinition; - private final DefinitionToTypeNameConverter definitionToTypeNameConverter = new DefinitionToTypeNameConverter(); - - StringElementGenerator(final Definition classTypeDefinition) { - this.classTypeDefinition = classTypeDefinition; - } - - @Override - public FieldSpec generateField() { - return builder(definitionToTypeNameConverter.getTypeName(classTypeDefinition), classTypeDefinition.getFieldName(), PRIVATE, FINAL).build(); - } - - @Override - public Stream generateMethods() { - return Stream.of(methodBuilder(toGetterMethodName()) - .addModifiers(PUBLIC) - .returns(String.class) - .addCode(CodeBlock.builder().addStatement("return $L.toString()", classTypeDefinition.getFieldName()).build()) - .build()); - } - - private String toGetterMethodName() { - return "get" + classTypeDefinition.getClassName().getSimpleName(); - } -} \ No newline at end of file diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java deleted file mode 100644 index 9912a43..0000000 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ElementGeneratableFactoryTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package uk.gov.justice.generation.pojo.generators; - -import static java.util.Collections.emptyList; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; - -import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.dom.ClassName; -import uk.gov.justice.generation.pojo.dom.EnumDefinition; -import uk.gov.justice.generation.pojo.dom.FieldDefinition; - -import org.junit.Test; - -public class ElementGeneratableFactoryTest { - - @Test - public void shouldCreateFieldGeneratorForFieldDefinition() throws Exception { - final FieldDefinition fieldDefinition = new FieldDefinition("fieldName", new ClassName(String.class)); - final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(fieldDefinition); - - assertThat(elementGeneratable, is(instanceOf(FieldGenerator.class))); - } - - @Test - public void shouldCreateElementGeneratorForClassDefinition() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition("fieldName", new ClassName("", "")); - final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(classDefinition); - - assertThat(elementGeneratable, is(instanceOf(ElementGenerator.class))); - } - - @Test - public void shouldCreateElementGeneratorForEnumDefinition() throws Exception { - final EnumDefinition enumDefinition = new EnumDefinition("fieldName", new ClassName("", ""), emptyList()); - final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(enumDefinition); - - assertThat(elementGeneratable, is(instanceOf(StringElementGenerator.class))); - } -} diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java index ad775d2..666f073 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/JavaGeneratorFactoryTest.java @@ -41,7 +41,7 @@ public void shouldReturnInstanceOfElementGeneratorForEnumDefinition() throws Exc final EnumDefinition enumDefinition = new EnumDefinition("test", mock(ClassName.class), emptyList()); final ElementGeneratable elementGeneratable = new JavaGeneratorFactory().createGeneratorFor(enumDefinition); - assertThat(elementGeneratable, is(instanceOf(StringElementGenerator.class))); + assertThat(elementGeneratable, is(instanceOf(ElementGenerator.class))); } @Test @@ -80,4 +80,4 @@ public void shouldIgnoreDefinitionsThatAreNotClassDefinitionOrEnumDefinition() t assertThat(classGeneratables, hasItems(instanceOf(ClassGenerator.class), instanceOf(EnumGenerator.class))); } -} \ No newline at end of file +} diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java deleted file mode 100644 index 688feeb..0000000 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/StringElementGeneratorTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package uk.gov.justice.generation.pojo.generators; - -import com.squareup.javapoet.FieldSpec; -import com.squareup.javapoet.MethodSpec; -import org.junit.Test; -import uk.gov.justice.generation.pojo.dom.ClassDefinition; -import uk.gov.justice.generation.pojo.dom.ClassName; - -import java.util.stream.Stream; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; - -public class StringElementGeneratorTest { - final ClassName className = new ClassName("org.something", "Address"); - final ClassDefinition classDefinition = new ClassDefinition("addressLine1", className); - final StringElementGenerator stringElementGenerator = new StringElementGenerator(classDefinition); - - @Test - public void shouldGenerateField() { - final FieldSpec fieldSpec = stringElementGenerator.generateField(); - assertThat(fieldSpec.name, is("addressLine1")); - } - - @Test - public void shouldGenerateMethods() { - final Stream methods = stringElementGenerator.generateMethods(); - assertThat(methods.findFirst().get().name, is("getAddress")); - } - -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 21ee75a..d88e999 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 1.17.0 2.2.0 - 1.7.0 + 1.8.0 1.7.0