aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble/couscous/tests/transforms
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-15 14:23:47 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-15 14:23:47 +0100
commitbc06840e00425db342bc5a021c0900d9e63b71f0 (patch)
tree0aa45a4ea475804a36a5ee33f9a726656f45bc1f /src/test/java/org/zwobble/couscous/tests/transforms
parent3be68289f34a37ac7f9e1e95fa0d95dfc1bb3836 (diff)
Split switch handling off to desugar step
Diffstat (limited to 'src/test/java/org/zwobble/couscous/tests/transforms')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/transforms/DesugarSwitchToIfElseTests.java129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/transforms/DesugarSwitchToIfElseTests.java b/src/test/java/org/zwobble/couscous/tests/transforms/DesugarSwitchToIfElseTests.java
new file mode 100644
index 0000000..9e458e7
--- /dev/null
+++ b/src/test/java/org/zwobble/couscous/tests/transforms/DesugarSwitchToIfElseTests.java
@@ -0,0 +1,129 @@
+package org.zwobble.couscous.tests.transforms;
+
+import org.junit.Test;
+import org.zwobble.couscous.ast.Operations;
+import org.zwobble.couscous.ast.VariableDeclaration;
+import org.zwobble.couscous.ast.identifiers.Identifiers;
+import org.zwobble.couscous.ast.sugar.SwitchNode;
+import org.zwobble.couscous.frontends.java.Scope;
+import org.zwobble.couscous.transforms.DesugarSwitchToIfElse;
+import org.zwobble.couscous.types.Types;
+
+import static org.junit.Assert.assertEquals;
+import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement;
+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.ReturnNode.returns;
+import static org.zwobble.couscous.ast.VariableDeclaration.var;
+import static org.zwobble.couscous.ast.VariableReferenceNode.reference;
+import static org.zwobble.couscous.ast.sugar.SwitchCaseNode.switchCase;
+import static org.zwobble.couscous.util.ExtraLists.list;
+
+public class DesugarSwitchToIfElseTests {
+ @Test
+ public void switchStatementWithoutFallThroughIsReadAsIfElseStatement() {
+ VariableDeclaration tmp = var(
+ Identifiers.variable(Identifiers.TOP, "_couscous_tmp_0"),
+ "_couscous_tmp_0",
+ Types.STRING
+ );
+ assertEquals(
+ list(
+ localVariableDeclaration(tmp, literal("one")),
+ ifStatement(
+ Operations.methodEquals(reference(tmp), literal("one")),
+ list(returns(literal(1))),
+ list(
+ ifStatement(
+ Operations.methodEquals(reference(tmp), literal("two")),
+ list(returns(literal(2))),
+ list(
+ returns(literal(0))
+ )
+ )
+ )
+ )
+ ),
+ DesugarSwitchToIfElse.desugar(
+ Scope.create(),
+ new SwitchNode(
+ literal("one"),
+ list(
+ switchCase(literal("one"), list(returns(literal(1)))),
+ switchCase(literal("two"), list(returns(literal(2)))),
+ switchCase(list(returns(literal(0))))
+ )
+ )
+ )
+ );
+ }
+
+ @Test
+ public void switchStatementWithoutDefaultIsReadAsIfStatementWithoutElseStatement() {
+ VariableDeclaration tmp = var(
+ Identifiers.variable(Identifiers.TOP, "_couscous_tmp_0"),
+ "_couscous_tmp_0",
+ Types.STRING
+ );
+ assertEquals(
+ list(
+ localVariableDeclaration(tmp, literal("one")),
+ ifStatement(
+ Operations.methodEquals(reference(tmp), literal("two")),
+ list(returns(literal(0))),
+ list()
+ )
+ ),
+ DesugarSwitchToIfElse.desugar(
+ Scope.create(),
+ new SwitchNode(
+ literal("one"),
+ list(
+ switchCase(literal("two"), list(returns(literal(0))))
+ )
+ )
+ )
+ );
+ }
+
+ @Test
+ public void casesCanFallthrough() {
+ VariableDeclaration tmp = var(
+ Identifiers.variable(Identifiers.TOP, "_couscous_tmp_0"),
+ "_couscous_tmp_0",
+ Types.STRING
+ );
+ assertEquals(
+ list(
+ localVariableDeclaration(tmp, literal("one")),
+ ifStatement(
+ Operations.methodEquals(reference(tmp), literal("one")),
+ list(
+ expressionStatement(literal(1)),
+ returns(literal(2))
+ ),
+ list(
+ ifStatement(
+ Operations.methodEquals(reference(tmp), literal("two")),
+ list(
+ returns(literal(2))
+ ),
+ list()
+ )
+ )
+ )
+ ),
+ DesugarSwitchToIfElse.desugar(
+ Scope.create(),
+ new SwitchNode(
+ literal("one"),
+ list(
+ switchCase(literal("one"), list(expressionStatement(literal(1)))),
+ switchCase(literal("two"), list(returns(literal(2))))
+ )
+ )
+ )
+ );
+ }
+}