| function testFunction() { |
| if (arguments.length !== 10) |
| throw "wrong number of arguments expected 10 was " + arguments.length; |
| for (let i in arguments) { |
| if ((arguments[i] | 0) !== (i | 0)) |
| throw "argument " + i + " expected " + i + " was " + arguments[i]; |
| } |
| } |
| |
| function testEmpty() { |
| if (arguments.length !== 0) |
| throw "wrong length expected 0 was " + arguments.length; |
| } |
| |
| iter = Array.prototype.values; |
| |
| function makeObject(array, iterator) { |
| let obj = { [Symbol.iterator]: iterator, length: array.length }; |
| for (let i in array) |
| obj[i] = array[i]; |
| return obj; |
| } |
| |
| function otherIterator() { |
| return { |
| count: 6, |
| next: function() { |
| if (this.count < 10) |
| return { value: this.count++, done: false }; |
| return { done: true }; |
| } |
| }; |
| } |
| |
| count = 0; |
| function* totalIter() { |
| for (let i = count; i < count+5; i++) { |
| yield i; |
| } |
| count += 5; |
| } |
| |
| function throwingIter() { |
| return { |
| count: 0, |
| next: function() { |
| if (this.count < 10) |
| return { value: this.count++, done: false }; |
| throw new Error("this should have been caught"); |
| } |
| }; |
| } |
| |
| object1 = makeObject([1, 2, 3], iter); |
| object2 = makeObject([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], iter); |
| object3 = makeObject([], otherIterator); |
| object4 = makeObject([], totalIter); |
| objectThrow = makeObject([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], throwingIter); |
| |
| for (let i = 0; i < 3000; i++) { |
| count = 0; |
| testFunction(0, ...[1, 2, 3], ...[4], 5, 6, ...[7, 8, 9]); |
| testFunction(...[0, 1], 2, 3, ...[4, 5, 6, 7, 8], 9); |
| testFunction(...[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); |
| testFunction(0, ...object1, 4, 5, ...[6, 7, 8, 9]); |
| testFunction(...object2); |
| testFunction(0, ...object1, 4, 5, ...object3); |
| testFunction(0, ..."12345", ...object3); |
| testEmpty(...[]); |
| testFunction(...object4, ...object4); |
| testFunction.call(null, 0, ...[1, 2, 3], 4, 5, 6, 7, 8, 9); |
| testFunction.apply(null, [0, ...[1, 2, 3], 4, 5, 6, 7, 8, 9]) |
| let failed = false; |
| try { |
| testFunction(...objectThrow); |
| failed = true; |
| } catch (e) { |
| if (!e instanceof Error) |
| failed = true; |
| } |
| if (failed) |
| throw "did not throw an exeption even though it should have"; |
| } |