| // Copyright 2015 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // Flags: --allow-natives-syntax | |
| (function TestBasics() { | |
| var a = [1, 2]; | |
| var b = [...a]; | |
| assertArrayEquals([1, 2], b) | |
| assertArrayEquals(['a', 'b', 'c', 'd', 'e', 'f'], | |
| ['a', ...'bc', 'd', ...'ef']) | |
| })(); | |
| var log = []; | |
| function* gen(n) { | |
| log.push(n, 1); | |
| yield 1; | |
| log.push(n, 2); | |
| yield 2; | |
| log.push(n, 3); | |
| yield 3; | |
| log.push(n, 'done'); | |
| } | |
| function id(v) { | |
| log.push(v); | |
| return v; | |
| } | |
| (function TestGenerator() { | |
| assertArrayEquals([1, 2, 3], [...gen('a')]); | |
| assertArrayEquals(['x', 1, 2, 3, 'y', 1, 2, 3, 'z'], | |
| ['x', ...gen('a'), 'y', ...gen('b'), 'z']); | |
| })(); | |
| (function TestOrderOfExecution() { | |
| log = []; | |
| assertArrayEquals(['x', 1, 2, 3, 'y', 1, 2, 3, 'z'], | |
| [id('x'), ...gen('a'), id('y'), ...gen('b'), id('z')]); | |
| assertArrayEquals([ | |
| 'x', 'a', 1, 'a', 2, 'a', 3, 'a', 'done', | |
| 'y', 'b', 1, 'b', 2, 'b', 3, 'b', 'done', | |
| 'z' | |
| ], log); | |
| })(); | |
| (function TestNotIterable() { | |
| var a; | |
| assertThrows(function() { | |
| a = [...42]; | |
| }, TypeError); | |
| assertSame(undefined, a); | |
| })(); | |
| (function TestInvalidIterator() { | |
| var iter = { | |
| [Symbol.iterator]: 42 | |
| }; | |
| var a; | |
| assertThrows(function() { | |
| a = [...iter]; | |
| }, TypeError); | |
| assertSame(undefined, a); | |
| })(); | |
| (function TestIteratorNotAnObject() { | |
| var iter = { | |
| [Symbol.iterator]() { | |
| return 42; | |
| } | |
| }; | |
| var a; | |
| assertThrows(function() { | |
| a = [...iter]; | |
| }, TypeError); | |
| assertSame(undefined, a); | |
| })(); | |
| (function TestIteratorNoNext() { | |
| var iter = { | |
| [Symbol.iterator]() { | |
| return {}; | |
| } | |
| }; | |
| var a; | |
| assertThrows(function() { | |
| a = [...iter]; | |
| }, TypeError); | |
| assertSame(undefined, a); | |
| })(); | |
| (function TestIteratorResultDoneThrows() { | |
| function MyError() {} | |
| var iter = { | |
| [Symbol.iterator]() { | |
| return { | |
| next() { | |
| return { | |
| get done() { | |
| throw new MyError(); | |
| } | |
| } | |
| } | |
| }; | |
| } | |
| }; | |
| var a; | |
| assertThrows(function() { | |
| a = [...iter]; | |
| }, MyError); | |
| assertSame(undefined, a); | |
| })(); | |
| (function TestIteratorResultValueThrows() { | |
| function MyError() {} | |
| var iter = { | |
| [Symbol.iterator]() { | |
| return { | |
| next() { | |
| return { | |
| done: false, | |
| get value() { | |
| throw new MyError(); | |
| } | |
| } | |
| } | |
| }; | |
| } | |
| }; | |
| var a; | |
| assertThrows(function() { | |
| a = [...iter]; | |
| }, MyError); | |
| assertSame(undefined, a); | |
| })(); | |
| (function TestOptimize() { | |
| function f() { | |
| return [...'abc']; | |
| } | |
| assertArrayEquals(['a', 'b', 'c'], f()); | |
| %OptimizeFunctionOnNextCall(f); | |
| assertArrayEquals(['a', 'b', 'c'], f()); | |
| })(); | |
| (function TestDeoptimize() { | |
| var iter = { | |
| [Symbol.iterator]() { | |
| var i = 0; | |
| return { | |
| next() { | |
| $DeoptimizeFunction(f); | |
| return {value: ++i, done: i === 3}; | |
| } | |
| }; | |
| } | |
| }; | |
| function f() { | |
| return [0, ...iter]; | |
| } | |
| assertArrayEquals([0, 1, 2], f()); | |
| }); |