diff --git a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/ClassCompiler.java b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/ClassCompiler.java index 3d88d16..23e60bb 100644 --- a/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/ClassCompiler.java +++ b/integration-test/src/test/java/uk/gov/justice/generation/pojo/integration/utils/ClassCompiler.java @@ -14,6 +14,6 @@ public Class compile( final File classesOutputDirectory) { final JavaCompilerUtil compiler = new JavaCompilerUtil(generationContext.getOutputDirectoryPath().toFile(), classesOutputDirectory); - return compiler.compiledClassOf(generationContext.getPackageName(), classGenerator.getSimpleClassName()); + return compiler.compiledClassOf(classGenerator.getPackageName(), classGenerator.getSimpleClassName()); } } 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 1310778..0506ba0 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 @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * Defines a class that will be generated as a java POJO @@ -12,6 +13,7 @@ public class ClassDefinition extends FieldDefinition { private final List fieldDefinitions = new ArrayList<>(); + private final Optional id; private boolean allowAdditionalProperties = false; private boolean root = false; @@ -19,14 +21,31 @@ public class ClassDefinition extends FieldDefinition { /** * Creates a ClassDefinition that is not the root class. * - * @param type The {@link DefinitionType} of the class. Can be a - * {@link DefinitionType#CLASS} - * {@link DefinitionType#ENUM} or - * {@link DefinitionType#COMBINED} + * @param type The {@link DefinitionType} of the class. Can be a + * {@link DefinitionType#CLASS} + * {@link DefinitionType#ENUM} or + * {@link DefinitionType#COMBINED} + * @param fieldName The name of the field that will be used in the generated POJO + * @param id The id of the field used to create package and className + */ + public ClassDefinition(final DefinitionType type, final String fieldName, final String id) { + super(type, fieldName); + this.id = Optional.ofNullable(id); + } + + /** + * Creates a ClassDefinition that is not the root class and has not id. + * + * @param type The {@link DefinitionType} of the class. Can be a + * {@link DefinitionType#CLASS} + * {@link DefinitionType#ENUM} or + * {@link DefinitionType#COMBINED} + * DefinitionType#COMBINED} * @param fieldName The name of the field that will be used in the generated POJO */ public ClassDefinition(final DefinitionType type, final String fieldName) { super(type, fieldName); + this.id = Optional.empty(); } /** @@ -96,10 +115,20 @@ public void setRoot(final boolean root) { this.root = root; } + /** + * Gets the id of the definition. If present id is used to create the class name and package + * + * @return Optional id + */ + public Optional getId() { + return id; + } + @Override public String toString() { return "ClassDefinition{" + "fieldName=" + getFieldName() + + ", id=" + getId().toString() + ", type=" + type() + ", required=" + isRequired() + ", allowAdditionalProperties=" + allowAdditionalProperties + diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/CombinedDefinition.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/CombinedDefinition.java index 73441ce..d235b73 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/CombinedDefinition.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/dom/CombinedDefinition.java @@ -17,8 +17,8 @@ */ public class CombinedDefinition extends ClassDefinition { - public CombinedDefinition(final String fieldName) { - super(COMBINED, fieldName); + public CombinedDefinition(final String fieldName, final String id) { + super(COMBINED, fieldName, id); } /** diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGeneratable.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGeneratable.java index 3c08028..199fc55 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGeneratable.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGeneratable.java @@ -19,7 +19,15 @@ public interface ClassGeneratable { /** * Gets the simple name of the POJO that is to be generated + * * @return The simple name of the POJO */ String getSimpleClassName(); + + /** + * Gets the package name of the POJO that is to be generated + * + * @return The package name of the POJO + */ + String getPackageName(); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java index 4ffef6c..445b99c 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassGenerator.java @@ -49,6 +49,11 @@ public String getSimpleClassName() { return getClassName().simpleName(); } + @Override + public String getPackageName() { + return getClassName().packageName(); + } + private ClassName getClassName() { return classNameFactory.createClassNameFrom(classDefinition); } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassNameFactory.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassNameFactory.java index f411d99..12fc2e9 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassNameFactory.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/ClassNameFactory.java @@ -1,6 +1,5 @@ package uk.gov.justice.generation.pojo.generators; -import uk.gov.justice.generation.pojo.dom.ClassDefinition; import uk.gov.justice.generation.pojo.dom.Definition; import uk.gov.justice.generation.pojo.plugin.PluginContext; import uk.gov.justice.generation.pojo.plugin.TypeNamePluginProcessor; @@ -9,9 +8,8 @@ import com.squareup.javapoet.TypeName; /** - * Generates the correct {@link TypeName} for the specifed {@link Definition}. - * Used for generating the correct return types and parameters. Can handle - * generic types. + * Generates the correct {@link TypeName} for the specifed {@link Definition}. Used for generating + * the correct return types and parameters. Can handle generic types. * * The behaviour can be modified using {@link uk.gov.justice.generation.pojo.plugin.typemodifying.TypeModifyingPlugin}s */ @@ -30,9 +28,8 @@ public ClassNameFactory( /** * Generate to correct return type/parameter type for the specified {@link Definition} * - * @param definition The definition for which to generate the correct return type + * @param definition The definition for which to generate the correct return type * @param pluginContext The {@link PluginContext} - * * @return The correct type for returns and parameters */ public TypeName createTypeNameFrom(final Definition definition, final PluginContext pluginContext) { @@ -63,8 +60,8 @@ public TypeName createTypeNameFrom(final Definition definition, final PluginCont typeName = typeNameProvider.typeNameForString(); break; - case CLASS: case ENUM: + case CLASS: case COMBINED: default: typeName = typeNameProvider.typeNameForClass(definition); @@ -73,7 +70,7 @@ public TypeName createTypeNameFrom(final Definition definition, final PluginCont return typeNamePluginProcessor.processTypeNamePlugins(typeName, definition, pluginContext); } - public ClassName createClassNameFrom(final ClassDefinition classDefinition) { - return typeNameProvider.typeNameForClass(classDefinition); + public ClassName createClassNameFrom(final Definition definition) { + return typeNameProvider.typeNameForClass(definition); } } 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 c76d18d..0ae8d13 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 @@ -8,7 +8,6 @@ import static javax.lang.model.element.Modifier.PRIVATE; import static javax.lang.model.element.Modifier.PUBLIC; import static javax.lang.model.element.Modifier.STATIC; -import static org.apache.commons.lang3.StringUtils.capitalize; import uk.gov.justice.generation.pojo.dom.EnumDefinition; import uk.gov.justice.generation.pojo.plugin.PluginContext; @@ -35,7 +34,6 @@ public class EnumGenerator implements ClassGeneratable { private final EnumDefinition enumDefinition; private final ClassNameFactory classNameFactory; private final PluginContext pluginContext; - private final String className; public EnumGenerator(final EnumDefinition definition, final ClassNameFactory classNameFactory, @@ -43,13 +41,12 @@ public EnumGenerator(final EnumDefinition definition, this.enumDefinition = definition; this.classNameFactory = classNameFactory; this.pluginContext = pluginContext; - this.className = capitalize(enumDefinition.getFieldName()); } @Override public TypeSpec generate() { - final Builder enumBuilder = enumBuilder(className).addModifiers(PUBLIC); + final Builder enumBuilder = enumBuilder(getClassName()).addModifiers(PUBLIC); enumDefinition.getEnumValues().forEach(enumValue -> { final String enumName = constructEnumNameFrom(enumValue); @@ -104,10 +101,19 @@ private MethodSpec buildValueForMethod() { @Override public String getSimpleClassName() { - return className; + return getClassName().simpleName(); + } + + @Override + public String getPackageName() { + return getClassName().packageName(); } private String constructEnumNameFrom(final String enumValue) { return enumValue.isEmpty() ? BLANK_ENUM_NAME : enumValue.toUpperCase().replace(SPACE, UNDERSCORE); } + + private ClassName getClassName() { + return classNameFactory.createClassNameFrom(enumDefinition); + } } diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/TypeNameProvider.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/TypeNameProvider.java index 1c95e91..27b2552 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/TypeNameProvider.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/generators/TypeNameProvider.java @@ -18,8 +18,8 @@ import com.squareup.javapoet.TypeName; /** - * Gets the correct class name for a java type. Used for return types, fields and parameters. - * Can handle generics and lists + * Gets the correct class name for a java type. Used for return types, fields and parameters. Can + * handle generics and lists */ public class TypeNameProvider { @@ -32,13 +32,13 @@ public TypeNameProvider(final GenerationContext generationContext) { } /** - * Generates the correct class name for an array. As an array is always implemented as - * a java {@link List} the class name will always be a list of the type specified by - * the {@link Definition} + * Generates the correct class name for an array. As an array is always implemented as a java + * {@link List} the class name will always be a list of the type specified by the {@link + * Definition} * - * @param definition The {@link Definition} from which to create the class name - * @param classNameFactory The {@link ClassNameFactory} to create the underlying class name - * (not including any generics) + * @param definition The {@link Definition} from which to create the class name + * @param classNameFactory The {@link ClassNameFactory} to create the underlying class name (not + * including any generics) * @return The correct type name */ public TypeName typeNameForArray( @@ -62,9 +62,9 @@ public TypeName typeNameForArray( * Creates the correct java type name for a {@link ReferenceDefinition} by using the child * reference as the java type. Can handle arrays and generics * - * @param definition The {@link ReferenceDefinition} - * @param classNameFactory The {@link ClassNameFactory} to create the underlying class name - * (not including any generics) + * @param definition The {@link ReferenceDefinition} + * @param classNameFactory The {@link ClassNameFactory} to create the underlying class name (not + * including any generics) * @return The correct type name */ public TypeName typeNameForReference( @@ -83,6 +83,7 @@ public TypeName typeNameForReference( /** * Generates the correct type name for a {@link String} + * * @return The class name for {@link String} */ public ClassName typeNameForString() { @@ -91,8 +92,8 @@ public ClassName typeNameForString() { /** * Generates the correct type name for a java class - * @param definition The definition from which to generated the type name * + * @param definition The definition from which to generated the type name * @return The class name for a java class */ public ClassName typeNameForClass(final Definition definition) { @@ -101,6 +102,7 @@ public ClassName typeNameForClass(final Definition definition) { /** * Generates the correct type name for a {@link BigDecimal} + * * @return The class name for {@link BigDecimal} */ public ClassName typeNameForNumber() { @@ -109,6 +111,7 @@ public ClassName typeNameForNumber() { /** * Generates the correct type name for a {@link Integer} + * * @return The class name for {@link Integer} */ public ClassName typeNameForInteger() { @@ -117,6 +120,7 @@ public ClassName typeNameForInteger() { /** * Generates the correct type name for a {@link Boolean} + * * @return The class name for {@link Boolean} */ public ClassName typeNameForBoolean() { diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGenerator.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGenerator.java index b140f13..4b523c2 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGenerator.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGenerator.java @@ -76,6 +76,11 @@ public String getSimpleClassName() { return BUILDER_SIMPLE_NAME; } + @Override + public String getPackageName() { + throw new UnsupportedOperationException(); + } + public MethodSpec generateStaticGetBuilderMethod() { return methodBuilder(classDefinition.getFieldName()) .addModifiers(PUBLIC, STATIC) diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/visitor/DefaultDefinitionFactory.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/visitor/DefaultDefinitionFactory.java index 685f180..a540832 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/visitor/DefaultDefinitionFactory.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/visitor/DefaultDefinitionFactory.java @@ -54,11 +54,13 @@ public DefaultDefinitionFactory(final ReferenceValueParser referenceValueParser, @Override public Definition constructRootDefinitionFor(final String fieldName, final Schema schema) { + final String id = schema.getId(); + final ClassDefinition definition; if (schema instanceof CombinedSchema) { - definition = new CombinedDefinition(fieldName); + definition = new CombinedDefinition(fieldName, id); } else { - definition = new ClassDefinition(CLASS, fieldName); + definition = new ClassDefinition(CLASS, fieldName, id); } definition.setRoot(true); @@ -74,15 +76,15 @@ public Definition constructDefinitionFor(final String fieldName, final Schema sc } if (schema instanceof CombinedSchema) { - return new CombinedDefinition(fieldName); + return new CombinedDefinition(fieldName, schema.getId()); } if (schema instanceof ObjectSchema) { - return new ClassDefinition(CLASS, fieldName); + return new ClassDefinition(CLASS, fieldName, schema.getId()); } if (schema instanceof ArraySchema) { - return new ClassDefinition(ARRAY, fieldName); + return new ClassDefinition(ARRAY, fieldName, schema.getId()); } if (schema instanceof EnumSchema) { @@ -111,7 +113,7 @@ public Definition constructDefinitionFor(final String fieldName, final Schema sc } if (schema instanceof EmptySchema) { - return new ClassDefinition(CLASS, fieldName); + return new ClassDefinition(CLASS, fieldName, schema.getId()); } throw new UnsupportedSchemaException(format(EXCEPTION_FORMAT_MESSAGE, schema.getClass().getSimpleName())); diff --git a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/write/SourceWriter.java b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/write/SourceWriter.java index c6e6db9..f983903 100644 --- a/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/write/SourceWriter.java +++ b/pojo-generator-core/src/main/java/uk/gov/justice/generation/pojo/write/SourceWriter.java @@ -24,7 +24,7 @@ public class SourceWriter { */ public void write(final ClassGeneratable classGenerator, final GenerationContext generationContext) { final TypeSpec typeSpec = classGenerator.generate(); - writeClass(generationContext.getOutputDirectoryPath(), generationContext.getPackageName(), typeSpec); + writeClass(generationContext.getOutputDirectoryPath(), classGenerator.getPackageName(), typeSpec); } private void writeClass(final Path outputDirectory, final String packageName, final TypeSpec typeSpec) { diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/ClassDefinitionTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/ClassDefinitionTest.java index 9ca9dc2..e2178b5 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/ClassDefinitionTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/ClassDefinitionTest.java @@ -9,6 +9,7 @@ import static uk.gov.justice.generation.pojo.dom.DefinitionType.CLASS; import java.util.List; +import java.util.Optional; import org.junit.Test; @@ -17,10 +18,12 @@ public class ClassDefinitionTest { @Test public void shouldReturnFieldNameUsedInConstruction() throws Exception { final String fieldName = "test"; - final ClassDefinition classDefinition = new ClassDefinition(CLASS, fieldName); + final String id = "http://id.com/id"; + final ClassDefinition classDefinition = new ClassDefinition(CLASS, fieldName, id); assertThat(classDefinition, is(instanceOf(FieldDefinition.class))); assertThat(classDefinition.getFieldName(), is(fieldName)); + assertThat(classDefinition.getId(), is(Optional.of(id))); } @Test @@ -33,7 +36,7 @@ public void shouldAddAndRetrieveFieldDefinitions() throws Exception { when(fieldDefinition2.getFieldName()).thenReturn("fieldDefinition2"); when(fieldDefinition3.getFieldName()).thenReturn("fieldDefinition3"); - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "fieldName"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "fieldName", "id"); classDefinition.addFieldDefinition(fieldDefinition1); classDefinition.addFieldDefinition(fieldDefinition2); classDefinition.addFieldDefinition(fieldDefinition3); @@ -54,7 +57,7 @@ public void shouldGetFieldDefinitionsSortedByFieldName() throws Exception { when(fieldDefinition_2.getFieldName()).thenReturn("aaa"); when(fieldDefinition_3.getFieldName()).thenReturn("mmm"); - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "fieldName"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "fieldName", "id"); classDefinition.addFieldDefinition(fieldDefinition_1); classDefinition.addFieldDefinition(fieldDefinition_2); classDefinition.addFieldDefinition(fieldDefinition_3); @@ -68,13 +71,13 @@ public void shouldGetFieldDefinitionsSortedByFieldName() throws Exception { @Test public void additionalPropertiesShouldBeFalseByDefault() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "myField"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "myField", "id"); assertThat(classDefinition.allowAdditionalProperties(), is(false)); } @Test public void shouldAllowAdditionalProperties() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "fieldName"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "fieldName", "id"); assertThat(classDefinition.allowAdditionalProperties(), is(false)); @@ -85,7 +88,7 @@ public void shouldAllowAdditionalProperties() throws Exception { @Test public void shouldBeTheRootClass() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "test"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "test", "id"); classDefinition.setRoot(true); @@ -95,7 +98,7 @@ public void shouldBeTheRootClass() throws Exception { @Test public void shouldNotBeTheRootClass() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "test"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "test", "id"); classDefinition.setRoot(false); @@ -105,7 +108,7 @@ public void shouldNotBeTheRootClass() throws Exception { @Test public void shouldDefaultToNotBeTheRootClass() throws Exception { - final ClassDefinition classDefinition = new ClassDefinition(CLASS, "test"); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, "test", "id"); assertThat(classDefinition, is(instanceOf(FieldDefinition.class))); assertThat(classDefinition.isRoot(), is(false)); @@ -115,8 +118,8 @@ public void shouldDefaultToNotBeTheRootClass() throws Exception { public void shouldTestToStringMethodToStopCoverallsWhining() throws Exception { final String fieldName = "test"; - final ClassDefinition classDefinition = new ClassDefinition(CLASS, fieldName); + final ClassDefinition classDefinition = new ClassDefinition(CLASS, fieldName, "http://id.com/id"); - assertThat(classDefinition.toString(), is("ClassDefinition{fieldName=test, type=CLASS, required=true, allowAdditionalProperties=false, root=false}")); + assertThat(classDefinition.toString(), is("ClassDefinition{fieldName=test, id=Optional[http://id.com/id], type=CLASS, required=true, allowAdditionalProperties=false, root=false}")); } } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/CombinedDefinitionTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/CombinedDefinitionTest.java index 914ebe5..51d3c2b 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/CombinedDefinitionTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/dom/CombinedDefinitionTest.java @@ -7,6 +7,7 @@ import static uk.gov.justice.generation.pojo.dom.DefinitionType.STRING; import java.util.List; +import java.util.Optional; import org.junit.Test; @@ -15,15 +16,18 @@ public class CombinedDefinitionTest { @Test public void shouldConstructCombinedDefinition() throws Exception { final String fieldName = "fieldName"; - final CombinedDefinition combinedDefinition = new CombinedDefinition(fieldName); + final String id = "id"; + final CombinedDefinition combinedDefinition = new CombinedDefinition(fieldName, id); assertThat(combinedDefinition, is(instanceOf(ClassDefinition.class))); assertThat(combinedDefinition.getFieldName(), is(fieldName)); + assertThat(combinedDefinition.getId(), is(Optional.of(id))); assertThat(combinedDefinition.getFieldDefinitions().size(), is(0)); } @Test public void shouldReturnListOfFieldDefinitionsFromChildDefinitions() throws Exception { + final String id = "id"; final String combinedFieldName = "outerCombinedFieldName"; final String outerClassFieldName = "outerClassFieldName"; final String innerClassFieldName = "innerClassFieldName"; @@ -31,10 +35,10 @@ public void shouldReturnListOfFieldDefinitionsFromChildDefinitions() throws Exce final String stringField_2 = "stringFieldName_2"; final String stringField_3 = "stringFieldName_2"; - final CombinedDefinition outerCombinedDefinition = new CombinedDefinition(combinedFieldName); - final CombinedDefinition innerCombinedDefinition = new CombinedDefinition(combinedFieldName); - final ClassDefinition outerClassDefinition = new ClassDefinition(CLASS, outerClassFieldName); - final ClassDefinition innerClassDefinition = new ClassDefinition(CLASS, innerClassFieldName); + final CombinedDefinition outerCombinedDefinition = new CombinedDefinition(combinedFieldName, id); + final CombinedDefinition innerCombinedDefinition = new CombinedDefinition(combinedFieldName, id); + final ClassDefinition outerClassDefinition = new ClassDefinition(CLASS, outerClassFieldName, id); + final ClassDefinition innerClassDefinition = new ClassDefinition(CLASS, innerClassFieldName, id); final FieldDefinition fieldDefinition_1 = new FieldDefinition(STRING, stringField_1); final FieldDefinition fieldDefinition_2 = new FieldDefinition(STRING, stringField_2); final FieldDefinition fieldDefinition_3 = new FieldDefinition(STRING, stringField_3); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java index e58878e..2d44406 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/ClassGeneratorTest.java @@ -52,6 +52,16 @@ public void shouldReturnCorrectSimpleClassNameForGenerator() throws Exception { assertThat(classGenerator.getSimpleClassName(), is("AlcubierreDrive")); } + @Test + public void shouldReturnCorrectPackageNameForGenerator() throws Exception { + final ClassName className = get(AlcubierreDrive.class); + + when(pluginProvider.classModifyingPlugins()).thenReturn(emptyList()); + when(classNameFactory.createClassNameFrom(classDefinition)).thenReturn(className); + + assertThat(classGenerator.getPackageName(), is("uk.gov.justice.generation.pojo.generators")); + } + @Test public void shouldGenerateAnEmptyClassAndUseThePluginsToGenerateTheClassInternals() throws Exception { final ClassName className = get(AlcubierreDrive.class); diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java index d2739e1..6521bab 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/generators/EnumGeneratorTest.java @@ -1,7 +1,7 @@ package uk.gov.justice.generation.pojo.generators; +import static com.squareup.javapoet.ClassName.get; import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PUBLIC; @@ -20,6 +20,7 @@ import com.squareup.javapoet.TypeSpec; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @@ -27,21 +28,28 @@ public class EnumGeneratorTest { @Mock - private ClassNameFactory classNameFactory; + private PluginContext pluginContext; @Mock - private PluginContext pluginContext; + private EnumDefinition enumDefinition; + + @Mock + private ClassNameFactory classNameFactory; + + @InjectMocks + private EnumGenerator enumGenerator; @Test public void shouldGenerateTypeSpecForSingleWordEnumValue() { - final EnumDefinition enumDefinition = new EnumDefinition("title", singletonList("Mr")); - final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition, classNameFactory, pluginContext); + final ClassName className = get(Pojo.class); - when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(ClassName.get("", "Title")); + when(enumDefinition.getEnumValues()).thenReturn(singletonList("Mr")); + when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(className); + when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className); final TypeSpec typeSpec = enumGenerator.generate(); - assertThat(typeSpec.name, is("Title")); + assertThat(typeSpec.name, is("Pojo")); assertThat(typeSpec.enumConstants.keySet(), hasItem("MR")); assertThat(typeSpec.modifiers.size(), is(1)); assertThat(typeSpec.modifiers, hasItem(PUBLIC)); @@ -51,14 +59,15 @@ public void shouldGenerateTypeSpecForSingleWordEnumValue() { @Test public void shouldGenerateTypeSpecForMultiWordEnumValue() { - final EnumDefinition enumDefinition = new EnumDefinition("title", singletonList("Multi word value")); - final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition, classNameFactory, pluginContext); + final ClassName className = get(Pojo.class); - when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(ClassName.get("", "Title")); + when(enumDefinition.getEnumValues()).thenReturn(singletonList("Multi word value")); + when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(className); + when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className); final TypeSpec typeSpec = enumGenerator.generate(); - assertThat(typeSpec.name, is("Title")); + assertThat(typeSpec.name, is("Pojo")); assertThat(typeSpec.enumConstants.keySet(), hasItem("MULTI_WORD_VALUE")); assertThat(typeSpec.modifiers.size(), is(1)); assertThat(typeSpec.modifiers, hasItem(PUBLIC)); @@ -68,27 +77,29 @@ public void shouldGenerateTypeSpecForMultiWordEnumValue() { @Test public void shouldGenerateTypeSpecForBlankString() { - final EnumDefinition enumDefinition = new EnumDefinition("title", singletonList("")); - final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition, classNameFactory, pluginContext); + final ClassName className = get(Pojo.class); - when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(ClassName.get("", "Title")); + when(enumDefinition.getEnumValues()).thenReturn(singletonList("")); + when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(className); + when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className); final TypeSpec typeSpec = enumGenerator.generate(); - assertThat(typeSpec.name, is("Title")); + assertThat(typeSpec.name, is("Pojo")); assertThat(typeSpec.enumConstants.keySet(), hasItem("BLANK")); } @Test public void shouldGenerateTypeSpecWithValueForMethod() { - final EnumDefinition enumDefinition = new EnumDefinition("title", asList("", "Mr")); - final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition, classNameFactory, pluginContext); + final ClassName className = get(Pojo.class); - when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(ClassName.get("", "Title")); + when(enumDefinition.getEnumValues()).thenReturn(asList("", "Mr")); + when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(className); + when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className); final TypeSpec typeSpec = enumGenerator.generate(); - assertThat(typeSpec.name, is("Title")); + assertThat(typeSpec.name, is("Pojo")); assertThat(typeSpec.enumConstants.keySet(), hasItems("BLANK", "MR")); final MethodSpec valueForMethod = typeSpec.methodSpecs.get(2); @@ -96,19 +107,27 @@ public void shouldGenerateTypeSpecWithValueForMethod() { assertThat(valueForMethod.parameters, hasItem(ParameterSpec .builder(String.class, "value", FINAL) .build())); - assertThat(valueForMethod.returnType.toString(), is("java.util.Optional")); + assertThat(valueForMethod.returnType.toString(), is("java.util.Optional<uk.gov.justice.generation.pojo.generators.EnumGeneratorTest.Pojo>")); } @Test public void shouldReturnClassName() { - final EnumDefinition enumDefinition = new EnumDefinition("title", emptyList()); + final ClassName className = get(Pojo.class); - when(classNameFactory.createTypeNameFrom(enumDefinition, pluginContext)).thenReturn(ClassName.get("", "Title")); + when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className); - final EnumGenerator enumGenerator = new EnumGenerator(enumDefinition, classNameFactory, pluginContext); + assertThat(enumGenerator.getSimpleClassName(), is("Pojo")); + } - assertThat(enumGenerator.getSimpleClassName(), is("Title")); + @Test + public void shouldReturnPackageName() { + final ClassName className = get(Pojo.class); + when(classNameFactory.createClassNameFrom(enumDefinition)).thenReturn(className); + + assertThat(enumGenerator.getPackageName(), is("uk.gov.justice.generation.pojo.generators")); } + private class Pojo { + } } diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGeneratorTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGeneratorTest.java index 090e291..facdffa 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGeneratorTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/plugin/classmodifying/builder/BuilderGeneratorTest.java @@ -101,6 +101,12 @@ public void shouldGetTheCorrectSimpleNameForTheBuilder() throws Exception { assertThat(builderGenerator.getSimpleClassName(), is("Builder")); } + @Test(expected = UnsupportedOperationException.class) + public void shouldThrowExceptionWhenRequestingPackageNameForTheBuilder() throws Exception { + + builderGenerator.getPackageName(); + } + @Test public void shouldGenerateStaticGetBuilderMethod() throws Exception { diff --git a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java index 45b110c..39c84e7 100644 --- a/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java +++ b/pojo-generator-core/src/test/java/uk/gov/justice/generation/pojo/write/SourceWriterTest.java @@ -51,8 +51,8 @@ public void shouldWriteASingleSourceFile() throws Exception { final GenerationContext generationContext = mock(GenerationContext.class); when(classGenerator.generate()).thenReturn(helloWorld); + when(classGenerator.getPackageName()).thenReturn(packageName); when(generationContext.getOutputDirectoryPath()).thenReturn(sourceOutputDirectory.toPath()); - when(generationContext.getPackageName()).thenReturn(packageName); for (final ClassGeneratable classGeneratable : singletonList(classGenerator)) { sourceWriter.write(classGeneratable, generationContext); @@ -72,8 +72,8 @@ public void shouldThrowExceptionIfUnableToWriteJavaFile() throws Exception { final GenerationContext generationContext = mock(GenerationContext.class); when(classGenerator.generate()).thenReturn(helloWorld); + when(classGenerator.getPackageName()).thenReturn(packageName); when(generationContext.getOutputDirectoryPath()).thenReturn(sourceOutputDirectory.toPath()); - when(generationContext.getPackageName()).thenReturn(packageName); sourceOutputDirectory.setWritable(false);