diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-07-31 18:06:33 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-07-31 18:06:33 +0100 |
| commit | 1b0bd2dd2eac9883d81d9e2ccb0eecdb50add59c (patch) | |
| tree | 07aa3ae827d79991f0fc62193d584fec399a651a /src/test/java/org/zwobble | |
| parent | 879f53add0eb030ba6eee502d11b919d9ae25997 (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.java | 27 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/frontends/java/JavaStatementSourceReader.java | 46 |
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 + + "}"; + } +} |
