OLD | NEW |
| (Empty) |
1 // Copyright 2015 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --harmony-spread-arrays --allow-natives-syntax | |
6 | |
7 (function TestBasics() { | |
8 var a = [1, 2]; | |
9 var b = [...a]; | |
10 assertArrayEquals([1, 2], b) | |
11 | |
12 assertArrayEquals(['a', 'b', 'c', 'd', 'e', 'f'], | |
13 ['a', ...'bc', 'd', ...'ef']) | |
14 })(); | |
15 | |
16 | |
17 var log = []; | |
18 | |
19 function* gen(n) { | |
20 log.push(n, 1); | |
21 yield 1; | |
22 log.push(n, 2); | |
23 yield 2; | |
24 log.push(n, 3); | |
25 yield 3; | |
26 log.push(n, 'done'); | |
27 } | |
28 | |
29 function id(v) { | |
30 log.push(v); | |
31 return v; | |
32 } | |
33 | |
34 | |
35 (function TestGenerator() { | |
36 assertArrayEquals([1, 2, 3], [...gen('a')]); | |
37 assertArrayEquals(['x', 1, 2, 3, 'y', 1, 2, 3, 'z'], | |
38 ['x', ...gen('a'), 'y', ...gen('b'), 'z']); | |
39 })(); | |
40 | |
41 | |
42 (function TestOrderOfExecution() { | |
43 log = []; | |
44 assertArrayEquals(['x', 1, 2, 3, 'y', 1, 2, 3, 'z'], | |
45 [id('x'), ...gen('a'), id('y'), ...gen('b'), id('z')]); | |
46 assertArrayEquals([ | |
47 'x', 'a', 1, 'a', 2, 'a', 3, 'a', 'done', | |
48 'y', 'b', 1, 'b', 2, 'b', 3, 'b', 'done', | |
49 'z' | |
50 ], log); | |
51 })(); | |
52 | |
53 | |
54 (function TestNotIterable() { | |
55 var a; | |
56 assertThrows(function() { | |
57 a = [...42]; | |
58 }, TypeError); | |
59 assertSame(undefined, a); | |
60 | |
61 | |
62 })(); | |
63 | |
64 | |
65 (function TestInvalidIterator() { | |
66 var iter = { | |
67 [Symbol.iterator]: 42 | |
68 }; | |
69 var a; | |
70 assertThrows(function() { | |
71 a = [...iter]; | |
72 }, TypeError); | |
73 assertSame(undefined, a); | |
74 })(); | |
75 | |
76 | |
77 (function TestIteratorNotAnObject() { | |
78 var iter = { | |
79 [Symbol.iterator]() { | |
80 return 42; | |
81 } | |
82 }; | |
83 var a; | |
84 assertThrows(function() { | |
85 a = [...iter]; | |
86 }, TypeError); | |
87 assertSame(undefined, a); | |
88 })(); | |
89 | |
90 | |
91 (function TestIteratorNoNext() { | |
92 var iter = { | |
93 [Symbol.iterator]() { | |
94 return {}; | |
95 } | |
96 }; | |
97 var a; | |
98 assertThrows(function() { | |
99 a = [...iter]; | |
100 }, TypeError); | |
101 assertSame(undefined, a); | |
102 })(); | |
103 | |
104 | |
105 (function TestIteratorResultDoneThrows() { | |
106 function MyError() {} | |
107 var iter = { | |
108 [Symbol.iterator]() { | |
109 return { | |
110 next() { | |
111 return { | |
112 get done() { | |
113 throw new MyError(); | |
114 } | |
115 } | |
116 } | |
117 }; | |
118 } | |
119 }; | |
120 var a; | |
121 assertThrows(function() { | |
122 a = [...iter]; | |
123 }, MyError); | |
124 assertSame(undefined, a); | |
125 })(); | |
126 | |
127 | |
128 (function TestIteratorResultValueThrows() { | |
129 function MyError() {} | |
130 var iter = { | |
131 [Symbol.iterator]() { | |
132 return { | |
133 next() { | |
134 return { | |
135 done: false, | |
136 get value() { | |
137 throw new MyError(); | |
138 } | |
139 } | |
140 } | |
141 }; | |
142 } | |
143 }; | |
144 var a; | |
145 assertThrows(function() { | |
146 a = [...iter]; | |
147 }, MyError); | |
148 assertSame(undefined, a); | |
149 })(); | |
150 | |
151 | |
152 (function TestOptimize() { | |
153 function f() { | |
154 return [...'abc']; | |
155 } | |
156 assertArrayEquals(['a', 'b', 'c'], f()); | |
157 %OptimizeFunctionOnNextCall(f); | |
158 assertArrayEquals(['a', 'b', 'c'], f()); | |
159 })(); | |
160 | |
161 | |
162 (function TestDeoptimize() { | |
163 var iter = { | |
164 [Symbol.iterator]() { | |
165 var i = 0; | |
166 return { | |
167 next() { | |
168 $DeoptimizeFunction(f); | |
169 return {value: ++i, done: i === 3}; | |
170 } | |
171 }; | |
172 } | |
173 }; | |
174 function f() { | |
175 return [0, ...iter]; | |
176 } | |
177 | |
178 assertArrayEquals([0, 1, 2], f()); | |
179 }); | |
OLD | NEW |