From cc1543421aafac336be05ac0b75cecc2da4b6818 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 5 Oct 2015 12:55:11 +0100 Subject: Split interpreter values from primitives --- .../org/zwobble/couscous/tests/BackendTests.java | 12 ++++---- .../org/zwobble/couscous/tests/MethodRunner.java | 4 +-- .../tests/backends/python/PythonCompilerTests.java | 12 ++++---- .../couscous/tests/interpreter/EvaluatorTests.java | 25 +++++++++------- .../tests/interpreter/InterpreterTests.java | 35 +++++++++++++--------- 5 files changed, 49 insertions(+), 39 deletions(-) (limited to 'src/test') diff --git a/src/test/java/org/zwobble/couscous/tests/BackendTests.java b/src/test/java/org/zwobble/couscous/tests/BackendTests.java index 216ede0..ce3fc7d 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendTests.java @@ -4,14 +4,14 @@ import org.junit.Test; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.MethodNode; import org.zwobble.couscous.ast.ReturnNode; -import org.zwobble.couscous.interpreter.values.InterpreterValue; -import org.zwobble.couscous.interpreter.values.StringValue; +import org.zwobble.couscous.values.PrimitiveValue; +import org.zwobble.couscous.values.PrimitiveValues; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.MethodNode.staticMethod; -import static org.zwobble.couscous.interpreter.values.UnitValue.UNIT; +import static org.zwobble.couscous.values.PrimitiveValues.value; import lombok.val; @@ -21,7 +21,7 @@ public abstract class BackendTests { val method = staticMethod("hello"); val result = runMethod(method); - assertEquals(UNIT, result); + assertEquals(PrimitiveValues.UNIT, result); } @Test @@ -30,10 +30,10 @@ public abstract class BackendTests { .statement(new ReturnNode(literal("hello, world!"))); val result = runMethod(method); - assertEquals(new StringValue("hello, world!"), result); + assertEquals(value("hello, world!"), result); } - protected InterpreterValue runMethod(MethodNode.MethodNodeBuilder methodBuilder, InterpreterValue... arguments) { + protected PrimitiveValue runMethod(MethodNode.MethodNodeBuilder methodBuilder, PrimitiveValue... arguments) { val method = methodBuilder.build(); val className = "com.example.Program"; val classNode = ClassNode.builder(className) diff --git a/src/test/java/org/zwobble/couscous/tests/MethodRunner.java b/src/test/java/org/zwobble/couscous/tests/MethodRunner.java index 8fc4cf1..ff9439c 100644 --- a/src/test/java/org/zwobble/couscous/tests/MethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/MethodRunner.java @@ -3,8 +3,8 @@ package org.zwobble.couscous.tests; import java.util.List; import org.zwobble.couscous.ast.ClassNode; -import org.zwobble.couscous.interpreter.values.InterpreterValue; +import org.zwobble.couscous.values.PrimitiveValue; public interface MethodRunner { - InterpreterValue runMethod(ClassNode classNode, String methodName, List arguments); + PrimitiveValue runMethod(ClassNode classNode, String methodName, List arguments); } diff --git a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerTests.java b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerTests.java index 76893c8..6f171c3 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerTests.java @@ -8,18 +8,18 @@ import java.util.List; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.backends.python.PythonCompiler; -import org.zwobble.couscous.interpreter.values.InterpreterValue; import org.zwobble.couscous.tests.BackendTests; import org.zwobble.couscous.tests.MethodRunner; +import org.zwobble.couscous.values.PrimitiveValue; +import org.zwobble.couscous.values.PrimitiveValues; import com.google.common.base.Charsets; import com.google.common.io.CharStreams; import static java.lang.Integer.parseInt; import static java.util.Arrays.asList; -import static org.zwobble.couscous.interpreter.values.InterpreterValues.UNIT; -import static org.zwobble.couscous.interpreter.values.InterpreterValues.value; import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively; +import static org.zwobble.couscous.values.PrimitiveValues.value; import lombok.SneakyThrows; import lombok.val; @@ -30,10 +30,10 @@ public class PythonCompilerTests extends BackendTests { return new MethodRunner() { @Override @SneakyThrows - public InterpreterValue runMethod( + public PrimitiveValue runMethod( ClassNode classNode, String methodName, - List arguments) { + List arguments) { val compiler = new PythonCompiler(); val directoryPath = Files.createTempDirectory(null); try { @@ -51,7 +51,7 @@ public class PythonCompilerTests extends BackendTests { if (exitCode != 0) { throw new RuntimeException("stderr was: " + stderrOutput); } else if (output.equals("None")) { - return UNIT; + return PrimitiveValues.UNIT; } else if (output.startsWith("'")) { return value(output.substring(1, output.length() - 1)); } else { diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java index bdd2590..3ed1b6d 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java @@ -14,8 +14,10 @@ import org.zwobble.couscous.interpreter.StackFrameBuilder; import org.zwobble.couscous.interpreter.UnexpectedValueType; import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import org.zwobble.couscous.interpreter.values.ConcreteType; -import org.zwobble.couscous.interpreter.values.IntegerValue; -import org.zwobble.couscous.interpreter.values.StringValue; +import org.zwobble.couscous.interpreter.values.IntegerInterpreterValue; +import org.zwobble.couscous.interpreter.values.StringInterpreterValue; +import org.zwobble.couscous.values.IntegerValue; +import org.zwobble.couscous.values.StringValue; import com.google.common.collect.ImmutableMap; @@ -27,6 +29,7 @@ import static org.zwobble.couscous.ast.MethodCallNode.methodCall; import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.interpreter.Evaluator.eval; +import static org.zwobble.couscous.interpreter.values.InterpreterValues.value; import static org.zwobble.couscous.tests.util.ExtraAsserts.assertThrows; import lombok.val; @@ -37,23 +40,23 @@ public class EvaluatorTests { val arg = formalArg(var(42, "x", StringValue.REF)); val environment = new Environment( new MapBackedProject(ImmutableMap.of()), - new StackFrameBuilder().declare(arg, new StringValue("[initial value]")).build()); + new StackFrameBuilder().declare(arg, value("[initial value]")).build()); val result = eval(environment, assign(arg, literal("[updated value]"))); - assertEquals(new StringValue("[updated value]"), result); + assertEquals(new StringInterpreterValue("[updated value]"), result); } @Test public void whenConditionIsTrueThenValueOfConditionalTernaryIsTrueBranch() { val result = eval(emptyEnvironment(), new TernaryConditionalNode(literal(true), literal("T"), literal("F"))); - assertEquals(new StringValue("T"), result); + assertEquals(new StringInterpreterValue("T"), result); } @Test public void whenConditionIsFalseThenValueOfConditionalTernaryIsFalseBranch() { val result = eval(emptyEnvironment(), new TernaryConditionalNode(literal(false), literal("T"), literal("F"))); - assertEquals(new StringValue("F"), result); + assertEquals(new StringInterpreterValue("F"), result); } @Test @@ -61,21 +64,21 @@ public class EvaluatorTests { val exception = assertThrows(ConditionMustBeBoolean.class, () -> eval(emptyEnvironment(), new TernaryConditionalNode(literal(1), literal("T"), literal("F")))); - assertEquals(new ConditionMustBeBoolean(new IntegerValue(1)), exception); + assertEquals(new ConditionMustBeBoolean(new IntegerInterpreterValue(1)), exception); } @Test public void canCallMethodWithNoArgumentsOnBuiltin() { val result = eval(emptyEnvironment(), methodCall(literal("hello"), "length")); - assertEquals(new IntegerValue(5), result); + assertEquals(new IntegerInterpreterValue(5), result); } @Test public void canCallMethodWithArgumentsOnBuiltin() { val result = eval(emptyEnvironment(), methodCall(literal("hello"), "substring", literal(1), literal(4))); - assertEquals(new StringValue("ell"), result); + assertEquals(new StringInterpreterValue("ell"), result); } @Test @@ -106,7 +109,7 @@ public class EvaluatorTests { public void canCallStaticMethod() { val result = eval(emptyEnvironment(), staticMethodCall("java.lang.Integer", "parseInt", literal("42"))); - assertEquals(new IntegerValue(42), result); + assertEquals(new IntegerInterpreterValue(42), result); } @Test @@ -123,7 +126,7 @@ public class EvaluatorTests { ImmutableMap.of()); val result = eval(environment, staticMethodCall("com.example.Program", "main")); - assertEquals(new IntegerValue(42), result); + assertEquals(new IntegerInterpreterValue(42), result); } private static Environment emptyEnvironment() { diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java index 3f2bbcd..09c3993 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java @@ -1,6 +1,7 @@ package org.zwobble.couscous.tests.interpreter; import java.util.List; +import java.util.stream.Collectors; import org.junit.Test; import org.zwobble.couscous.MapBackedProject; @@ -15,11 +16,12 @@ import org.zwobble.couscous.interpreter.UnexpectedValueType; import org.zwobble.couscous.interpreter.VariableNotInScope; import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import org.zwobble.couscous.interpreter.values.ConcreteType; -import org.zwobble.couscous.interpreter.values.IntegerValue; -import org.zwobble.couscous.interpreter.values.InterpreterValue; -import org.zwobble.couscous.interpreter.values.StringValue; +import org.zwobble.couscous.interpreter.values.InterpreterValues; import org.zwobble.couscous.tests.BackendTests; import org.zwobble.couscous.tests.MethodRunner; +import org.zwobble.couscous.values.IntegerValue; +import org.zwobble.couscous.values.PrimitiveValue; +import org.zwobble.couscous.values.StringValue; import com.google.common.collect.ImmutableMap; @@ -31,6 +33,7 @@ import static org.zwobble.couscous.ast.MethodNode.staticMethod; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; import static org.zwobble.couscous.tests.util.ExtraAsserts.assertThrows; +import static org.zwobble.couscous.values.PrimitiveValues.value; import lombok.val; @@ -41,9 +44,9 @@ public class InterpreterTests extends BackendTests { val method = staticMethod("hello") .argument(arg) .statement(new ReturnNode(reference(arg))); - val result = runMethod(method, new StringValue("hello, world!")); + val result = runMethod(method, value("hello, world!")); - assertEquals(new StringValue("hello, world!"), result); + assertEquals(value("hello, world!"), result); } @Test @@ -51,7 +54,7 @@ public class InterpreterTests extends BackendTests { val method = staticMethod("hello"); val exception = assertThrows(WrongNumberOfArguments.class, - () -> runMethod(method, new StringValue("hello, world!"))); + () -> runMethod(method, value("hello, world!"))); assertEquals(new WrongNumberOfArguments(0, 1), exception); } @@ -63,9 +66,9 @@ public class InterpreterTests extends BackendTests { .argument(arg) .statement(new ExpressionStatementNode(new Assignment(reference(arg), LiteralNode.literal("[updated value]")))) .statement(new ReturnNode(reference(arg))); - val result = runMethod(method, new StringValue("[initial value]")); + val result = runMethod(method, value("[initial value]")); - assertEquals(new StringValue("[updated value]"), result); + assertEquals(value("[updated value]"), result); } @Test @@ -76,7 +79,7 @@ public class InterpreterTests extends BackendTests { .statement(new ExpressionStatementNode(new Assignment(reference(arg), literal(0)))); val exception = assertThrows(UnexpectedValueType.class, - () -> runMethod(method, new StringValue(""))); + () -> runMethod(method, value(""))); assertEquals(new UnexpectedValueType(StringValue.REF, IntegerValue.REF), exception); } @@ -90,7 +93,7 @@ public class InterpreterTests extends BackendTests { .statement(new ReturnNode(reference(localVariableDeclaration))); val result = runMethod(method); - assertEquals(new StringValue("[initial value]"), result); + assertEquals(value("[initial value]"), result); } @Test @@ -103,7 +106,7 @@ public class InterpreterTests extends BackendTests { .statement(new ReturnNode(reference(localVariableDeclaration))); val result = runMethod(method); - assertEquals(new StringValue("[updated value]"), result); + assertEquals(value("[updated value]"), result); } @Test @@ -150,14 +153,18 @@ public class InterpreterTests extends BackendTests { protected MethodRunner buildMethodRunner() { return new MethodRunner() { @Override - public InterpreterValue runMethod( + public PrimitiveValue runMethod( ClassNode classNode, String methodName, - List arguments) { + List arguments) { val interpreter = new Interpreter(new MapBackedProject(ImmutableMap.of( classNode.getName(), ConcreteType.fromNode(classNode)))); + val argumentValues = arguments.stream() + .map(InterpreterValues::value) + .collect(Collectors.toList()); - return interpreter.run(classNode.getName(), methodName, arguments); + return interpreter.run(classNode.getName(), methodName, argumentValues) + .toPrimitiveValue().get(); } }; } -- cgit v1.2.3