diff options
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java | 3 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java | 17 |
2 files changed, 18 insertions, 2 deletions
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 7656e89..ff74d1b 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java @@ -11,6 +11,7 @@ import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.interpreter.ConditionMustBeBoolean; import org.zwobble.couscous.interpreter.Environment; import org.zwobble.couscous.interpreter.NoSuchMethod; +import org.zwobble.couscous.interpreter.StackFrameBuilder; import org.zwobble.couscous.interpreter.UnexpectedValueType; import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import org.zwobble.couscous.values.ConcreteType; @@ -35,7 +36,7 @@ public class EvaluatorTests { val arg = new FormalArgumentNode(42, StringValue.REF, "x"); val environment = new Environment( new MapBackedProject(ImmutableMap.of()), - ImmutableMap.of(arg.getId(), new StringValue("[initial value]"))); + new StackFrameBuilder().declare(arg, new StringValue("[initial value]")).build()); val result = eval(environment, assign(arg, literal("[updated value]"))); assertEquals(new StringValue("[updated value]"), result); } 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 d461221..66a1f8b 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java @@ -10,6 +10,7 @@ import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodNode; import org.zwobble.couscous.ast.ReturnNode; import org.zwobble.couscous.interpreter.Interpreter; +import org.zwobble.couscous.interpreter.VariableNotInScope; import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import org.zwobble.couscous.values.ConcreteType; import org.zwobble.couscous.values.InterpreterValue; @@ -19,6 +20,7 @@ import com.google.common.collect.ImmutableMap; 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.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.MethodNode.staticMethod; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; @@ -91,7 +93,7 @@ public class InterpreterTests { } @Test - public void canDeclareVariableAndAssignValues() { + public void canDeclareVariableAndThenAssignValues() { val localVariableDeclaration = localVariableDeclaration( 42, StringValue.REF, "x", LiteralNode.literal("[initial value]")); val method = staticMethod("hello") @@ -102,6 +104,19 @@ public class InterpreterTests { assertEquals(new StringValue("[updated value]"), result); } + + @Test + public void errorIfTryingToAssignToVariableNotInScope() { + val localVariableDeclaration = localVariableDeclaration( + 42, StringValue.REF, "x", literal("")); + val method = staticMethod("hello") + .statement(new ExpressionStatementNode(new Assignment(reference(localVariableDeclaration), LiteralNode.literal("[updated value]")))); + + val exception = assertThrows(VariableNotInScope.class, + () -> runMethod(method)); + + assertEquals(new VariableNotInScope(42), exception); + } private InterpreterValue runMethod(MethodNode.MethodNodeBuilder methodBuilder, InterpreterValue... arguments) { val method = methodBuilder.build(); |
