aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-05 12:55:11 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-05 12:55:11 +0100
commitcc1543421aafac336be05ac0b75cecc2da4b6818 (patch)
tree584570ddd0af5ec866173354aa442ce215de0fab /src/test/java/org/zwobble
parent2f9374c7f32a761413da4c5484bec88a76c855d2 (diff)
Split interpreter values from primitives
Diffstat (limited to 'src/test/java/org/zwobble')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendTests.java12
-rw-r--r--src/test/java/org/zwobble/couscous/tests/MethodRunner.java4
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/python/PythonCompilerTests.java12
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java25
-rw-r--r--src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java35
5 files changed, 49 insertions, 39 deletions
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<InterpreterValue> arguments);
+ PrimitiveValue runMethod(ClassNode classNode, String methodName, List<PrimitiveValue> 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<InterpreterValue> arguments) {
+ List<PrimitiveValue> 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<InterpreterValue> arguments) {
+ List<PrimitiveValue> 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();
}
};
}