aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble/couscous/tests/backends/csharp
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-14 21:26:14 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-14 21:40:53 +0000
commit5e64358224731d9b167fd155c481166d36b1fddd (patch)
tree10dbef6834fb15a1ab49111f87cdf72122a64b88 /src/test/java/org/zwobble/couscous/tests/backends/csharp
parentfeca7c0185041c27d7ee2057b5458b02b0b352bf (diff)
Add initial method runner for C#
Diffstat (limited to 'src/test/java/org/zwobble/couscous/tests/backends/csharp')
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java82
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java84
2 files changed, 166 insertions, 0 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
new file mode 100644
index 0000000..7366942
--- /dev/null
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
@@ -0,0 +1,82 @@
+package org.zwobble.couscous.tests.backends.csharp;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.ast.ExpressionNode;
+import org.zwobble.couscous.tests.BackendEvalTests;
+import org.zwobble.couscous.values.PrimitiveValue;
+
+import java.util.List;
+
+public class CsharpCompilerEvalTests extends BackendEvalTests {
+ @Test
+ @Ignore
+ public void canEvaluateLiterals() {
+ }
+
+ @Test
+ @Ignore
+ public void equalityOnReferenceTypesChecksForIdentity() {
+ }
+
+ @Test
+ @Ignore
+ public void canEvaluateOperationsOnBooleans() {
+ }
+
+ @Test
+ @Ignore
+ public void canEvaluateOperationsOnIntegers() {
+ }
+
+ @Test
+ @Ignore
+ public void whenConditionIsTrueThenValueOfConditionalTernaryIsTrueBranch() {
+ }
+
+ @Test
+ @Ignore
+ public void whenConditionIsFalseThenValueOfConditionalTernaryIsFalseBranch() {
+ }
+
+ @Test
+ @Ignore
+ public void canCallMethodWithNoArgumentsOnBuiltin() {
+ }
+
+ @Test
+ @Ignore
+ public void canCallMethodWithArgumentsOnBuiltin() {
+ }
+
+ @Test
+ @Ignore
+ public void canCallBuiltinStaticMethod() {
+ }
+
+ @Test
+ @Ignore
+ public void canCallStaticMethodFromUserDefinedStaticMethod() {
+ }
+
+ @Test
+ @Ignore
+ public void canCallInstanceMethodWithNoArgumentsOnUserDefinedClass() {
+ }
+
+ @Test
+ @Ignore
+ public void canCallInstanceMethodWithArgumentsOnUserDefinedClass() {
+ }
+
+ @Test
+ @Ignore
+ public void constructorIsExecutedOnConstruction() {
+ }
+
+ @Override
+ protected PrimitiveValue evalExpression(List<ClassNode> classes, ExpressionNode expression) {
+ return new CsharpMethodRunner().evalExpression(classes, expression);
+ }
+}
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
new file mode 100644
index 0000000..aee851a
--- /dev/null
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java
@@ -0,0 +1,84 @@
+package org.zwobble.couscous.tests.backends.csharp;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
+import org.zwobble.couscous.Backend;
+import org.zwobble.couscous.ast.ClassNode;
+import org.zwobble.couscous.ast.MethodSignature;
+import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.backends.csharp.CsharpBackend;
+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.PrimitiveValue;
+import org.zwobble.couscous.values.PrimitiveValues;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively;
+import static org.zwobble.couscous.util.ExtraLists.eagerMap;
+import static org.zwobble.couscous.util.ExtraLists.list;
+
+public class CsharpMethodRunner implements MethodRunner {
+ private static final String NAMESPACE = "Couscous";
+
+ @Override
+ public PrimitiveValue runMethod(List<ClassNode> classNodes, TypeName className, String methodName, List<PrimitiveValue> arguments) {
+ try {
+ Path directoryPath = Files.createTempDirectory(null);
+ Backend compiler = new CsharpBackend(directoryPath, NAMESPACE);
+ try {
+ compiler.compile(classNodes);
+ return runFunction(directoryPath, className, methodName, arguments);
+ } finally {
+ deleteRecursively(directoryPath.toFile());
+ }
+ } catch (final java.lang.Throwable $ex) {
+ throw new RuntimeException($ex);
+ }
+ }
+
+ public static PrimitiveValue runFunction(
+ Path directoryPath,
+ TypeName className,
+ String methodName,
+ List<PrimitiveValue> arguments)
+ throws IOException, InterruptedException
+ {
+ // TODO: use arguments
+ String csharpMethodName = PythonCodeGenerator.toName(new MethodSignature(
+ methodName,
+ eagerMap(arguments, argument -> argument.getType())));
+ String program =
+ "public class MethodRunnerExample { " +
+ " public static void Main() { " +
+ " System.Console.WriteLine(" + NAMESPACE + "." + className.getQualifiedName() + "." + csharpMethodName + "());" +
+ " }" +
+ "}";
+ Files.write(directoryPath.resolve("MethodRunnerExample.cs"), list(program));
+ Processes.run(
+ ExtraLists.concat(
+ list("mcs", "-out:MethodRunnerExample.exe"),
+ findCsharpFiles(directoryPath)),
+ directoryPath);
+ String output = Processes.run(list("mono", "MethodRunnerExample.exe"), directoryPath);
+ return readPrimitive(output);
+ }
+
+ private static List<String> findCsharpFiles(Path directoryPath) throws IOException {
+ return ImmutableList.copyOf(
+ Iterators.transform(
+ Iterators.filter(
+ Files.newDirectoryStream(directoryPath).iterator(),
+ path -> path.toFile().isFile() && path.toString().endsWith(".cs")),
+ path -> path.toString()));
+ }
+
+ private static PrimitiveValue readPrimitive(String output) {
+ return PrimitiveValues.value(output);
+ }
+}