| load(libdir + "asserts.js"); |
| load(libdir + "iteration.js"); |
| load(libdir + "eqArrayHelper.js"); |
| |
| assertEqArray([...[1, 2, 3]], [1, 2, 3]); |
| assertEqArray([1, ...[2, 3, 4], 5], [1, 2, 3, 4, 5]); |
| assertEqArray([1, ...[], 2], [1, 2]); |
| assertEqArray([1, ...[2, 3], 4, ...[5, 6]], [1, 2, 3, 4, 5, 6]); |
| assertEqArray([1, ...[], 2], [1, 2]); |
| assertEqArray([1,, ...[2]], [1,, 2]); |
| assertEqArray([1,, ...[2],, 3,, 4,], [1,, 2,, 3,, 4,]); |
| assertEqArray([...[1, 2, 3],,,,], [1, 2, 3,,,,]); |
| assertEqArray([,,...[1, 2, 3],,,,], [,,1,2,3,,,,]); |
| assertEqArray([...[1, 2, 3],,,,...[]], [1,2,3,,,,]); |
| |
| assertEqArray([...[undefined]], [undefined]); |
| |
| // other iterable objects |
| assertEqArray([...new Int32Array([1, 2, 3])], [1, 2, 3]); |
| assertEqArray([..."abc"], ["a", "b", "c"]); |
| assertEqArray([...[1, 2, 3][Symbol.iterator]()], [1, 2, 3]); |
| assertEqArray([...new Set([1, 2, 3])], [1, 2, 3]); |
| assertEqArray([...new Map([["a", "A"], ["b", "B"], ["c", "C"]])].map(([k, v]) => k + v), ["aA", "bB", "cC"]); |
| let itr = {}; |
| itr[Symbol.iterator] = function () { |
| return { |
| i: 1, |
| next: function() { |
| if (this.i < 4) |
| return { value: this.i++, done: false }; |
| else |
| return { value: undefined, done: true }; |
| } |
| }; |
| } |
| assertEqArray([...itr], [1, 2, 3]); |
| function* gen() { |
| for (let i = 1; i < 4; i ++) |
| yield i; |
| } |
| assertEqArray([...gen()], [1, 2, 3]); |
| |
| let a, b = [1, 2, 3]; |
| assertEqArray([...a=b], [1, 2, 3]); |
| |
| // 12.2.4.1.2 Runtime Semantics: ArrayAccumulation |
| // If Type(spreadObj) is not Object, then throw a TypeError exception. |
| assertThrowsInstanceOf(() => [...null], TypeError); |
| assertThrowsInstanceOf(() => [...undefined], TypeError); |
| |