diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-14 21:37:35 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-14 21:37:35 +0000 |
| commit | feca7c0185041c27d7ee2057b5458b02b0b352bf (patch) | |
| tree | 16bd8bafda2bf7a901e0f0529333a25bcbde61ca /src/test/java | |
| parent | 596527f0c0d1b9c2b30717d77aa0c0d86b640fea (diff) | |
Explicitly print type in PythonMethodRunner
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/zwobble/couscous/tests/backends/python/PythonMethodRunner.java | 48 |
1 files changed, 24 insertions, 24 deletions
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 dd3b101..572d0b9 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 @@ -3,6 +3,7 @@ package org.zwobble.couscous.tests.backends.python; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.io.CharStreams; +import org.hamcrest.Matchers; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.MethodSignature; import org.zwobble.couscous.ast.TypeName; @@ -11,8 +12,6 @@ import org.zwobble.couscous.backends.python.PythonCodeGenerator; import org.zwobble.couscous.backends.python.PythonSerializer; import org.zwobble.couscous.tests.MethodRunner; import org.zwobble.couscous.values.PrimitiveValue; -import org.zwobble.couscous.values.PrimitiveValues; -import org.zwobble.couscous.values.StringValue; import java.io.IOException; import java.io.InputStream; @@ -20,12 +19,12 @@ import java.io.InputStreamReader; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static java.lang.Integer.parseInt; +import static org.hamcrest.MatcherAssert.assertThat; import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively; import static org.zwobble.couscous.util.ExtraLists.eagerMap; +import static org.zwobble.couscous.values.PrimitiveValues.UNIT; import static org.zwobble.couscous.values.PrimitiveValues.value; public class PythonMethodRunner implements MethodRunner { @@ -57,7 +56,8 @@ public class PythonMethodRunner implements MethodRunner { methodName, eagerMap(arguments, argument -> argument.getType()))); String program = "from couscous." + className.getQualifiedName() + " import " + className.getSimpleName() + ";" + - "print(repr(" + className.getSimpleName() + "." + pythonMethodName + "(" + argumentsString + ")))"; + "value = " + className.getSimpleName() + "." + pythonMethodName + "(" + argumentsString + ");" + + "print(type(value)); print(value)"; Process process = new ProcessBuilder("python3.4", "-c", program).directory(directoryPath.toFile()).start(); int exitCode = process.waitFor(); String output = readString(process.getInputStream()).trim(); @@ -69,27 +69,27 @@ public class PythonMethodRunner implements MethodRunner { } } - private static final Pattern TYPE_REGEX = Pattern.compile("^<class '([^']+)'>$"); + private static final String PACKAGE_PREFIX = "couscous."; private static PrimitiveValue readPrimitive(String output) { - Matcher matcher = TYPE_REGEX.matcher(output); - if (matcher.matches()) { - String name = matcher.group(1); - if (name.equals("couscous.java.lang.String.String")) { - return value(StringValue.REF); - } else { - throw new UnsupportedOperationException(); - } - } else if (output.equals("None")) { - return PrimitiveValues.UNIT; - } else if (output.startsWith("\'")) { - return value(output.substring(1, output.length() - 1)); - } else if (output.equals("True")) { - return value(true); - } else if (output.equals("False")) { - return value(false); - } else { - return value(parseInt(output)); + String[] lines = output.split("[\\r\\n]+"); + String type = lines[0]; + String value = lines[1]; + switch (type) { + case "<class 'int'>": + return value(parseInt(value)); + case "<class 'str'>": + return value(value); + case "<class 'bool'>": + return value(value.equals("True")); + case "<class 'NoneType'>": + return UNIT; + case "<class 'type'>": + String typeName = value.substring(value.indexOf("'") + 1, value.lastIndexOf("'")); + assertThat(typeName, Matchers.startsWith(PACKAGE_PREFIX)); + return value(TypeName.of(typeName.substring(PACKAGE_PREFIX.length(), typeName.lastIndexOf(".")))); + default: + throw new RuntimeException("Unhandled type: " + type); } } |
