Skip to content

Commit b7e9125

Browse files
authored
Parameterize tests of Generated classes and fields (#139)
* Refactor class deprecation to GeneratedClass-enum * Refactor more attributes to GenerateClass-enum * Refactor testing of generated Enum-classes * Minor refactoring * Minor refactoring * Refactor into `GeneratedEnum.java` * Encapsulate test properties to `GeneratedSource.java` * Set expected generated fields in runtime * Add boolean 'isEnum' to `GeneratedClass` * Parameterize generated fields * Assert generated fields dynamically * Migrate field-"nullability" from class to field level * Minor refactor * Type-Parameterize `GeneratedField` and remove uses of rawtypes * Minor refactoring * Set expected defaultValue in `GeneratedField` * Add testing of `default`-values for fields * Minor refactoring * Assert record-fields are set to constructor-arguments * Add testing values for all field types * Refactor `TestSuite`-class * Fix unsafe type-casting and remove redundant use of Optionals * Fix unsafe cast in Enum-tests
1 parent d840374 commit b7e9125

File tree

8 files changed

+352
-223
lines changed

8 files changed

+352
-223
lines changed
Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
11
package com.chrimle.example;
22

33
public enum GeneratedClass {
4-
DEPRECATED_EXAMPLE_ENUM("DeprecatedExampleEnum"),
5-
DEPRECATED_EXAMPLE_RECORD("DeprecatedExampleRecord"),
6-
EXAMPLE_ENUM("ExampleEnum"),
7-
EXAMPLE_RECORD("ExampleRecord"),
8-
EXAMPLE_RECORD_WITH_DEFAULT_FIELDS("ExampleRecordWithDefaultFields"),
9-
EXAMPLE_RECORD_WITH_REQUIRED_FIELDS_OF_EACH_TYPE("ExampleRecordWithRequiredFieldsOfEachType"),
10-
EXAMPLE_RECORD_WITH_NULLABLE_FIELDS_OF_EACH_TYPE("ExampleRecordWithNullableFieldsOfEachType");
4+
DEPRECATED_EXAMPLE_ENUM("DeprecatedExampleEnum", true, true),
5+
DEPRECATED_EXAMPLE_RECORD("DeprecatedExampleRecord", true, false),
6+
EXAMPLE_ENUM("ExampleEnum", false, true),
7+
EXAMPLE_RECORD("ExampleRecord", false, false),
8+
EXAMPLE_RECORD_WITH_DEFAULT_FIELDS("ExampleRecordWithDefaultFields", false, false),
9+
EXAMPLE_RECORD_WITH_REQUIRED_FIELDS_OF_EACH_TYPE(
10+
"ExampleRecordWithRequiredFieldsOfEachType", false, false),
11+
EXAMPLE_RECORD_WITH_NULLABLE_FIELDS_OF_EACH_TYPE(
12+
"ExampleRecordWithNullableFieldsOfEachType", false, false);
1113

1214
public static final String PACKAGE_NAME = "io.github.chrimle.example";
13-
private final String simpleClassName;
15+
public final String simpleClassName;
16+
public final boolean isDeprecated;
17+
public final boolean isEnum;
1418

15-
GeneratedClass(final String simpleClassName) {
19+
GeneratedClass(final String simpleClassName, final boolean isDeprecated, final boolean isEnum) {
1620
this.simpleClassName = simpleClassName;
21+
this.isDeprecated = isDeprecated;
22+
this.isEnum = isEnum;
1723
}
1824

19-
public String getCanonicalClassName(final String moduleName) {
20-
return String.format("%s.%s.%s", PACKAGE_NAME, moduleName, simpleClassName);
25+
public String getCanonicalClassName(final PluginExecution pluginExecution) {
26+
return getCanonicalClassName(pluginExecution.packageName, this);
27+
}
28+
29+
public static String getCanonicalClassName(
30+
final String moduleName, final GeneratedClass generatedClass) {
31+
return String.join(".", PACKAGE_NAME, moduleName, generatedClass.simpleClassName);
2132
}
2233
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.chrimle.example;
2+
3+
import java.util.Optional;
4+
5+
public record GeneratedField<T>(
6+
String name, Class<T> type, boolean isNullable, Optional<T> defaultValue) {
7+
8+
public GeneratedField(String name, Class<T> type, boolean isNullable, T defaultValue) {
9+
this(name, type, isNullable, Optional.ofNullable(defaultValue));
10+
}
11+
12+
public GeneratedField(String name, Class<T> type, boolean isNullable) {
13+
this(name, type, isNullable, Optional.empty());
14+
}
15+
16+
public GeneratedField(String name, Class<T> type) {
17+
this(name, type, false);
18+
}
19+
20+
public static <T> GeneratedField<T> of(String name, Class<T> type) {
21+
return new GeneratedField<>(name, type);
22+
}
23+
24+
public static <T> GeneratedField<T> of(String name, Class<T> type, boolean isNullable) {
25+
return new GeneratedField<>(name, type, isNullable);
26+
}
27+
28+
public static <T> GeneratedField<T> of(
29+
String name, Class<T> type, boolean isNullable, T defaultValue) {
30+
return new GeneratedField<>(name, type, isNullable, defaultValue);
31+
}
32+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.chrimle.example;
2+
3+
import com.chrimle.example.utils.AssertionUtils;
4+
import java.util.Arrays;
5+
6+
public class GeneratedSource {
7+
8+
private final Class<?> classUnderTest;
9+
private final GeneratedField<?>[] generatedFields;
10+
private final PluginExecution pluginExecution;
11+
private final GeneratedClass generatedClass;
12+
13+
public GeneratedSource(
14+
final PluginExecution pluginExecution,
15+
final GeneratedClass generatedClass,
16+
final GeneratedField<?>... generatedFields) {
17+
this.pluginExecution = pluginExecution;
18+
this.generatedClass = generatedClass;
19+
this.generatedFields = generatedFields;
20+
classUnderTest =
21+
AssertionUtils.assertClassExists(generatedClass.getCanonicalClassName(pluginExecution));
22+
}
23+
24+
public boolean generateBuilders() {
25+
return pluginExecution.generateBuilders;
26+
}
27+
28+
public boolean hasAdditionalEnumTypeAnnotations() {
29+
return pluginExecution.hasAdditionalEnumTypeAnnotations;
30+
}
31+
32+
public boolean hasAdditionalModelTypeAnnotations() {
33+
return pluginExecution.hasAdditionalModelTypeAnnotations;
34+
}
35+
36+
public boolean serializableModel() {
37+
return pluginExecution.serializableModel;
38+
}
39+
40+
public boolean useEnumCaseInsensitive() {
41+
return pluginExecution.useEnumCaseInsensitive;
42+
}
43+
44+
public boolean useJakartaEe() {
45+
return pluginExecution.useJakartaEe;
46+
}
47+
48+
public boolean isDeprecated() {
49+
return generatedClass.isDeprecated;
50+
}
51+
52+
public boolean isEnum() {
53+
return generatedClass.isEnum;
54+
}
55+
56+
public Class<?>[] fieldClasses() {
57+
return Arrays.stream(generatedFields).map(GeneratedField::type).toArray(Class<?>[]::new);
58+
}
59+
60+
public GeneratedField<?>[] generatedFields() {
61+
return generatedFields;
62+
}
63+
64+
public Class<?> getClassUnderTest() {
65+
return classUnderTest;
66+
}
67+
}

src/test/java/com/chrimle/example/PluginExecution.java

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ public enum PluginExecution {
1111
USE_ENUM_CASE_INSENSITIVE("useEnumCaseInsensitive", false, false, false, false, true, false),
1212
USE_JAKARTA_EE("useJakartaEe", false, false, false, false, false, true);
1313

14-
private final String packageName;
15-
private final boolean generateBuilders;
16-
private final boolean hasAdditionalEnumTypeAnnotations;
17-
private final boolean hasAdditionalModelTypeAnnotations;
18-
private final boolean serializableModel;
19-
private final boolean useEnumCaseInsensitive;
20-
private final boolean useJakartaEe;
14+
public final String packageName;
15+
public final boolean generateBuilders;
16+
public final boolean hasAdditionalEnumTypeAnnotations;
17+
public final boolean hasAdditionalModelTypeAnnotations;
18+
public final boolean serializableModel;
19+
public final boolean useEnumCaseInsensitive;
20+
public final boolean useJakartaEe;
2121

2222
PluginExecution(
2323
final String packageName,
@@ -26,7 +26,7 @@ public enum PluginExecution {
2626
final boolean hasAdditionalModelTypeAnnotations,
2727
final boolean serializableModel,
2828
final boolean useEnumCaseInsensitive,
29-
boolean useJakartaEe) {
29+
final boolean useJakartaEe) {
3030
this.packageName = packageName;
3131
this.hasAdditionalEnumTypeAnnotations = hasAdditionalEnumTypeAnnotations;
3232
this.hasAdditionalModelTypeAnnotations = hasAdditionalModelTypeAnnotations;
@@ -35,32 +35,4 @@ public enum PluginExecution {
3535
this.useEnumCaseInsensitive = useEnumCaseInsensitive;
3636
this.useJakartaEe = useJakartaEe;
3737
}
38-
39-
public String getPackageName() {
40-
return packageName;
41-
}
42-
43-
public boolean generateBuilders() {
44-
return generateBuilders;
45-
}
46-
47-
public boolean hasAdditionalEnumTypeAnnotations() {
48-
return hasAdditionalEnumTypeAnnotations;
49-
}
50-
51-
public boolean hasAdditionalModelTypeAnnotations() {
52-
return hasAdditionalModelTypeAnnotations;
53-
}
54-
55-
public boolean serializableModel() {
56-
return serializableModel;
57-
}
58-
59-
public boolean useEnumCaseInsensitive() {
60-
return useEnumCaseInsensitive;
61-
}
62-
63-
public boolean useJakartaEe() {
64-
return useJakartaEe;
65-
}
6638
}

src/test/java/com/chrimle/example/TestSuite.java

Lines changed: 52 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import com.chrimle.example.utils.AssertionUtils;
44
import com.chrimle.example.utils.GeneratedEnumTestUtils;
55
import com.chrimle.example.utils.GeneratedRecordTestUtils;
6+
import java.math.BigDecimal;
7+
import java.util.List;
8+
import java.util.Set;
69
import org.junit.jupiter.api.DisplayName;
710
import org.junit.jupiter.params.ParameterizedTest;
811
import org.junit.jupiter.params.provider.EnumSource;
@@ -14,44 +17,63 @@ public class TestSuite {
1417
@DisplayName("Testing Plugin Executions...")
1518
public void testAll(final PluginExecution pluginExecution) {
1619
for (final GeneratedClass generatedClass : GeneratedClass.values()) {
17-
assertModel(generatedClass, pluginExecution);
20+
21+
final GeneratedSource generatedSource =
22+
getGeneratedSourceForGeneratedClass(generatedClass, pluginExecution);
23+
24+
if (generatedSource.isEnum()) {
25+
GeneratedEnumTestUtils.assertEnumClass(generatedSource);
26+
} else {
27+
GeneratedRecordTestUtils.assertRecord(generatedSource);
28+
}
1829
}
1930
}
2031

21-
private void assertModel(
32+
private static GeneratedSource getGeneratedSourceForGeneratedClass(
2233
final GeneratedClass generatedClass, final PluginExecution pluginExecution) {
23-
24-
final Class<?> classUnderTest =
25-
AssertionUtils.assertClassExists(getCanonicalClassName(pluginExecution, generatedClass));
26-
27-
switch (generatedClass) {
28-
case EXAMPLE_ENUM ->
29-
GeneratedEnumTestUtils.assertExampleEnum(pluginExecution, classUnderTest);
30-
case EXAMPLE_RECORD ->
31-
GeneratedRecordTestUtils.assertExampleRecord(pluginExecution, classUnderTest);
32-
case DEPRECATED_EXAMPLE_ENUM ->
33-
GeneratedEnumTestUtils.assertDeprecatedExampleEnum(pluginExecution, classUnderTest);
34-
case DEPRECATED_EXAMPLE_RECORD ->
35-
GeneratedRecordTestUtils.assertDeprecatedExampleRecord(pluginExecution, classUnderTest);
34+
return switch (generatedClass) {
35+
case DEPRECATED_EXAMPLE_ENUM, EXAMPLE_ENUM ->
36+
new GeneratedSource(pluginExecution, generatedClass);
37+
case DEPRECATED_EXAMPLE_RECORD, EXAMPLE_RECORD ->
38+
new GeneratedSource(
39+
pluginExecution, generatedClass, GeneratedField.of("field1", Boolean.class));
3640
case EXAMPLE_RECORD_WITH_DEFAULT_FIELDS ->
37-
GeneratedRecordTestUtils.assertExampleRecordWithDefaultFields(
38-
pluginExecution, classUnderTest);
39-
case EXAMPLE_RECORD_WITH_REQUIRED_FIELDS_OF_EACH_TYPE ->
40-
GeneratedRecordTestUtils.assertExampleRecordWithRequiredFieldsOfEachType(
41+
new GeneratedSource(
4142
pluginExecution,
42-
classUnderTest,
43-
AssertionUtils.assertClassExists(
44-
getCanonicalClassName(pluginExecution, GeneratedClass.EXAMPLE_RECORD)),
45-
AssertionUtils.assertClassExists(
46-
getCanonicalClassName(pluginExecution, GeneratedClass.EXAMPLE_ENUM)));
43+
generatedClass,
44+
GeneratedField.of("field1", String.class, false, "someDefaultValue"));
4745
case EXAMPLE_RECORD_WITH_NULLABLE_FIELDS_OF_EACH_TYPE ->
48-
GeneratedRecordTestUtils.assertExampleRecordWithNullableFieldsOfEachType(
49-
pluginExecution, classUnderTest);
50-
}
46+
new GeneratedSource(
47+
pluginExecution,
48+
generatedClass,
49+
GeneratedField.of("field1", Boolean.class, true),
50+
GeneratedField.of("field2", String.class, true),
51+
GeneratedField.of("field3", Integer.class, true),
52+
GeneratedField.of("field4", BigDecimal.class, true),
53+
GeneratedField.of("field5", List.class, true),
54+
GeneratedField.of("field6", Set.class, true));
55+
case EXAMPLE_RECORD_WITH_REQUIRED_FIELDS_OF_EACH_TYPE ->
56+
new GeneratedSource(
57+
pluginExecution,
58+
generatedClass,
59+
GeneratedField.of("field1", Boolean.class),
60+
GeneratedField.of("field2", String.class),
61+
GeneratedField.of("field3", Integer.class),
62+
GeneratedField.of("field4", BigDecimal.class),
63+
GeneratedField.of("field5", List.class),
64+
GeneratedField.of("field6", Set.class),
65+
GeneratedField.of("field7", getExampleRecordClass(pluginExecution)),
66+
GeneratedField.of("field8", getExampleEnumClass(pluginExecution)));
67+
};
68+
}
69+
70+
private static Class<?> getExampleEnumClass(PluginExecution pluginExecution) {
71+
return AssertionUtils.assertClassExists(
72+
GeneratedClass.EXAMPLE_ENUM.getCanonicalClassName(pluginExecution));
5173
}
5274

53-
private String getCanonicalClassName(
54-
final PluginExecution pluginExecution, final GeneratedClass generatedClass) {
55-
return generatedClass.getCanonicalClassName(pluginExecution.getPackageName());
75+
private static Class<?> getExampleRecordClass(PluginExecution pluginExecution) {
76+
return AssertionUtils.assertClassExists(
77+
GeneratedClass.EXAMPLE_RECORD.getCanonicalClassName(pluginExecution));
5678
}
5779
}

0 commit comments

Comments
 (0)