diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-01 15:33:57 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-01 15:33:57 +0000 |
| commit | fd0769bde1ffad49ca74a404f18aae5d7226c558 (patch) | |
| tree | 64f055dd31d309dddfe4d7c11803d4c6dab1e161 | |
| parent | 17384f8b7bb6151be3f033ba7e339d9edb59be55 (diff) | |
Get interpreter compiler tests working
13 files changed, 201 insertions, 82 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNode.java b/src/main/java/org/zwobble/couscous/ast/ClassNode.java index 55453f4..3545084 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNode.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNode.java @@ -3,6 +3,7 @@ package org.zwobble.couscous.ast; import org.zwobble.couscous.ast.visitors.NodeMapper; import java.util.List; +import java.util.Set; public class ClassNode implements Node { public static ClassNodeBuilder builder(String name) { @@ -10,23 +11,27 @@ public class ClassNode implements Node { } public static ClassNode declareClass( TypeName name, + Set<TypeName> superTypes, List<FieldDeclarationNode> fields, ConstructorNode constructor, List<MethodNode> methods) { - return new ClassNode(name, fields, constructor, methods); + return new ClassNode(name, superTypes, fields, constructor, methods); } private final TypeName name; + private final Set<TypeName> superTypes; private final List<FieldDeclarationNode> fields; private final ConstructorNode constructor; private final List<MethodNode> methods; private ClassNode( TypeName name, + Set<TypeName> superTypes, List<FieldDeclarationNode> fields, ConstructorNode constructor, List<MethodNode> methodNodes) { this.name = name; + this.superTypes = superTypes; this.fields = fields; this.constructor = constructor; methods = methodNodes; @@ -35,7 +40,11 @@ public class ClassNode implements Node { public TypeName getName() { return name; } - + + public Set<TypeName> getSuperTypes() { + return superTypes; + } + public List<FieldDeclarationNode> getFields() { return fields; } @@ -59,51 +68,38 @@ public class ClassNode implements Node { @Override public String toString() { - return "ClassNode(name=" + name + ", fields=" + fields - + ", constructor=" + constructor + ", methods=" + methods + ")"; + return "ClassNode(" + + "name=" + name + + ", superTypes=" + superTypes + + ", fields=" + fields + + ", constructor=" + constructor + + ", methods=" + methods + + ')'; } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + ((constructor == null) ? 0 : constructor.hashCode()); - result = prime * result + ((fields == null) ? 0 : fields.hashCode()); - result = prime * result + ((methods == null) ? 0 : methods.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ClassNode classNode = (ClassNode) o; + + if (name != null ? !name.equals(classNode.name) : classNode.name != null) return false; + if (superTypes != null ? !superTypes.equals(classNode.superTypes) : classNode.superTypes != null) return false; + if (fields != null ? !fields.equals(classNode.fields) : classNode.fields != null) return false; + if (constructor != null ? !constructor.equals(classNode.constructor) : classNode.constructor != null) + return false; + return methods != null ? methods.equals(classNode.methods) : classNode.methods == null; + } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ClassNode other = (ClassNode) obj; - if (constructor == null) { - if (other.constructor != null) - return false; - } else if (!constructor.equals(other.constructor)) - return false; - if (fields == null) { - if (other.fields != null) - return false; - } else if (!fields.equals(other.fields)) - return false; - if (methods == null) { - if (other.methods != null) - return false; - } else if (!methods.equals(other.methods)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (superTypes != null ? superTypes.hashCode() : 0); + result = 31 * result + (fields != null ? fields.hashCode() : 0); + result = 31 * result + (constructor != null ? constructor.hashCode() : 0); + result = 31 * result + (methods != null ? methods.hashCode() : 0); + return result; } } diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 5981e34..9be591c 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -1,10 +1,11 @@ package org.zwobble.couscous.ast; +import com.google.common.collect.ImmutableList; + import java.util.Optional; import java.util.function.Function; -import com.google.common.collect.ImmutableList; - +import static java.util.Collections.emptySet; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.VariableDeclaration.var; @@ -81,6 +82,7 @@ public class ClassNodeBuilder { public ClassNode build() { return ClassNode.declareClass( name, + emptySet(), fields.build(), constructor.orElse(ConstructorNode.DEFAULT), methods.build()); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 76dcf22..2963fd6 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -12,6 +12,7 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import static com.google.common.collect.Iterables.concat; @@ -29,6 +30,7 @@ import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.frontends.java.FreeVariables.findFreeVariables; +import static org.zwobble.couscous.frontends.java.JavaTypes.superTypes; import static org.zwobble.couscous.frontends.java.JavaTypes.typeOf; import static org.zwobble.couscous.util.Casts.tryCast; import static org.zwobble.couscous.util.ExtraLists.*; @@ -58,6 +60,7 @@ public class JavaReader { TypeDeclarationBody body = readTypeDeclarationBody(type.bodyDeclarations()); return ClassNode.declareClass( name, + superTypes(type), body.getFields(), body.getConstructor(), body.getMethods()); @@ -75,7 +78,11 @@ public class JavaReader { lambda.getFormalArguments(), lambda.getBody()); - GeneratedClosure closure = classWithCapture(className, emptyList(), ImmutableList.of(method)); + GeneratedClosure closure = classWithCapture( + className, + superTypes(expression), + emptyList(), + ImmutableList.of(method)); classes.add(closure.getClassNode()); return closure; @@ -132,13 +139,18 @@ public class JavaReader { GeneratedClosure readAnonymousClass(AnonymousClassDeclaration declaration) { TypeName className = generateClassName(declaration); TypeDeclarationBody bodyDeclarations = readTypeDeclarationBody(declaration.bodyDeclarations()); - GeneratedClosure closure = classWithCapture(className, bodyDeclarations.getFields(), bodyDeclarations.getMethods()); + GeneratedClosure closure = classWithCapture( + className, + superTypes(declaration), + bodyDeclarations.getFields(), + bodyDeclarations.getMethods()); classes.add(closure.getClassNode()); return closure; } private GeneratedClosure classWithCapture( TypeName className, + Set<TypeName> superTypes, List<FieldDeclarationNode> declaredFields, List<MethodNode> methods ) { @@ -151,6 +163,7 @@ public class JavaReader { ClassNode classNode = ClassNode.declareClass( className, + superTypes, fields, buildConstructor(className, freeVariables), eagerMap(methods, method -> diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java index d6b2160..4b62a17 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaTypes.java @@ -1,10 +1,14 @@ package org.zwobble.couscous.frontends.java; -import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.IVariableBinding; -import org.eclipse.jdt.core.dom.Type; +import com.google.common.collect.ImmutableSet; +import org.eclipse.jdt.core.dom.*; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.values.ObjectValues; + +import java.util.Set; + +import static com.google.common.collect.Iterables.transform; +import static java.util.Arrays.asList; class JavaTypes { static TypeName typeOf(Expression expression) { @@ -22,4 +26,37 @@ class JavaTypes { static TypeName typeOf(ITypeBinding typeBinding) { return TypeName.of(typeBinding.getQualifiedName()); } + + static Set<TypeName> superTypes(TypeDeclaration declaration) { + return superTypes(declaration.resolveBinding()); + } + + static Set<TypeName> superTypes(AnonymousClassDeclaration declaration) { + return superTypes(declaration.resolveBinding()); + } + + static Set<TypeName> superTypes(LambdaExpression expression) { + ImmutableSet.Builder<TypeName> superTypes = ImmutableSet.builder(); + ITypeBinding typeBinding = expression.resolveTypeBinding(); + superTypes.addAll(superTypes(typeBinding)); + superTypes.add(typeOf(typeBinding)); + return superTypes.build(); + } + + private static Set<TypeName> superTypes(ITypeBinding typeBinding) { + ImmutableSet.Builder<TypeName> superTypes = ImmutableSet.builder(); + superTypes.addAll(transform( + asList(typeBinding.getInterfaces()), + JavaTypes::typeOf)); + superTypes.add(superClass(typeBinding)); + return superTypes.build(); + } + + private static TypeName superClass(ITypeBinding typeBinding) { + if (typeBinding.getSuperclass() == null) { + return ObjectValues.OBJECT; + } else { + return typeOf(typeBinding.getSuperclass()); + } + } } diff --git a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java index bb76280..1e644c8 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java +++ b/src/main/java/org/zwobble/couscous/interpreter/InterpreterTypes.java @@ -1,17 +1,25 @@ package org.zwobble.couscous.interpreter; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.interpreter.values.ConcreteType; import org.zwobble.couscous.interpreter.values.InterpreterValue; import org.zwobble.couscous.values.ObjectValues; public class InterpreterTypes { public static void checkIsInstance(TypeName type, InterpreterValue value) { - checkIsSubType(type, value.getType().getName()); + checkIsSubType(type, value.getType()); } - private static void checkIsSubType(TypeName superType, TypeName subType) { - if (!superType.equals(subType) && !superType.equals(ObjectValues.OBJECT)) { - throw new UnexpectedValueType(superType, subType); + private static void checkIsSubType(TypeName superTypeName, ConcreteType subType) { + if (!isSubType(superTypeName, subType)) { + throw new UnexpectedValueType(superTypeName, subType.getName()); } } + + private static boolean isSubType(TypeName superTypeName, ConcreteType subType) { + return + superTypeName.equals(subType.getName()) || + superTypeName.equals(ObjectValues.OBJECT) || + subType.getSuperTypes().contains(superTypeName); + } } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java index 458eca7..3ffa244 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java @@ -1,16 +1,32 @@ package org.zwobble.couscous.interpreter.values; +import org.zwobble.couscous.ast.Operator; +import org.zwobble.couscous.values.IntegerValue; +import org.zwobble.couscous.values.ObjectValues; import org.zwobble.couscous.values.StringValue; import static java.util.Arrays.asList; public class BoxedIntegerInterpreterValue { public static final ConcreteType TYPE = ConcreteType.classBuilder("java.lang.Integer") + .field("value", IntegerValue.REF) + .staticMethod("parseInt", asList(StringValue.REF), (environment, arguments) -> { StringInterpreterValue value = (StringInterpreterValue)arguments.get(0); return new IntegerInterpreterValue(Integer.parseInt(value.getValue())); }) - + + .method(Operator.EQUALS.getMethodName(), asList(ObjectValues.OBJECT), + (environment, arguments) -> { + InterpreterValue right = arguments.getPositionalArguments().get(0); + if (right.getType().getName().equals(ObjectValues.BOXED_INT)) { + IntegerInterpreterValue leftValue = (IntegerInterpreterValue)arguments.getReceiver().getField("value"); + IntegerInterpreterValue rightValue = (IntegerInterpreterValue)right.getField("value"); + return new BooleanInterpreterValue(leftValue.getValue() == rightValue.getValue()); + } else { + return new BooleanInterpreterValue(false); + } + }) .build(); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java index 8d2c2d5..c053739 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java @@ -1,8 +1,6 @@ package org.zwobble.couscous.interpreter.values; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.function.BiFunction; import java.util.stream.Collectors; import org.zwobble.couscous.ast.ClassNode; @@ -34,6 +32,7 @@ public class ConcreteType { } public static class Builder<T> { + private final ImmutableMap.Builder<String, FieldValue> fields = ImmutableMap.builder(); private final ImmutableMap.Builder<String, MethodValue> methods = ImmutableMap.builder(); private final ImmutableMap.Builder<String, StaticMethodValue> staticMethods = ImmutableMap.builder(); private final Class<T> interpreterValueType; @@ -43,7 +42,12 @@ public class ConcreteType { this.interpreterValueType = interpreterValueType; this.name = name; } - + + public Builder<T> field(String name, TypeName type) { + fields.put(name, new FieldValue(name, type)); + return this; + } + public Builder<T> method(String name, List<TypeName> argumentsTypes, BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method) { methods.put(name, new MethodValue(argumentsTypes, (environment, arguments) -> { return Casts.tryCast(interpreterValueType, arguments.getReceiver()).map(typedReceiver -> method.apply(environment, MethodCallArguments.of(typedReceiver, arguments.getPositionalArguments()))).orElseThrow(() -> new RuntimeException("receiver is of wrong type")); @@ -57,7 +61,13 @@ public class ConcreteType { } public ConcreteType build() { - return new ConcreteType(name, ImmutableMap.of(), new MethodValue(ImmutableList.of(), (environment, arguments) -> InterpreterValues.UNIT), methods.build(), staticMethods.build()); + return new ConcreteType( + name, + Collections.emptySet(), + fields.build(), + new MethodValue(ImmutableList.of(), (environment, arguments) -> InterpreterValues.UNIT), + methods.build(), + staticMethods.build()); } } @@ -76,20 +86,28 @@ public class ConcreteType { return Executor.callMethod(environment, method, Optional.empty(), arguments); }); })); - return new ConcreteType(classNode.getName(), fields, constructor, methods, staticMethods); + return new ConcreteType(classNode.getName(), classNode.getSuperTypes(), fields, constructor, methods, staticMethods); } private static List<TypeName> getArgumentTypes(List<FormalArgumentNode> arguments) { return arguments.stream().map(arg -> arg.getType()).collect(Collectors.toList()); } private final TypeName name; + private final Set<TypeName> superTypes; private final Map<String, FieldValue> fields; private final MethodValue constructor; private final Map<String, MethodValue> methods; private final Map<String, StaticMethodValue> staticMethods; - private ConcreteType(TypeName name, Map<String, FieldValue> fields, MethodValue constructor, Map<String, MethodValue> methods, Map<String, StaticMethodValue> staticMethods) { + private ConcreteType( + TypeName name, + Set<TypeName> superTypes, + Map<String, FieldValue> fields, + MethodValue constructor, + Map<String, MethodValue> methods, + Map<String, StaticMethodValue> staticMethods) { this.name = name; + this.superTypes = superTypes; this.fields = fields; this.constructor = constructor; this.methods = methods; @@ -99,7 +117,11 @@ public class ConcreteType { public TypeName getName() { return name; } - + + public Set<TypeName> getSuperTypes() { + return superTypes; + } + public Optional<FieldValue> getField(String fieldName) { return Optional.ofNullable(fields.get(fieldName)); } diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java index da28bc5..3bcb41a 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java @@ -97,6 +97,12 @@ public final class IntegerInterpreterValue implements InterpreterValue { public int getValue() { return this.value; } + + public InterpreterValue box() { + ObjectInterpreterValue box = new ObjectInterpreterValue(BoxedIntegerInterpreterValue.TYPE); + box.setField("value", this); + return box; + } @java.lang.Override public boolean equals(final java.lang.Object o) { diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java index ef4c37b..4d3f33a 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/InternalCouscousInterpreterValue.java @@ -19,10 +19,10 @@ public class InternalCouscousInterpreterValue { ((environment, arguments) -> arguments.get(0))) .staticMethod("boxInt", asList(IntegerValue.REF), - ((environment, arguments) -> arguments.get(0))) + ((environment, arguments) -> ((IntegerInterpreterValue)arguments.get(0)).box())) - .staticMethod("unboxInt", asList(IntegerValue.REF), - ((environment, arguments) -> arguments.get(0))) + .staticMethod("unboxInt", asList(ObjectValues.BOXED_INT), + ((environment, arguments) -> arguments.get(0).getField("value"))) .build(); } diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java index 5e6191f..1d2c0a4 100644 --- a/src/main/java/org/zwobble/couscous/values/BooleanValue.java +++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java @@ -1,6 +1,7 @@ package org.zwobble.couscous.values; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.interpreter.values.InterpreterValue; public final class BooleanValue implements PrimitiveValue { public static final TypeName REF = TypeName.of("boolean"); diff --git a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java index 6f64ed6..b5e0d82 100644 --- a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java +++ b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java @@ -20,28 +20,28 @@ import static org.zwobble.couscous.values.PrimitiveValues.value; public abstract class CompilerTests { @Test public void canEvaluateLiterals() { - assertEquals(value("hello"), evalExpression("\"hello\"")); - assertEquals(value(42), evalExpression("42")); + assertEquals(value("hello"), evalObjectExpression("\"hello\"")); + assertEquals(value(42), evalIntExpression("42")); } @Test public void canUseOperatorsOnPrimitives() { - assertEquals(value(3), evalExpression("1 + 2")); - assertEquals(value(false), evalExpression("1 > 2")); - assertEquals(value(true), evalExpression("1 == 1")); - assertEquals(value(false), evalExpression("1 != 1")); - assertEquals(value(true), evalExpression("!false")); + assertEquals(value(3), evalIntExpression("1 + 2")); + assertEquals(value(false), evalBooleanExpression("1 > 2")); + assertEquals(value(true), evalBooleanExpression("1 == 1")); + assertEquals(value(false), evalBooleanExpression("1 != 1")); + assertEquals(value(true), evalBooleanExpression("!false")); } @Test public void equalityOnReferenceTypesChecksForIdentity() { - assertEquals(value(false), evalExpression("new Object() == new Object()")); - assertEquals(value(true), exec("Object x = new Object(); return x == x;")); + assertEquals(value(false), evalBooleanExpression("new Object() == new Object()")); + assertEquals(value(true), exec("boolean", "Object x = new Object(); return x == x;")); } @Test public void integersCanBeAssignedToObjectVariable() { - assertEquals(value(false), exec("Object x = 1; return x.equals(new Object());")); + assertEquals(value(false), exec("boolean", "Object x = 1; return x.equals(new Object());")); } @Test @@ -150,12 +150,12 @@ public abstract class CompilerTests { return path; } - private PrimitiveValue exec(String source) { + private PrimitiveValue exec(String returnType, String source) { try { String javaClass = "package com.example;" + "public class Example {" + - " public static Object main() {" + source + "}" + + " public static " + returnType + " main() {" + source + "}" + "}"; Path directoryPath = Files.createTempDirectory(null); try { @@ -174,8 +174,20 @@ public abstract class CompilerTests { } } - private PrimitiveValue evalExpression(String expressionSource) { - return exec("return " + expressionSource + ";"); + private PrimitiveValue evalBooleanExpression(String expressionSource) { + return evalExpression("boolean", expressionSource); + } + + private PrimitiveValue evalIntExpression(String expressionSource) { + return evalExpression("int", expressionSource); + } + + private PrimitiveValue evalObjectExpression(String expressionSource) { + return evalExpression("Object", expressionSource); + } + + private PrimitiveValue evalExpression(String type, String expressionSource) { + return exec(type, "return " + expressionSource + ";"); } private static Path pathForResource(String name) { diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java index 203a088..49b1fbf 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java @@ -1,7 +1,6 @@ package org.zwobble.couscous.tests; import com.google.common.collect.ImmutableList; -import org.junit.Ignore; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.frontends.java.JavaFrontend; @@ -18,7 +17,6 @@ import java.util.List; import static com.google.common.collect.Iterables.transform; -@Ignore public class JavaToInterpreterTests extends CompilerTests { @Override protected PrimitiveValue execProgram( diff --git a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java index 0768ee7..022e7ed 100644 --- a/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java +++ b/src/test/java/org/zwobble/couscous/tests/ValueObjectTests.java @@ -3,7 +3,9 @@ package org.zwobble.couscous.tests; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.function.Function; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -127,6 +129,8 @@ public class ValueObjectTests { return true; } else if (type.equals(List.class)) { return asList("[list 1]"); + } else if (type.equals(Set.class)) { + return Collections.singleton("[set 1]"); } else if (type.equals(PrimitiveValue.class)) { return generateFirstInstance(StringValue.class); } else if (type.equals(ExpressionNode.class)) { @@ -145,6 +149,8 @@ public class ValueObjectTests { return false; } else if (type.equals(List.class)) { return asList("[list 2]"); + } else if (type.equals(Set.class)) { + return Collections.singleton("[set 2]"); } else if (type.equals(PrimitiveValue.class)) { return generateSecondInstance(StringValue.class); } else if (type.equals(ExpressionNode.class)) { @@ -163,6 +169,8 @@ public class ValueObjectTests { return true; } else if (type.equals(List.class)) { return asList("[list]"); + } else if (type.equals(Set.class)) { + return Collections.singleton("[set]"); } else if (type.equals(PrimitiveValue.class)) { return generateInstance(StringValue.class); } else if (type.equals(ExpressionNode.class)) { |
