Skip to content
This repository has been archived by the owner on May 26, 2020. It is now read-only.

Commit

Permalink
add integration test for Enums
Browse files Browse the repository at this point in the history
  • Loading branch information
amckenzie committed Aug 21, 2017
1 parent 12d681e commit 6bf8323
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 125 deletions.
Original file line number Diff line number Diff line change
@@ -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<? extends Class<?>> 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<? extends Enum> enumClass = (Class<? extends Enum>) 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"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Definition> getFieldDefinitions() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -20,15 +21,15 @@ public class EnumGenerator implements ClassGeneratable {

private final EnumDefinition enumDefinition;

public EnumGenerator(EnumDefinition enumDefinition) {
public EnumGenerator(final EnumDefinition enumDefinition) {
this.enumDefinition = enumDefinition;
}

@Override
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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -80,4 +80,4 @@ public void shouldIgnoreDefinitionsThatAreNotClassDefinitionOrEnumDefinition() t
assertThat(classGeneratables, hasItems(instanceOf(ClassGenerator.class), instanceOf(EnumGenerator.class)));

}
}
}

This file was deleted.

2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<properties>
<common-bom.version>1.17.0</common-bom.version>
<framework-version>2.2.0</framework-version>
<utilities.version>1.7.0</utilities.version>
<utilities.version>1.8.0</utilities.version>
<generator-maven-plugin.version>1.7.0</generator-maven-plugin.version>
</properties>

Expand Down

0 comments on commit 6bf8323

Please sign in to comment.