diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-06 13:20:24 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-06 13:20:24 +0000 |
| commit | 72b1f97f94a5a1a716e1b7ce9fcef660bc07bb72 (patch) | |
| tree | c4e960c869221240dcf66f18b39de57ddc9c0663 /src | |
| parent | 84acb51efceeaac756c5ddc830d298f16055be21 (diff) | |
Enable all method tests for C# backend
Diffstat (limited to 'src')
5 files changed, 36 insertions, 19 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java index 923bb2f..a76ca80 100644 --- a/src/main/java/org/zwobble/couscous/ast/LiteralNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LiteralNode.java @@ -7,6 +7,8 @@ import org.zwobble.couscous.values.*; import static org.zwobble.couscous.values.PrimitiveValues.value; public class LiteralNode implements ExpressionNode { + public static final ExpressionNode UNIT = literal(PrimitiveValues.UNIT); + public static LiteralNode literal(PrimitiveValue value) { return new LiteralNode(value, value.getType()); } diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java index 0292320..e47b732 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.NodeVisitor; import org.zwobble.couscous.backends.SourceCodeWriter; import org.zwobble.couscous.values.PrimitiveValueVisitor; +import org.zwobble.couscous.values.UnitValue; import java.util.List; @@ -176,8 +177,10 @@ public class CsharpSerializer implements NodeVisitor { public void visit(ReturnNode returnNode) { writer.writeStatement(() -> { writer.writeKeyword("return"); - writer.writeSpace(); - write(returnNode.getValue()); + if (!returnNode.getValue().getType().equals(UnitValue.REF)) { + writer.writeSpace(); + write(returnNode.getValue()); + } writer.writeSymbol(";"); }); } diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java index 8817644..41c57a7 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java @@ -1,16 +1,9 @@ package org.zwobble.couscous.tests.backends.csharp; -import org.junit.Ignore; -import org.junit.Test; import org.zwobble.couscous.tests.BackendMethodTests; import org.zwobble.couscous.tests.MethodRunner; public class CsharpCompilerMethodTests extends BackendMethodTests { - @Ignore - @Test - public void methodWithNoStatementsReturnsUnit() { - } - @Override protected MethodRunner buildMethodRunner() { return new CsharpMethodRunner(); diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java index 5d9c27d..3915482 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java @@ -1,6 +1,7 @@ package org.zwobble.couscous.tests.backends.csharp; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import org.hamcrest.Matchers; import org.zwobble.couscous.Backend; @@ -14,9 +15,7 @@ import org.zwobble.couscous.backends.python.PythonCodeGenerator; import org.zwobble.couscous.tests.MethodRunner; import org.zwobble.couscous.tests.backends.Processes; import org.zwobble.couscous.util.ExtraLists; -import org.zwobble.couscous.values.ObjectValues; -import org.zwobble.couscous.values.PrimitiveValue; -import org.zwobble.couscous.values.StringValue; +import org.zwobble.couscous.values.*; import java.io.IOException; import java.nio.file.Files; @@ -41,7 +40,11 @@ public class CsharpMethodRunner implements MethodRunner { Backend compiler = new CsharpBackend(directoryPath, NAMESPACE); try { compiler.compile(classNodes); - return runFunction(directoryPath, className, methodName, arguments); + ClassNode classNode = Iterables.find(classNodes, c -> c.getName().equals(className)); + boolean isVoid = Iterables.find(classNode.getMethods(), method -> method.getName().equals(methodName)) + .getReturnType() + .equals(UnitValue.REF); + return runFunction(directoryPath, className, methodName, arguments, isVoid); } finally { deleteRecursively(directoryPath.toFile()); } @@ -50,11 +53,12 @@ public class CsharpMethodRunner implements MethodRunner { } } - public static PrimitiveValue runFunction( + private static PrimitiveValue runFunction( Path directoryPath, TypeName className, String methodName, - List<PrimitiveValue> arguments) + List<PrimitiveValue> arguments, + boolean isVoid) throws IOException, InterruptedException { // TODO: use arguments @@ -68,12 +72,17 @@ public class CsharpMethodRunner implements MethodRunner { eagerMap(arguments, LiteralNode::literal), // TODO: pass in return type ObjectValues.OBJECT)); + + String body = isVoid + ? value + ";" + : "var value = " + value + ";" + + " System.Console.WriteLine(value.GetType());" + + " System.Console.WriteLine(value);"; + String program = "public class MethodRunnerExample { " + " public static void Main() { " + - " var value = " + value + ";" + - " System.Console.WriteLine(value.GetType());" + - " System.Console.WriteLine(value);" + + " " + body + " }" + "}"; Files.write(directoryPath.resolve("MethodRunnerExample.cs"), list(program)); @@ -83,7 +92,11 @@ public class CsharpMethodRunner implements MethodRunner { findCsharpFiles(directoryPath)), directoryPath); String output = Processes.run(list("mono", "MethodRunnerExample.exe"), directoryPath); - return readPrimitive(output); + if (isVoid) { + return PrimitiveValues.UNIT; + } else { + return readPrimitive(output); + } } private static List<String> findCsharpFiles(Path directoryPath) throws IOException { diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java index 3f4ef60..6bc191c 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpSerializerTests.java @@ -155,6 +155,12 @@ public class CsharpSerializerTests { } @Test + public void noValueIsSpecifiedWhenReturningUnit() { + String output = serialize(returns(LiteralNode.UNIT)); + assertEquals("return;\n", output); + } + + @Test public void expressionStatementWritesExpression() { String output = serialize(expressionStatement(literal(true))); assertEquals("true;\n", output); |
