aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-11-14 16:52:37 +0000
committerMichael Williamson <mike@zwobble.org>2015-11-14 16:52:37 +0000
commit5338a361c6fd8c42e8bd47a637c21c128b122418 (patch)
treecb78e617f497af5cc2d66215ac285ecc002f37b1 /src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
parent4708229e8cfc4c8909c720395efb680c8775edea (diff)
Implement while loops in backends
Diffstat (limited to 'src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
index 758832f..a325dcb 100644
--- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java
@@ -6,6 +6,7 @@ import org.zwobble.couscous.ast.FormalArgumentNode;
import org.zwobble.couscous.ast.LiteralNode;
import org.zwobble.couscous.ast.LocalVariableDeclarationNode;
import org.zwobble.couscous.ast.MethodNode;
+import org.zwobble.couscous.values.IntegerValue;
import org.zwobble.couscous.values.PrimitiveValue;
import org.zwobble.couscous.values.PrimitiveValues;
import org.zwobble.couscous.values.StringValue;
@@ -13,15 +14,19 @@ import org.zwobble.couscous.values.StringValue;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.zwobble.couscous.ast.AssignmentNode.assign;
+import static org.zwobble.couscous.ast.AssignmentNode.assignStatement;
import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg;
import static org.zwobble.couscous.ast.IfStatementNode.ifStatement;
import static org.zwobble.couscous.ast.LiteralNode.literal;
import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration;
+import static org.zwobble.couscous.ast.MethodCallNode.integerAdd;
+import static org.zwobble.couscous.ast.MethodCallNode.notEqual;
import static org.zwobble.couscous.ast.MethodNode.staticMethod;
import static org.zwobble.couscous.ast.ReturnNode.returns;
import static org.zwobble.couscous.ast.VariableDeclaration.var;
import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
+import static org.zwobble.couscous.ast.WhileNode.whileLoop;
import static org.zwobble.couscous.tests.TestIds.ANY_ID;
import static org.zwobble.couscous.values.PrimitiveValues.value;
@@ -106,6 +111,36 @@ public abstract class BackendMethodTests {
asList(returns(literal("[false]")))));
assertEquals(value("[false]"), runMethod(method));
}
+
+ @Test
+ public void whileLoopIsExecutedWhileConditionIsTrue() {
+ LocalVariableDeclarationNode x = localVariableDeclaration("x", "x", IntegerValue.REF, literal(0));
+ LocalVariableDeclarationNode y = localVariableDeclaration("y", "y", IntegerValue.REF, literal(2));
+ MethodNode.Builder method = staticMethod("hello")
+ .statement(x)
+ .statement(y)
+ .statement(whileLoop(
+ notEqual(reference(x), reference(y)),
+ asList(assignStatement(x, integerAdd(reference(x), literal(1))))))
+ .statement(returns(reference(x)));
+ assertEquals(value(2), runMethod(method));
+ }
+
+ @Test
+ public void returnWillExitWhileLoopEarly() {
+ LocalVariableDeclarationNode x = localVariableDeclaration("x", "x", IntegerValue.REF, literal(0));
+ LocalVariableDeclarationNode y = localVariableDeclaration("y", "y", IntegerValue.REF, literal(2));
+ MethodNode.Builder method = staticMethod("hello")
+ .statement(x)
+ .statement(y)
+ .statement(whileLoop(
+ notEqual(reference(x), reference(y)),
+ asList(
+ assignStatement(x, integerAdd(reference(x), literal(1))),
+ returns(reference(x)))))
+ .statement(returns(reference(x)));
+ assertEquals(value(1), runMethod(method));
+ }
protected PrimitiveValue runMethod(MethodNode.Builder methodBuilder, PrimitiveValue... arguments) {
MethodNode method = methodBuilder.build();