aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-07-31 18:06:33 +0100
committerMichael Williamson <mike@zwobble.org>2016-07-31 18:06:33 +0100
commit1b0bd2dd2eac9883d81d9e2ccb0eecdb50add59c (patch)
tree07aa3ae827d79991f0fc62193d584fec399a651a /src/test/java/org/zwobble
parent879f53add0eb030ba6eee502d11b919d9ae25997 (diff)
Read for-each as sugared statements
Diffstat (limited to 'src/test/java/org/zwobble')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java27
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java46
2 files changed, 70 insertions, 3 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
index c6055e7..5718dca 100644
--- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java
@@ -3,14 +3,13 @@ package org.zwobble.couscous.tests.frontends.java;
import org.junit.Test;
import org.zwobble.couscous.ast.*;
import org.zwobble.couscous.ast.identifiers.Identifier;
+import org.zwobble.couscous.frontends.java.JavaTypes;
import org.zwobble.couscous.types.ScalarType;
import org.zwobble.couscous.types.Types;
import java.util.List;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.zwobble.couscous.ast.AnnotationNode.annotation;
@@ -32,6 +31,7 @@ import static org.zwobble.couscous.ast.ThisReferenceNode.thisReference;
import static org.zwobble.couscous.ast.ThrowNode.throwNode;
import static org.zwobble.couscous.ast.TryNode.tryStatement;
import static org.zwobble.couscous.ast.TypeCoercionNode.typeCoercion;
+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.frontends.java.JavaReading.*;
@@ -178,6 +178,27 @@ public class JavaReaderTests {
}
@Test
+ public void canReadForEachLoops() {
+ List<StatementNode> statements = new JavaStatementSourceReader()
+ .returns("String")
+ .addVariable("iterable", "java.lang.Iterable<String>")
+ .readStatement("for (String x : iterable) { return x; } return \"\";");
+
+ VariableDeclaration expectedTarget = var(Identifier.TOP.type("com.example.Example").method("main").variable("x"), "x", Types.STRING);
+ assertEquals(
+ list(
+ new ForEachNode(
+ expectedTarget,
+ reference(var(Identifier.TOP.type("com.example.Example").method("main").variable("iterable"), "iterable", JavaTypes.iterable(Types.STRING))),
+ list(returns(reference(expectedTarget)))
+ ),
+ returns(literal(""))
+ ),
+ statements
+ );
+ }
+
+ @Test
public void canReadSwitchStatements() {
assertThat(
readStatement("int", "switch (\"one\") { case \"one\": case \"two\": return 0; default: return 1; }"),
diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java
new file mode 100644
index 0000000..69be77d
--- /dev/null
+++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java
@@ -0,0 +1,46 @@
+package org.zwobble.couscous.tests.frontends.java;
+
+import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.ast.StatementNode;
+
+import java.util.List;
+
+import static org.zwobble.couscous.tests.frontends.java.JavaReading.readClass;
+import static org.zwobble.couscous.util.ExtraIterables.only;
+import static org.zwobble.couscous.util.ExtraLists.append;
+import static org.zwobble.couscous.util.ExtraLists.list;
+
+class JavaStatementSourceReader {
+ private final List<String> variables;
+ private final String returnType;
+
+ JavaStatementSourceReader() {
+ this(list(), "void");
+ }
+
+ private JavaStatementSourceReader(List<String> variables, String returnType) {
+ this.variables = variables;
+ this.returnType = returnType;
+ }
+
+ JavaStatementSourceReader returns(String returnType) {
+ return new JavaStatementSourceReader(variables, returnType);
+ }
+
+ JavaStatementSourceReader addVariable(String name, String type) {
+ return new JavaStatementSourceReader(append(variables, type + " " + name), returnType);
+ }
+
+ public List<StatementNode> readStatement(String statement) {
+ String javaClass = generateMethodSource(variables, returnType, statement);
+ ClassNode classNode = readClass(javaClass);
+ return only(classNode.getMethods()).getBody().get();
+
+ }
+
+ private String generateMethodSource(List<String> variables, String returnType, String statement) {
+ return "public static " + returnType + " main(" + String.join(", ", variables) + ") throws Exception {" +
+ statement +
+ "}";
+ }
+}