OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --ignition-generators --harmony-do-expressions | |
6 | |
7 | |
rmcilroy
2016/04/15 13:17:47
Great tests. Could you also add a couple of simple
neis
2016/04/18 08:04:17
Acknowledged.
| |
8 { | |
9 function* foo() { } | |
10 let g = foo(); | |
11 assertEquals({value: undefined, done: true}, g.next()); | |
12 assertEquals({value: undefined, done: true}, g.next()); | |
13 } | |
14 | |
15 { | |
16 function* foo() { throw 666; return 42} | |
17 let g = foo(); | |
18 assertThrowsEquals(() => g.next(), 666); | |
19 assertEquals({value: undefined, done: true}, g.next()); | |
20 } | |
21 | |
22 { | |
23 function* foo(a) { return a; } | |
24 let g = foo(42); | |
25 assertEquals({value: 42, done: true}, g.next()); | |
26 assertEquals({value: undefined, done: true}, g.next()); | |
27 } | |
28 | |
29 { | |
30 function* foo(a) { a.iwashere = true; return a; } | |
31 let x = {}; | |
32 let g = foo(x); | |
33 assertEquals({value: {iwashere: true}, done: true}, g.next()); | |
34 assertEquals({value: undefined, done: true}, g.next()); | |
35 } | |
36 | |
37 { | |
38 let a = 42; | |
39 function* foo() { return a; } | |
40 let g = foo(); | |
41 assertEquals({value: 42, done: true}, g.next()); | |
42 assertEquals({value: undefined, done: true}, g.next()); | |
43 } | |
44 | |
45 { | |
46 let a = 40; | |
47 function* foo(b) { return a + b; } | |
48 let g = foo(2); | |
49 assertEquals({value: 42, done: true}, g.next()); | |
50 assertEquals({value: undefined, done: true}, g.next()); | |
51 } | |
52 | |
53 { | |
54 let a = 40; | |
55 function* foo(b) { a--; b++; return a + b; } | |
56 let g = foo(2); | |
57 assertEquals({value: 42, done: true}, g.next()); | |
58 assertEquals({value: undefined, done: true}, g.next()); | |
59 } | |
60 | |
61 { | |
62 let g; | |
63 function* foo() { g.next() } | |
64 g = foo(); | |
65 assertThrows(() => g.next(), TypeError); | |
66 assertEquals({value: undefined, done: true}, g.next()); | |
67 } | |
68 | |
69 { | |
70 function* foo() { yield 2; yield 3; yield 4 } | |
71 g = foo(); | |
72 assertEquals({value: 2, done: false}, g.next()); | |
73 assertEquals({value: 3, done: false}, g.next()); | |
74 assertEquals({value: 4, done: false}, g.next()); | |
75 assertEquals({value: undefined, done: true}, g.next()); | |
76 assertEquals({value: undefined, done: true}, g.next()); | |
77 } | |
78 | |
79 { | |
80 function* foo() { yield 2; if (true) { yield 3 }; yield 4 } | |
81 g = foo(); | |
82 assertEquals({value: 2, done: false}, g.next()); | |
83 assertEquals({value: 3, done: false}, g.next()); | |
84 assertEquals({value: 4, done: false}, g.next()); | |
85 assertEquals({value: undefined, done: true}, g.next()); | |
86 assertEquals({value: undefined, done: true}, g.next()); | |
87 } | |
88 | |
89 { | |
90 function* foo() { yield 2; if (true) { yield 3; yield 4 } } | |
91 g = foo(); | |
92 assertEquals({value: 2, done: false}, g.next()); | |
93 assertEquals({value: 3, done: false}, g.next()); | |
94 assertEquals({value: 4, done: false}, g.next()); | |
95 assertEquals({value: undefined, done: true}, g.next()); | |
96 assertEquals({value: undefined, done: true}, g.next()); | |
97 } | |
98 | |
99 { | |
100 function* foo() { yield 2; if (false) { yield 3 }; yield 4 } | |
101 g = foo(); | |
102 assertEquals({value: 2, done: false}, g.next()); | |
103 assertEquals({value: 4, done: false}, g.next()); | |
104 assertEquals({value: undefined, done: true}, g.next()); | |
105 assertEquals({value: undefined, done: true}, g.next()); | |
106 } | |
107 | |
108 { | |
109 function* foo() { yield 2; while (true) { yield 3 }; yield 4 } | |
110 g = foo(); | |
111 assertEquals({value: 2, done: false}, g.next()); | |
112 assertEquals({value: 3, done: false}, g.next()); | |
113 assertEquals({value: 3, done: false}, g.next()); | |
114 assertEquals({value: 3, done: false}, g.next()); | |
115 assertEquals({value: 3, done: false}, g.next()); | |
116 } | |
117 | |
118 { | |
119 function* foo() { yield 2; (yield 3) + 42; yield 4 } | |
120 g = foo(); | |
121 assertEquals({value: 2, done: false}, g.next()); | |
122 assertEquals({value: 3, done: false}, g.next()); | |
123 assertEquals({value: 4, done: false}, g.next()); | |
124 } | |
125 | |
126 { | |
127 function* foo() { yield 2; (do {yield 3}) + 42; yield 4 } | |
128 g = foo(); | |
129 assertEquals({value: 2, done: false}, g.next()); | |
130 assertEquals({value: 3, done: false}, g.next()); | |
131 assertEquals({value: 4, done: false}, g.next()); | |
132 } | |
133 | |
134 { | |
135 function* foo() { yield 2; return (yield 3) + 42; yield 4 } | |
136 g = foo(); | |
137 assertEquals({value: 2, done: false}, g.next()); | |
138 assertEquals({value: 3, done: false}, g.next()); | |
139 assertEquals({value: 42, done: true}, g.next(0)); | |
140 assertEquals({value: undefined, done: true}, g.next()); | |
141 } | |
142 | |
143 { | |
144 let x = 42; | |
145 function* foo() { | |
146 yield x; | |
147 for (let x in {a: 1, b: 2}) { | |
148 let i = 2; | |
149 yield x; | |
150 yield i; | |
151 do { | |
152 yield i; | |
153 } while (i-- > 0); | |
154 } | |
155 yield x; | |
156 return 5; | |
157 } | |
158 g = foo(); | |
159 assertEquals({value: 42, done: false}, g.next()); | |
160 assertEquals({value: 'a', done: false}, g.next()); | |
161 assertEquals({value: 2, done: false}, g.next()); | |
162 assertEquals({value: 2, done: false}, g.next()); | |
163 assertEquals({value: 1, done: false}, g.next()); | |
164 assertEquals({value: 0, done: false}, g.next()); | |
165 assertEquals({value: 'b', done: false}, g.next()); | |
166 assertEquals({value: 2, done: false}, g.next()); | |
167 assertEquals({value: 2, done: false}, g.next()); | |
168 assertEquals({value: 1, done: false}, g.next()); | |
169 assertEquals({value: 0, done: false}, g.next()); | |
170 assertEquals({value: 42, done: false}, g.next()); | |
171 assertEquals({value: 5, done: true}, g.next()); | |
172 } | |
173 | |
174 { | |
175 let a = 3; | |
176 function* foo() { | |
177 let b = 4; | |
178 yield 1; | |
179 { let c = 5; yield 2; yield a; yield b; yield c; } | |
180 } | |
181 g = foo(); | |
182 assertEquals({value: 1, done: false}, g.next()); | |
183 assertEquals({value: 2, done: false}, g.next()); | |
184 assertEquals({value: 3, done: false}, g.next()); | |
185 assertEquals({value: 4, done: false}, g.next()); | |
186 assertEquals({value: 5, done: false}, g.next()); | |
187 assertEquals({value: undefined, done: true}, g.next()); | |
188 } | |
189 | |
190 { | |
191 function* foo() { | |
192 yield 42; | |
193 yield 42; | |
194 yield 42; | |
195 yield 42; | |
196 yield 42; | |
197 yield 42; | |
198 yield 42; | |
199 yield 42; | |
200 yield 42; | |
201 yield 42; | |
202 yield 42; | |
203 yield 42; | |
204 yield 42; | |
205 yield 42; | |
206 yield 42; | |
207 yield 42; | |
208 yield 42; | |
209 yield 42; | |
210 yield 42; | |
211 yield 42; | |
212 yield 42; | |
213 yield 42; | |
214 yield 42; | |
215 yield 42; | |
216 yield 42; | |
217 yield 42; | |
218 yield 42; | |
219 yield 42; | |
220 yield 42; | |
221 yield 42; | |
222 yield 42; | |
223 yield 42; | |
224 yield 42; | |
225 yield 42; | |
226 yield 42; | |
227 yield 42; | |
228 yield 42; | |
229 yield 42; | |
230 yield 42; | |
231 yield 42; | |
232 yield 42; | |
233 yield 42; | |
234 yield 42; | |
235 yield 42; | |
236 yield 42; | |
237 yield 42; | |
238 yield 42; | |
239 yield 42; | |
240 yield 42; | |
241 yield 42; | |
242 yield 42; | |
243 yield 42; | |
244 yield 42; | |
245 yield 42; | |
246 yield 42; | |
247 yield 42; | |
248 yield 42; | |
249 yield 42; | |
250 yield 42; | |
251 yield 42; | |
252 yield 42; | |
253 yield 42; | |
254 yield 42; | |
255 yield 42; | |
256 yield 42; | |
257 yield 42; | |
258 yield 42; | |
259 yield 42; | |
260 yield 42; | |
261 yield 42; | |
262 yield 42; | |
263 yield 42; | |
264 yield 42; | |
265 yield 42; | |
266 yield 42; | |
267 yield 42; | |
268 yield 42; | |
269 yield 42; | |
270 yield 42; | |
271 yield 42; | |
272 yield 42; | |
273 yield 42; | |
274 yield 42; | |
275 yield 42; | |
276 yield 42; | |
277 yield 42; | |
278 yield 42; | |
279 yield 42; | |
280 yield 42; | |
281 yield 42; | |
282 yield 42; | |
283 yield 42; | |
284 yield 42; | |
285 yield 42; | |
286 yield 42; | |
287 yield 42; | |
288 yield 42; | |
289 yield 42; | |
290 yield 42; | |
291 yield 42; | |
292 } | |
293 g = foo(); | |
294 for (let i = 0; i < 100; ++i) { | |
295 assertEquals({value: 42, done: false}, g.next()); | |
296 } | |
297 assertEquals({value: undefined, done: true}, g.next()); | |
298 } | |
299 | |
300 | |
301 | |
302 // The rest is copied 1:1 from harmony/generators.js. | |
Michael Starzinger
2016/04/15 14:13:47
suggestion: Instead of duplicating these tests her
neis
2016/04/18 08:04:17
Fine with me. I removed the implication between -
| |
303 | |
304 | |
5 | 305 |
6 { // yield in try-catch | 306 { // yield in try-catch |
7 | 307 |
8 let g = function*() { | 308 let g = function*() { |
9 try {yield 1} catch (error) {assertEquals("caught", error)} | 309 try {yield 1} catch (error) {assertEquals("caught", error)} |
10 }; | 310 }; |
11 | 311 |
12 assertThrowsEquals(() => g().throw("not caught"), "not caught"); | 312 assertThrowsEquals(() => g().throw("not caught"), "not caught"); |
13 | 313 |
14 { | 314 { |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
263 return yield* inner(); | 563 return yield* inner(); |
264 } | 564 } |
265 | 565 |
266 { | 566 { |
267 let x = g(); | 567 let x = g(); |
268 assertEquals({value: 1, done: false}, x.next()); | 568 assertEquals({value: 1, done: false}, x.next()); |
269 assertEquals({value: 2, done: false}, x.next()); | 569 assertEquals({value: 2, done: false}, x.next()); |
270 assertEquals({value: 42, done: true}, x.return(42)); | 570 assertEquals({value: 42, done: true}, x.return(42)); |
271 } | 571 } |
272 } | 572 } |
OLD | NEW |