From a435bc428f92f0e5c762a0a578e230cd7756ad37 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 25 Oct 2015 11:21:05 +0000 Subject: Parameterise annotation node into value object test --- .../couscous/tests/AnnotationNodeTests.java | 118 ------------------- .../zwobble/couscous/tests/ValueObjectTests.java | 127 +++++++++++++++++++++ 2 files changed, 127 insertions(+), 118 deletions(-) delete mode 100644 src/test/java/org/zwobble/couscous/tests/AnnotationNodeTests.java create mode 100644 src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java (limited to 'src/test/java/org') diff --git a/src/test/java/org/zwobble/couscous/tests/AnnotationNodeTests.java b/src/test/java/org/zwobble/couscous/tests/AnnotationNodeTests.java deleted file mode 100644 index 2c17ccb..0000000 --- a/src/test/java/org/zwobble/couscous/tests/AnnotationNodeTests.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.zwobble.couscous.tests; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.function.Function; -import java.util.stream.IntStream; - -import org.junit.Test; -import org.zwobble.couscous.ast.AnnotationNode; -import org.zwobble.couscous.util.ExtraArrays; - -import com.google.common.base.Joiner; - -import static java.util.Arrays.asList; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.zwobble.couscous.util.ExtraArrays.stream; - -public class AnnotationNodeTests { - @Test - public void annotationNodeIsValueObject() throws Exception { - assertIsValueObject(AnnotationNode.class); - } - - private void assertIsValueObject(Class clazz) throws Exception { - assertToStringIncludesAllFields(clazz); - assertEqualityIncludesAllFields(clazz); - assertHashCodeIncludesAllFields(clazz); - } - - private void assertToStringIncludesAllFields(Class clazz) { - GeneratedValue value = generateValue(clazz, this::generateInstance); - Field[] fields = clazz.getDeclaredFields(); - Object[] fieldStrings = IntStream.range(0, fields.length) - .mapToObj(index -> String.format("%s=%s", fields[index].getName(), value.arguments[index])) - .toArray(); - assertEquals( - String.format("%s(%s)", - clazz.getSimpleName(), - Joiner.on(", ").join(fieldStrings)), - value.instance.toString()); - } - - private void assertEqualityIncludesAllFields(Class clazz) { - assertEquals(generateInstance(clazz), generateInstance(clazz)); - assertNotEquals( - generateFirstInstance(clazz), - generateSecondInstance(clazz)); - } - - private void assertHashCodeIncludesAllFields(Class clazz) { - assertEquals(generateInstance(clazz).hashCode(), generateInstance(clazz).hashCode()); - assertNotEquals( - generateFirstInstance(clazz).hashCode(), - generateSecondInstance(clazz).hashCode()); - } - - private Object generateFirstInstance(Class type) { - if (type.equals(String.class)) { - return "[string 1]"; - } else { - return generateValue(type, this::generateFirstInstance).instance; - } - } - - private Object generateSecondInstance(Class type) { - if (type.equals(String.class)) { - return "[string ]"; - } else { - return generateValue(type, this::generateSecondInstance).instance; - } - } - - private Object generateInstance(Class type) { - if (type.equals(String.class)) { - return "[string]"; - } else { - return generateValue(type, this::generateInstance).instance; - } - } - - private GeneratedValue generateValue(Class type, Function, Object> generate) { - try { - Field[] fields = type.getDeclaredFields(); - Class[] fieldTypes = ExtraArrays.map(fields, field -> field.getType()) - .toArray(Class[]::new); - Method constructor = findStaticConstructor(type, fieldTypes); - Object[] arguments = ExtraArrays.map(fieldTypes, fieldType -> generate.apply(fieldType)) - .toArray(Object[]::new); - Object instance = constructor.invoke(null, arguments); - return new GeneratedValue(instance, arguments); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private Method findStaticConstructor(Class type, Class[] fieldTypes) { - return stream(type.getDeclaredMethods()) - .filter(method -> isStaticConstructor(type, fieldTypes, method)) - .findAny() - .orElseThrow(() -> new RuntimeException("Could not find static constructor for " + type)); - } - - private boolean isStaticConstructor(Class type, Class[] fieldTypes, Method method) { - return method.getReturnType().equals(type) && - asList(fieldTypes).equals(asList(method.getParameterTypes())); - } - - private class GeneratedValue { - private final Object instance; - private final Object[] arguments; - - public GeneratedValue(Object value, Object[] arguments) { - this.instance = value; - this.arguments = arguments; - } - } -} diff --git a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java new file mode 100644 index 0000000..f31ec65 --- /dev/null +++ b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java @@ -0,0 +1,127 @@ +package org.zwobble.couscous.tests; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.function.Function; +import java.util.stream.IntStream; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.zwobble.couscous.ast.AnnotationNode; +import org.zwobble.couscous.util.ExtraArrays; + +import com.google.common.base.Joiner; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.zwobble.couscous.util.ExtraArrays.stream; + +@RunWith(Parameterized.class) +public class ValueObjectTests { + private final Class clazz; + + public ValueObjectTests(Class clazz) { + this.clazz = clazz; + } + + @Parameters(name="{0} is value object") + public static Iterable valueObjectTypes() { + return asList(new Object[][] { + {AnnotationNode.class} + }); + } + + @Test + public void toStringIncludesAllFields() { + GeneratedValue value = generateValue(clazz, ValueObjectTests::generateInstance); + Field[] fields = clazz.getDeclaredFields(); + Object[] fieldStrings = IntStream.range(0, fields.length) + .mapToObj(index -> String.format("%s=%s", fields[index].getName(), value.arguments[index])) + .toArray(); + assertEquals( + String.format("%s(%s)", + clazz.getSimpleName(), + Joiner.on(", ").join(fieldStrings)), + value.instance.toString()); + } + + @Test + public void equalityIncludesAllFields() { + assertEquals(generateInstance(clazz), generateInstance(clazz)); + assertNotEquals( + generateFirstInstance(clazz), + generateSecondInstance(clazz)); + } + + @Test + public void hashCodeIncludesAllFields() { + assertEquals(generateInstance(clazz).hashCode(), generateInstance(clazz).hashCode()); + assertNotEquals( + generateFirstInstance(clazz).hashCode(), + generateSecondInstance(clazz).hashCode()); + } + + private static Object generateFirstInstance(Class type) { + if (type.equals(String.class)) { + return "[string 1]"; + } else { + return generateValue(type, ValueObjectTests::generateFirstInstance).instance; + } + } + + private static Object generateSecondInstance(Class type) { + if (type.equals(String.class)) { + return "[string ]"; + } else { + return generateValue(type, ValueObjectTests::generateSecondInstance).instance; + } + } + + private static Object generateInstance(Class type) { + if (type.equals(String.class)) { + return "[string]"; + } else { + return generateValue(type, ValueObjectTests::generateInstance).instance; + } + } + + private static GeneratedValue generateValue(Class type, Function, Object> generate) { + try { + Field[] fields = type.getDeclaredFields(); + Class[] fieldTypes = ExtraArrays.map(fields, field -> field.getType()) + .toArray(Class[]::new); + Method constructor = findStaticConstructor(type, fieldTypes); + Object[] arguments = ExtraArrays.map(fieldTypes, fieldType -> generate.apply(fieldType)) + .toArray(Object[]::new); + Object instance = constructor.invoke(null, arguments); + return new GeneratedValue(instance, arguments); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static Method findStaticConstructor(Class type, Class[] fieldTypes) { + return stream(type.getDeclaredMethods()) + .filter(method -> isStaticConstructor(type, fieldTypes, method)) + .findAny() + .orElseThrow(() -> new RuntimeException("Could not find static constructor for " + type)); + } + + private static boolean isStaticConstructor(Class type, Class[] fieldTypes, Method method) { + return method.getReturnType().equals(type) && + asList(fieldTypes).equals(asList(method.getParameterTypes())); + } + + private static class GeneratedValue { + private final Object instance; + private final Object[] arguments; + + public GeneratedValue(Object value, Object[] arguments) { + this.instance = value; + this.arguments = arguments; + } + } +} -- cgit v1.2.3