From 4b2d3ba3d0fb90961ddeb528a78773be837397dd Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Fri, 19 Dec 2014 03:57:52 +0300 Subject: [PATCH] JS backend: tests for KT-6401 JS: wrong result for code with many spread operator --- .../evaluationOrder/cases/callVarargs.kt | 10 ++++- .../expression/function/cases/vararg.kt | 38 +++++++++++++++++++ .../testData/native/cases/vararg.kt | 30 +++++++++++++++ .../testData/native/native/vararg.js | 25 ++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/js/js.translator/testData/expression/evaluationOrder/cases/callVarargs.kt b/js/js.translator/testData/expression/evaluationOrder/cases/callVarargs.kt index 7d04e5b123b..cbad748b4cc 100644 --- a/js/js.translator/testData/expression/evaluationOrder/cases/callVarargs.kt +++ b/js/js.translator/testData/expression/evaluationOrder/cases/callVarargs.kt @@ -2,15 +2,17 @@ package foo var global: String = "" -fun bar(s: String, value: Int): Int { +fun bar(s: String, value: T): T { global += s return value } -fun baz(vararg args: Int): String { +fun baz(vararg args: T): String { return "baz: ${args.size}" } +fun idVarArg(vararg a: T) = a + fun box(): String { baz(bar("A", 10), try { global += "B"; 20} finally {}) assertEquals("AB", global) @@ -19,5 +21,9 @@ fun box(): String { baz(bar("A", 10), 30, if (true) { while(false){}; global+= "B"; 20 } else { 50 }) assertEquals("AB", global) + global = "" + assertEquals("baz: 4", baz(bar("A", 1), *try {bar("B", array(2, 3))} catch(e: Exception) { bar("C", array(4, 5))}, bar("D", 6))) + assertEquals("ABD", global) + return "OK" } \ No newline at end of file diff --git a/js/js.translator/testData/expression/function/cases/vararg.kt b/js/js.translator/testData/expression/function/cases/vararg.kt index e5fa1db2bcc..67b527e98ab 100644 --- a/js/js.translator/testData/expression/function/cases/vararg.kt +++ b/js/js.translator/testData/expression/function/cases/vararg.kt @@ -34,6 +34,18 @@ fun spreadInObjectMethodCall(size: Int, sum: Int, vararg args: Int) = obj.test(s fun testVarargWithFunLit(vararg args: Int, f: (a: IntArray) -> Boolean): Boolean = f(args) +fun idVarArgs(vararg a: T) = a + +fun idArrayVarArg(vararg a: Array) = a + +fun sumFunValuesOnParameters(x: Int, y: Int, vararg a: Int, f: (Int) -> Int): Int { + var result = f(x) + f(y) + for(u in a) { + result += f(u) + } + return result +} + fun box(): String { if (!testSize(0)) return "wrong vararg size when call function without args" @@ -65,5 +77,31 @@ fun box(): String { if (!testVarargWithFunLit(1, 2, 3) { args -> args.size == 3 }) return "failed when call function with vararg and fun literal" + val a = array(1, 2, 3) + val b = array(4, 5) + + assertEquals(5, array(*a, *b).size) + assertEquals(8, array(10, *a, 20, *b, 30).size) + + assertEquals(5, idVarArgs(*a, *b).size) + assertEquals(8, idVarArgs(10, *a, 20, *b, 30).size) + + assertEquals(9, array(1, *a, *a, 1, 2).size) + assertEquals(9, idVarArgs(1, *a, *a, 1, 2).size) + + assertEquals(9, array(1, *a, *array(1, 2, 3), 1, 2).size) + assertEquals(9, idVarArgs(1, *a, *array(1, 2, 3), 1, 2).size) + + assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, 5, 6, 7, 8, 9) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7, 8, 9)) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, *intArray(5, 6, 7, 8, 9)) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7), 8, 9) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5), *intArray(6, 7, 8, 9)) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4), 5, 6, *intArray(7, 8, 9)) { 2*it }) + + assertEquals(2, idArrayVarArg(array(1), *array(array(2, 3, 4))).size()) + assertEquals(3, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6))).size()) + assertEquals(6, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6)), array(7), *array(array(8, 9), array(10, 11))).size()) + return "OK" } \ No newline at end of file diff --git a/js/js.translator/testData/native/cases/vararg.kt b/js/js.translator/testData/native/cases/vararg.kt index 28514bda4d0..602342ef44c 100644 --- a/js/js.translator/testData/native/cases/vararg.kt +++ b/js/js.translator/testData/native/cases/vararg.kt @@ -6,6 +6,9 @@ fun paramCount(vararg a: Int): Int = noImpl native("paramCount") fun anotherParamCount(vararg a: Int): Int = noImpl +native("paramCount") +fun genericParamCount(vararg a: T): Int = noImpl + // test spread operator fun count(vararg a: Int) = paramCount(*a) @@ -56,6 +59,15 @@ fun testCallOrder(vararg args: Int) = Bar(args.size, 0).test(1, 1, *args) && Bar(args.size, 2).test(3, 1, *args) && !Bar.hasOrderProblem +native +fun sumOfParameters(x: Int, y: Int, vararg a: Int): Int = noImpl + +native +fun sumFunValuesOnParameters(x: Int, y: Int, vararg a: Int, f: (Int) -> Int): Int = noImpl + +native +fun idArrayVarArg(vararg a: Array): Array = noImpl + fun box(): String { if (paramCount() != 0) return "failed when call native function without args" @@ -115,5 +127,23 @@ fun box(): String { if (!(baz!!)?.test(0, 1, 1)) return "failed when combined SureCall and SafeCall, maybe we lost cached expression" + val a = array(1, 2) + assertEquals(2, genericParamCount(*a)) + assertEquals(7, genericParamCount(1, *a, *a, 1, 2)) + + assertEquals(45, sumOfParameters(1, 2, 3, 4, 5, 6, 7, 8, 9)) + assertEquals(45, sumOfParameters(1, 2, *intArray(3, 4, 5, 6, 7, 8, 9))) + assertEquals(45, sumOfParameters(1, 2, 3, 4, *intArray(5, 6, 7, 8, 9))) + assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, 5, 6, 7, 8, 9) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7, 8, 9)) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, 3, 4, *intArray(5, 6, 7, 8, 9)) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5, 6, 7), 8, 9) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4, 5), *intArray(6, 7, 8, 9)) { 2*it }) + assertEquals(90, sumFunValuesOnParameters(1, 2, *intArray(3, 4), 5, 6, *intArray(7, 8, 9)) { 2*it }) + + assertEquals(2, idArrayVarArg(array(1), *array(array(2, 3, 4))).size()) + assertEquals(3, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6))).size()) + assertEquals(6, idArrayVarArg(array(1, 2), *array(array(3, 4), array(5, 6)), array(7), *array(array(8, 9), array(10, 11))).size()) + return "OK" } diff --git a/js/js.translator/testData/native/native/vararg.js b/js/js.translator/testData/native/native/vararg.js index 870db6e112d..2e7278c803f 100644 --- a/js/js.translator/testData/native/native/vararg.js +++ b/js/js.translator/testData/native/native/vararg.js @@ -41,4 +41,29 @@ function testNativeVarargWithFunLit(/* args, f */) { var args = Array.prototype.slice.call(arguments, 0, arguments.length - 1); var f = arguments[arguments.length - 1]; return typeof f === "function" && f(args); +} + +function sumOfParameters() { + var size = arguments.length; + var result = 0; + for (var i = 0; i < size; i++) { + result += arguments[i]; + } + return result; +} + +function sumFunValuesOnParameters() { + var size = arguments.length - 1; + var f = arguments[arguments.length - 1]; + var result = 0; + for (var i = 0; i < size; i++) { + var u = arguments[i]; + result += f(u); + } + return result; +} + +function idArrayVarArg() { + var args = Array.prototype.slice.call(arguments, 0, arguments.length); + return args; } \ No newline at end of file