diff --git a/compiler/testData/codegen/script/helloWorld.ktscript b/compiler/testData/codegen/script/helloWorld.ktscript index 397eda10a7c..e6a15b33c53 100644 --- a/compiler/testData/codegen/script/helloWorld.ktscript +++ b/compiler/testData/codegen/script/helloWorld.ktscript @@ -1,2 +1,2 @@ -// expected: null +// expected: rv: null System.out!!.println("hello world") diff --git a/compiler/testData/codegen/script/parameter.ktscript b/compiler/testData/codegen/script/parameter.ktscript index 522525ce324..daada5e463f 100644 --- a/compiler/testData/codegen/script/parameter.ktscript +++ b/compiler/testData/codegen/script/parameter.ktscript @@ -1,4 +1,4 @@ -// expected: sky color is blue +// expected: rv: sky color is blue // param: what: jet.String: sky // param: color: jet.String: blue diff --git a/compiler/testData/codegen/script/parameterArray.ktscript b/compiler/testData/codegen/script/parameterArray.ktscript index 4d9c30789a1..6e180c33101 100644 --- a/compiler/testData/codegen/script/parameterArray.ktscript +++ b/compiler/testData/codegen/script/parameterArray.ktscript @@ -1,4 +1,4 @@ // param: args: jet.Array: three little words -// expected: little +// expected: rv: little args[1] diff --git a/compiler/testData/codegen/script/parameterLong.ktscript b/compiler/testData/codegen/script/parameterLong.ktscript index c94f7101f18..cf8805821f5 100644 --- a/compiler/testData/codegen/script/parameterLong.ktscript +++ b/compiler/testData/codegen/script/parameterLong.ktscript @@ -1,4 +1,4 @@ -// expected: 19 +// expected: rv: 19 // param: aa: jet.Long: 17 // param: bb: jet.Int: 2 diff --git a/compiler/testData/codegen/script/secondLevelFunction.ktscript b/compiler/testData/codegen/script/secondLevelFunction.ktscript index 56b56d2c00e..1fdee14fb8a 100644 --- a/compiler/testData/codegen/script/secondLevelFunction.ktscript +++ b/compiler/testData/codegen/script/secondLevelFunction.ktscript @@ -7,4 +7,4 @@ if (true) { x -// expected: 29 +// expected: rv: 29 diff --git a/compiler/testData/codegen/script/secondLevelFunctionClosure.ktscript b/compiler/testData/codegen/script/secondLevelFunctionClosure.ktscript index ff3f4170578..0e37d2eef5a 100644 --- a/compiler/testData/codegen/script/secondLevelFunctionClosure.ktscript +++ b/compiler/testData/codegen/script/secondLevelFunctionClosure.ktscript @@ -8,4 +8,4 @@ if (true) { x -// expected: 50 +// expected: rv: 50 diff --git a/compiler/testData/codegen/script/secondLevelVal.ktscript b/compiler/testData/codegen/script/secondLevelVal.ktscript new file mode 100644 index 00000000000..170ab0d7b6a --- /dev/null +++ b/compiler/testData/codegen/script/secondLevelVal.ktscript @@ -0,0 +1,8 @@ +if (true) { + val archenemy = "Jim Moriarty" +} + +true + +// expected: rv: true +// expected: archenemy: diff --git a/compiler/testData/codegen/script/string.ktscript b/compiler/testData/codegen/script/string.ktscript index 1715a79f1ca..24a71ebd814 100644 --- a/compiler/testData/codegen/script/string.ktscript +++ b/compiler/testData/codegen/script/string.ktscript @@ -1 +1,3 @@ "O" + "K" + +// expected: rv: OK diff --git a/compiler/testData/codegen/script/topLevelFunction.ktscript b/compiler/testData/codegen/script/topLevelFunction.ktscript index 0406e414fca..f36b8e8e906 100644 --- a/compiler/testData/codegen/script/topLevelFunction.ktscript +++ b/compiler/testData/codegen/script/topLevelFunction.ktscript @@ -1,4 +1,4 @@ -// expected: 3628800 +// expected: rv: 3628800 fun factorial(n: Int): Int { var product = 1 diff --git a/compiler/testData/codegen/script/topLevelFunctionClosure.ktscript b/compiler/testData/codegen/script/topLevelFunctionClosure.ktscript index 3a1b2a1f916..a3eebbda24d 100644 --- a/compiler/testData/codegen/script/topLevelFunctionClosure.ktscript +++ b/compiler/testData/codegen/script/topLevelFunctionClosure.ktscript @@ -4,4 +4,4 @@ fun foo(y: Int) = x + y foo(33) -// expected: 45 +// expected: rv: 45 diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index 4343c8a8991..9c7faf4f8a0 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.codegen; import com.google.common.base.Objects; import com.google.common.collect.Lists; +import com.intellij.openapi.util.Pair; import com.intellij.testFramework.UsefulTestCase; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -187,16 +188,35 @@ public abstract class CodegenTestCase extends UsefulTestCase { Constructor constructor = getConstructor(scriptClass, state.getScriptConstructorMethod()); Object scriptInstance = constructor.newInstance(myFile.getScriptParameterValues().toArray()); - Field field = scriptClass.getDeclaredField("rv"); - field.setAccessible(true); - Object result = field.get(scriptInstance); - r = result != null ? result.toString() : "null"; + + assertFalse("expecting at least one expectation", myFile.getExpectedValues().isEmpty()); + + for (Pair nameValue : myFile.getExpectedValues()) { + String fieldName = nameValue.first; + String expectedValue = nameValue.second; + + if (expectedValue.equals("")) { + try { + scriptClass.getDeclaredField(fieldName); + fail("must have no field " + fieldName); + } catch (NoSuchFieldException e) { + continue; + } + } + + Field field = scriptClass.getDeclaredField(fieldName); + field.setAccessible(true); + Object result = field.get(scriptInstance); + String resultString = result != null ? result.toString() : "null"; + assertEquals("comparing field " + fieldName, expectedValue, resultString); + } } else { String fqName = NamespaceCodegen.getJVMClassNameForKotlinNs(JetPsiUtil.getFQName(myFile.getPsiFile())).getFqName().getFqName(); Class namespaceClass = loader.loadClass(fqName); Method method = namespaceClass.getMethod("box"); r = (String) method.invoke(null); + assertEquals("OK", r); } } catch (NoClassDefFoundError e) { System.out.println(generateToText()); @@ -207,11 +227,6 @@ public abstract class CodegenTestCase extends UsefulTestCase { } finally { loader.dispose(); } - - if (!Objects.equal(myFile.getExpectedValue(), r)) { - System.out.println(generateToText()); - } - assertEquals(myFile.getExpectedValue(), r); } protected GeneratedClassLoader createClassLoader(ClassFileFactory codegens) { diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFile.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFile.java index 4c6f69e70e9..c77b450f3fc 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFile.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFile.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.codegen; import com.google.common.collect.Lists; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.lang.psi.JetFile; @@ -38,7 +39,7 @@ public class CodegenTestFile { @NotNull private final JetFile psiFile; @NotNull - private final String expectedValue; + private final List> expectedValues; @NotNull private final List scriptParameterTypes; @NotNull @@ -46,11 +47,11 @@ public class CodegenTestFile { private CodegenTestFile( @NotNull JetFile psiFile, - @NotNull String expectedValue, + @NotNull List> expectedValues, @NotNull List scriptParameterTypes, @NotNull List scriptParameterValues) { this.psiFile = psiFile; - this.expectedValue = expectedValue; + this.expectedValues = expectedValues; this.scriptParameterTypes = scriptParameterTypes; this.scriptParameterValues = scriptParameterValues; } @@ -61,8 +62,8 @@ public class CodegenTestFile { } @NotNull - public String getExpectedValue() { - return expectedValue; + public List> getExpectedValues() { + return expectedValues; } @NotNull @@ -79,8 +80,14 @@ public class CodegenTestFile { public static CodegenTestFile create(@NotNull String fileName, @NotNull String content, @NotNull Project project) { JetFile file = (JetFile) JetTestUtils.createFile(fileName, content, project); - Matcher matcher = Pattern.compile("// expected: (.*)").matcher(content); - String expectedValue = matcher.find() ? matcher.group(1) : "OK"; + List> expectedValues = Lists.newArrayList(); + + Matcher matcher = Pattern.compile("// expected: (\\S+): (.*)").matcher(content); + while (matcher.find()) { + String fieldName = matcher.group(1); + String expectedValue = matcher.group(2); + expectedValues.add(Pair.create(fieldName, expectedValue)); + } List scriptParameterTypes = Lists.newArrayList(); List scriptParameterValues = Lists.newArrayList(); @@ -116,6 +123,6 @@ public class CodegenTestFile { } } - return new CodegenTestFile(file, expectedValue, scriptParameterTypes, scriptParameterValues); + return new CodegenTestFile(file, expectedValues, scriptParameterTypes, scriptParameterValues); } } diff --git a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java index 377d24b5193..eeef681248d 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ScriptGenTest.java @@ -54,6 +54,10 @@ public class ScriptGenTest extends CodegenTestCase { blackBoxFile("script/secondLevelFunctionClosure.ktscript"); } + public void testSecondLevelVal() { + blackBoxFile("script/secondLevelVal.ktscript"); + } + public void testScriptParameter() { blackBoxFile("script/parameter.ktscript"); }