From 5338a361c6fd8c42e8bd47a637c21c128b122418 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 14 Nov 2015 16:52:37 +0000 Subject: Implement while loops in backends --- .../zwobble/couscous/tests/BackendMethodTests.java | 35 ++++++++++++++++++++++ .../backends/python/PythonSerializerTests.java | 9 ++++++ 2 files changed, 44 insertions(+) (limited to 'src/test/java/org') 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(); diff --git a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonSerializerTests.java b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonSerializerTests.java index c3782aa..9271d85 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonSerializerTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonSerializerTests.java @@ -25,6 +25,7 @@ import static org.zwobble.couscous.backends.python.ast.PythonPassNode.PASS; import static org.zwobble.couscous.backends.python.ast.PythonReturnNode.pythonReturn; import static org.zwobble.couscous.backends.python.ast.PythonStringLiteralNode.pythonStringLiteral; import static org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode.pythonVariableReference; +import static org.zwobble.couscous.backends.python.ast.PythonWhileNode.pythonWhile; public class PythonSerializerTests { @Test @@ -162,6 +163,14 @@ public class PythonSerializerTests { asList(pythonReturn(pythonIntegerLiteral(2))))); assertEquals("if True:\n return 1\nelse:\n return 2\n", output); } + + @Test + public void whileIsSerializedWithWhileKeyword() { + String output = serialize(pythonWhile( + pythonBooleanLiteral(true), + asList(pythonReturn(pythonIntegerLiteral(1))))); + assertEquals("while True:\n return 1\n", output); + } @Test public void moduleIsSerializedStatements() { -- cgit v1.2.3