JS backend: tests for KT-6401 JS: wrong result for code with many spread operator

This commit is contained in:
Michael Nedzelsky
2014-12-19 03:57:52 +03:00
parent bdefbc182a
commit 4b2d3ba3d0
4 changed files with 101 additions and 2 deletions
@@ -6,6 +6,9 @@ fun paramCount(vararg a: Int): Int = noImpl
native("paramCount")
fun anotherParamCount(vararg a: Int): Int = noImpl
native("paramCount")
fun genericParamCount<T>(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<T>(vararg a: Array<T>): Array<T> = 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"
}
@@ -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;
}