diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-14 21:26:14 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-14 21:40:53 +0000 |
| commit | 5e64358224731d9b167fd155c481166d36b1fddd (patch) | |
| tree | 10dbef6834fb15a1ab49111f87cdf72122a64b88 /src/test/java/org/zwobble/couscous/tests/backends/csharp | |
| parent | feca7c0185041c27d7ee2057b5458b02b0b352bf (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.java | 82 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java | 84 |
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); + } +} |
