From 87f73abf5e7dcec6a9f5ebd213f4a9eb0a5d45db Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 4 Oct 2015 17:26:27 +0100 Subject: Error if trying to assign to variable not in scope --- .../couscous/tests/interpreter/InterpreterTests.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterTests.java') 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(); -- cgit v1.2.3