diff options
Diffstat (limited to 'src/test/java/org')
10 files changed, 97 insertions, 72 deletions
diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java index d6d35af..c8b2b70 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java @@ -153,7 +153,7 @@ public abstract class BackendMethodTests { String className = "com.example.Program"; ClassNode classNode = ClassNode.builder(className).method(method).build(); MethodRunner runner = buildMethodRunner(); - return runner.runMethod(list(classNode), classNode.getName(), method.getName(), asList(arguments)); + return runner.runMethod(list(classNode), classNode.getName(), method.getName(), asList(arguments), method.getReturnType()); } protected abstract MethodRunner buildMethodRunner(); diff --git a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java index 5b63a66..f03f6ce 100644 --- a/src/test/java/org/zwobble/couscous/tests/CompilerTests.java +++ b/src/test/java/org/zwobble/couscous/tests/CompilerTests.java @@ -2,7 +2,10 @@ package org.zwobble.couscous.tests; import org.junit.Test; import org.zwobble.couscous.ast.TypeName; +import org.zwobble.couscous.values.BooleanValue; +import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.PrimitiveValue; +import org.zwobble.couscous.values.StringValue; import java.io.File; import java.io.IOException; @@ -20,7 +23,7 @@ import static org.zwobble.couscous.values.PrimitiveValues.value; public abstract class CompilerTests { @Test public void canEvaluateLiterals() { - assertEquals(value("hello"), evalExpression("String", "\"hello\"")); + assertEquals(value("hello"), evalExpression(StringValue.REF, "\"hello\"")); assertEquals(value(42), evalIntExpression("42")); } @@ -38,13 +41,13 @@ public abstract class CompilerTests { @Test public void equalityOnReferenceTypesChecksForIdentity() { assertEquals(value(false), evalBooleanExpression("new Object() == new Object()")); - assertEquals(value(true), exec("boolean", "Object x = new Object(); return x == x;")); + assertEquals(value(true), exec(BooleanValue.REF, "Object x = new Object(); return x == x;")); } @Test public void integersCanBeAssignedToObjectVariable() { - assertEquals(value(false), exec("boolean", "Object x = 1; return x.equals(new Object());")); - assertEquals(value(true), exec("boolean", "Object x = 1; return x.equals(1);")); + assertEquals(value(false), exec(BooleanValue.REF, "Object x = 1; return x.equals(new Object());")); + assertEquals(value(true), exec(BooleanValue.REF, "Object x = 1; return x.equals(1);")); } @Test @@ -55,7 +58,8 @@ public abstract class CompilerTests { "recursive-factorial", TypeName.of("com.example.RecursiveFactorial"), "factorial", - list(value(6)))); + list(value(6)), + IntegerValue.REF)); } @Test @@ -66,7 +70,8 @@ public abstract class CompilerTests { "while-factorial", TypeName.of("com.example.WhileFactorial"), "factorial", - list(value(6)))); + list(value(6)), + IntegerValue.REF)); } @Test @@ -77,7 +82,8 @@ public abstract class CompilerTests { "for-factorial", TypeName.of("com.example.ForFactorial"), "factorial", - list(value(6)))); + list(value(6)), + IntegerValue.REF)); } @Test @@ -88,7 +94,8 @@ public abstract class CompilerTests { "anonymous-class", TypeName.of("com.example.AnonymousClass"), "value", - list())); + list(), + IntegerValue.REF)); } @Test @@ -99,7 +106,8 @@ public abstract class CompilerTests { "anonymous-class-capture", TypeName.of("com.example.AnonymousClass"), "value", - list(value(42)))); + list(value(42)), + IntegerValue.REF)); } @Test @@ -110,7 +118,8 @@ public abstract class CompilerTests { "lambda", TypeName.of("com.example.Lambda"), "value", - list())); + list(), + IntegerValue.REF)); } @Test @@ -121,7 +130,8 @@ public abstract class CompilerTests { "lambda-capture", TypeName.of("com.example.Lambda"), "value", - list(value(2)))); + list(value(2)), + IntegerValue.REF)); } @Test @@ -132,7 +142,8 @@ public abstract class CompilerTests { "lambda-this-capture", TypeName.of("com.example.Lambda"), "value", - list(value(2)))); + list(value(2)), + IntegerValue.REF)); } @Test @@ -143,31 +154,33 @@ public abstract class CompilerTests { "static-method-overloads", TypeName.of("com.example.StaticMethodOverloads"), "value", - list())); + list(), + IntegerValue.REF)); } @Test public void stringAdd() throws Exception { - assertEquals(value("42"), evalExpression("String", "\"4\" + \"2\"")); + assertEquals(value("42"), evalExpression(StringValue.REF, "\"4\" + \"2\"")); } @Test public void stringToLowerCase() throws Exception { - assertEquals(value("patrick wolf"), evalExpression("String", "\"Patrick Wolf\".toLowerCase()")); + assertEquals(value("patrick wolf"), evalExpression(StringValue.REF, "\"Patrick Wolf\".toLowerCase()")); } @Test public void stringEquals() throws Exception { - assertEquals(value(true), evalExpression("boolean", "\"a\".equals(\"a\")")); - assertEquals(value(false), evalExpression("boolean", "\"a\".equals(\"b\")")); - assertEquals(value(false), evalExpression("boolean", "\"a\".equals(42)")); + assertEquals(value(true), evalBooleanExpression("\"a\".equals(\"a\")")); + assertEquals(value(false), evalBooleanExpression("\"a\".equals(\"b\")")); + assertEquals(value(false), evalBooleanExpression("\"a\".equals(42)")); } private PrimitiveValue execTestProgram( String directoryName, TypeName type, String methodName, - List<PrimitiveValue> arguments) throws IOException, InterruptedException { + List<PrimitiveValue> arguments, + TypeName returnType) throws IOException, InterruptedException { Path path = pathForResource( "/java/" + directoryName + "/" + type.getQualifiedName().replace(".", "/") + ".java"); @@ -176,14 +189,16 @@ public abstract class CompilerTests { directoryName(path, type.getQualifiedName().split("\\.").length), type, methodName, - arguments); + arguments, + returnType); } protected abstract PrimitiveValue execProgram( Path directory, TypeName type, String methodName, - List<PrimitiveValue> arguments) throws IOException, InterruptedException; + List<PrimitiveValue> arguments, + TypeName returnType) throws IOException, InterruptedException; private Path directoryName(Path path, int length) { for (int i = 0; i < length; i++) { @@ -192,12 +207,12 @@ public abstract class CompilerTests { return path; } - private PrimitiveValue exec(String returnType, String source) { + private PrimitiveValue exec(TypeName returnType, String source) { try { String javaClass = "package com.example;" + "public class Example {" + - " public static " + returnType + " main() {" + source + "}" + + " public static " + returnType.getQualifiedName() + " main() {" + source + "}" + "}"; Path directoryPath = Files.createTempDirectory(null); try { @@ -207,7 +222,8 @@ public abstract class CompilerTests { directoryPath, TypeName.of("com.example.Example"), "main", - list()); + list(), + returnType); } finally { deleteRecursively(directoryPath.toFile()); } @@ -217,18 +233,14 @@ public abstract class CompilerTests { } private PrimitiveValue evalBooleanExpression(String expressionSource) { - return evalExpression("boolean", expressionSource); + return evalExpression(BooleanValue.REF, expressionSource); } private PrimitiveValue evalIntExpression(String expressionSource) { - return evalExpression("int", expressionSource); + return evalExpression(IntegerValue.REF, expressionSource); } - private PrimitiveValue evalObjectExpression(String expressionSource) { - return evalExpression("Object", expressionSource); - } - - private PrimitiveValue evalExpression(String type, String expressionSource) { + private PrimitiveValue evalExpression(TypeName type, String expressionSource) { return exec(type, "return " + expressionSource + ";"); } diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java index 59cc6d6..5a6ada1 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToInterpreterTests.java @@ -24,7 +24,8 @@ public class JavaToInterpreterTests extends CompilerTests { Path directory, TypeName type, String methodName, - List<PrimitiveValue> arguments + List<PrimitiveValue> arguments, + TypeName returnType ) throws IOException, InterruptedException { JavaFrontend frontend = new JavaFrontend(); List<ClassNode> classNodes = frontend.readSourceDirectory(list(directory), directory); @@ -33,7 +34,7 @@ public class JavaToInterpreterTests extends CompilerTests { Interpreter interpreter = new Interpreter(project); List<InterpreterValue> argumentValues = ImmutableList.copyOf(transform(arguments, InterpreterValues::value)); - return interpreter.run(type, methodName, argumentValues) + return interpreter.run(type, methodName, argumentValues, returnType) .toPrimitiveValue().get(); } } diff --git a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java index a0d1c7e..6b9f6ed 100644 --- a/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java +++ b/src/test/java/org/zwobble/couscous/tests/JavaToPythonTests.java @@ -1,7 +1,5 @@ package org.zwobble.couscous.tests; -import com.google.common.collect.ImmutableList; -import org.junit.Test; import org.zwobble.couscous.CouscousCompiler; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.backends.python.PythonBackend; @@ -10,7 +8,6 @@ import org.zwobble.couscous.tests.backends.python.PythonMethodRunner; import org.zwobble.couscous.values.PrimitiveValue; import java.io.IOException; -import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @@ -23,7 +20,8 @@ public class JavaToPythonTests extends CompilerTests { Path directory, TypeName type, String methodName, - List<PrimitiveValue> arguments) throws IOException, InterruptedException { + List<PrimitiveValue> arguments, + TypeName returnType) throws IOException, InterruptedException { Path directoryPath = Files.createTempDirectory(null); try { @@ -31,7 +29,7 @@ public class JavaToPythonTests extends CompilerTests { new JavaFrontend(), new PythonBackend(directoryPath, "couscous")); compiler.compileDirectory(list(directory), directory); - return PythonMethodRunner.runFunction(directoryPath, type, methodName, arguments); + return PythonMethodRunner.runFunction(directoryPath, type, methodName, arguments, returnType); } finally { deleteRecursively(directoryPath.toFile()); } diff --git a/src/test/java/org/zwobble/couscous/tests/MethodRunner.java b/src/test/java/org/zwobble/couscous/tests/MethodRunner.java index ed486fc..59b71f9 100644 --- a/src/test/java/org/zwobble/couscous/tests/MethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/MethodRunner.java @@ -14,7 +14,14 @@ public interface MethodRunner { List<ClassNode> classNodes, TypeName className, String methodName, - List<PrimitiveValue> arguments); + List<PrimitiveValue> arguments, TypeName returnType); + + + default PrimitiveValue runMethod(List<ClassNode> classNodes, TypeName className, String methodName, List<PrimitiveValue> arguments) { + ClassNode classNode = Iterables.find(classNodes, c -> c.getName().equals(className)); + MethodNode method = Iterables.find(classNode.getMethods(), m -> m.getName().equals(methodName)); + return runMethod(classNodes, className, methodName, arguments, method.getReturnType()); + } default PrimitiveValue evalExpression(List<ClassNode> classes, ExpressionNode expression) { ClassNode programNode = ClassNode.builder("Program") @@ -29,6 +36,7 @@ public interface MethodRunner { list(programNode))), programNode.getName(), "run", - list()); + list(), + expression.getType()); } } 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 d293f84..88cce22 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,7 +1,6 @@ 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; @@ -15,7 +14,10 @@ import org.zwobble.couscous.backends.csharp.CsharpSerializer; import org.zwobble.couscous.tests.MethodRunner; import org.zwobble.couscous.tests.backends.Processes; import org.zwobble.couscous.util.ExtraLists; -import org.zwobble.couscous.values.*; +import org.zwobble.couscous.values.PrimitiveValue; +import org.zwobble.couscous.values.PrimitiveValues; +import org.zwobble.couscous.values.StringValue; +import org.zwobble.couscous.values.UnitValue; import java.io.IOException; import java.nio.file.Files; @@ -34,17 +36,13 @@ 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) { + public PrimitiveValue runMethod(List<ClassNode> classNodes, TypeName className, String methodName, List<PrimitiveValue> arguments, TypeName returnType) { try { Path directoryPath = Files.createTempDirectory(null); Backend compiler = new CsharpBackend(directoryPath, NAMESPACE); try { compiler.compile(classNodes); - 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); + return runFunction(directoryPath, className, methodName, arguments, returnType); } finally { deleteRecursively(directoryPath.toFile()); } @@ -58,21 +56,22 @@ public class CsharpMethodRunner implements MethodRunner { TypeName className, String methodName, List<PrimitiveValue> arguments, - boolean isVoid) + TypeName returnType) throws IOException, InterruptedException { MethodSignature signature = new MethodSignature( methodName, - eagerMap(arguments, argument -> argument.getType())); + eagerMap(arguments, argument -> argument.getType()), + returnType); String csharpMethodName = Names.toUniqueName(signature); String value = CsharpSerializer.serialize( staticMethodCall( TypeName.of(NAMESPACE + "." + className.getQualifiedName()), csharpMethodName, eagerMap(arguments, LiteralNode::literal), - // TODO: pass in return type - ObjectValues.OBJECT)); + returnType)); + boolean isVoid = returnType.equals(UnitValue.REF); String body = isVoid ? value + ";" : "var value = " + value + ";" + diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/JavaToCsharpTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/JavaToCsharpTests.java index e578ef3..1ab76bd 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/JavaToCsharpTests.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/JavaToCsharpTests.java @@ -47,7 +47,8 @@ public class JavaToCsharpTests extends CompilerTests { Path directory, TypeName type, String methodName, - List<PrimitiveValue> arguments) throws IOException, InterruptedException + List<PrimitiveValue> arguments, + TypeName returnType) throws IOException, InterruptedException { Path directoryPath = Files.createTempDirectory(null); try { @@ -55,7 +56,7 @@ public class JavaToCsharpTests extends CompilerTests { new JavaFrontend(), new CsharpBackend(directoryPath, "Couscous")); compiler.compileDirectory(list(directory), directory); - return CsharpMethodRunner.runFunction(directoryPath, type, methodName, arguments, false); + return CsharpMethodRunner.runFunction(directoryPath, type, methodName, arguments, returnType); } finally { deleteRecursively(directoryPath.toFile()); } diff --git a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java index e541459..a4a57d1 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java @@ -28,13 +28,13 @@ import static org.zwobble.couscous.values.PrimitiveValues.value; public class PythonMethodRunner implements MethodRunner { @Override - public PrimitiveValue runMethod(List<ClassNode> classNodes, TypeName className, String methodName, List<PrimitiveValue> arguments) { + public PrimitiveValue runMethod(List<ClassNode> classNodes, TypeName className, String methodName, List<PrimitiveValue> arguments, TypeName returnType) { try { Path directoryPath = Files.createTempDirectory(null); PythonBackend compiler = new PythonBackend(directoryPath, "couscous"); try { compiler.compile(classNodes); - return runFunction(directoryPath, className, methodName, arguments); + return runFunction(directoryPath, className, methodName, arguments, returnType); } finally { deleteRecursively(directoryPath.toFile()); } @@ -47,13 +47,15 @@ public class PythonMethodRunner implements MethodRunner { Path directoryPath, TypeName className, String methodName, - List<PrimitiveValue> arguments) + List<PrimitiveValue> arguments, + TypeName returnType) throws IOException, InterruptedException { String argumentsString = Joiner.on(", ").join(arguments.stream().map(PythonCodeGenerator::generateCode).map(PythonSerializer::serialize).iterator()); MethodSignature signature = new MethodSignature( methodName, - eagerMap(arguments, argument -> argument.getType())); + eagerMap(arguments, argument -> argument.getType()), + returnType); String pythonMethodName = Names.toUniqueName(signature); String program = "from couscous." + className.getQualifiedName() + " import " + className.getSimpleName() + ";" + "value = " + className.getSimpleName() + "." + pythonMethodName + "(" + argumentsString + ");" + diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java index 49b435d..afd0936 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/EvaluatorTests.java @@ -66,7 +66,7 @@ public class EvaluatorTests extends BackendEvalTests { "size", list(), IntegerValue.REF))); - assertEquals(new MethodSignature("size", list()), exception.getSignature()); + assertEquals(new MethodSignature("size", list(), IntegerValue.REF), exception.getSignature()); } @Test @@ -78,7 +78,7 @@ public class EvaluatorTests extends BackendEvalTests { "substring", list(literal(1)), StringValue.REF))); - assertEquals(new MethodSignature("substring", list(IntegerValue.REF)), exception.getSignature()); + assertEquals(new MethodSignature("substring", list(IntegerValue.REF), StringValue.REF), exception.getSignature()); } @Test @@ -91,7 +91,7 @@ public class EvaluatorTests extends BackendEvalTests { list(literal(0), literal("")), StringValue.REF))); assertEquals( - new MethodSignature("substring", list(IntegerValue.REF, StringValue.REF)), + new MethodSignature("substring", list(IntegerValue.REF, StringValue.REF), StringValue.REF), exception.getSignature()); } diff --git a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java index f9b1f07..499d18c 100644 --- a/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java +++ b/src/test/java/org/zwobble/couscous/tests/interpreter/InterpreterMethodTests.java @@ -1,11 +1,10 @@ package org.zwobble.couscous.tests.interpreter; -import java.util.List; -import java.util.stream.Collectors; - import org.junit.Test; import org.zwobble.couscous.ast.*; -import org.zwobble.couscous.interpreter.*; +import org.zwobble.couscous.interpreter.Interpreter; +import org.zwobble.couscous.interpreter.JavaProject; +import org.zwobble.couscous.interpreter.Project; import org.zwobble.couscous.interpreter.errors.NoSuchMethod; import org.zwobble.couscous.interpreter.errors.UnboundVariable; import org.zwobble.couscous.interpreter.errors.UnexpectedValueType; @@ -17,6 +16,10 @@ import org.zwobble.couscous.tests.MethodRunner; import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.StringValue; +import org.zwobble.couscous.values.UnitValue; + +import java.util.List; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; import static org.zwobble.couscous.ast.AssignmentNode.assign; @@ -41,7 +44,7 @@ public class InterpreterMethodTests extends BackendMethodTests { NoSuchMethod exception = assertThrows(NoSuchMethod.class, () -> runMethod(method, value("hello, world!"))); - assertEquals(new MethodSignature("hello", list(StringValue.REF)), exception.getSignature()); + assertEquals(new MethodSignature("hello", list(StringValue.REF), UnitValue.REF), exception.getSignature()); } @Test @@ -102,10 +105,11 @@ public class InterpreterMethodTests extends BackendMethodTests { return new MethodRunner() { @Override public PrimitiveValue runMethod( - List<ClassNode> classNodes, - TypeName className, - String methodName, - List<PrimitiveValue> arguments) { + List<ClassNode> classNodes, + TypeName className, + String methodName, + List<PrimitiveValue> arguments, + TypeName returnType) { Project project = JavaProject.of(classNodes); Interpreter interpreter = new Interpreter(project); @@ -113,7 +117,7 @@ public class InterpreterMethodTests extends BackendMethodTests { .map(InterpreterValues::value) .collect(Collectors.toList()); - return interpreter.run(className, methodName, argumentValues) + return interpreter.run(className, methodName, argumentValues, returnType) .toPrimitiveValue().get(); } }; |
