[ES7] yield star should not return if the inner iterator.throw returns { done: true }
[WebKit-https.git] / Source / JavaScriptCore / tests / stress / yield-star-throw-continue.js
1 function shouldBe(actual, expected) {
2     if (actual !== expected)
3         throw new Error(`bad value: ${String(actual)}`);
4 }
5
6 function shouldThrow(func, errorMessage) {
7     var errorThrown = false;
8     var error = null;
9     try {
10         func();
11     } catch (e) {
12         errorThrown = true;
13         error = e;
14     }
15     if (!errorThrown)
16         throw new Error("not thrown");
17     if (String(error) !== errorMessage)
18         throw new Error(`bad error: ${String(error)}`);
19 }
20
21 (function () {
22     function * generator() {
23         yield * (function * () {
24             try {
25                 yield "foo";
26             } catch(e) {
27                 return;
28             }
29         }());
30         // OK, continue executing.
31         yield "bar";
32     }
33     var iter = generator();
34     iter.next();
35     shouldBe(iter["throw"]().value, "bar");
36 }());
37
38 (function () {
39     function * generator() {
40         yield * (function * () {
41             try {
42                 yield "foo";
43             } catch (e) {
44                 throw e;
45             }
46         }());
47         // OK, continue executing.
48         yield "bar";
49     }
50     var iter = generator();
51     iter.next();
52     shouldThrow(() => {
53         iter["throw"](new Error("NG"));
54     }, `Error: NG`);
55 }());
56
57 (function () {
58     function * generator() {
59         yield * (function * () {
60             try {
61                 yield "foo";
62             } catch (e) {
63             }
64             yield "cocoa";
65         }());
66         // OK, continue executing.
67         yield "bar";
68     }
69     var iter = generator();
70     iter.next();
71     shouldBe(iter["throw"]().value, "cocoa");
72     shouldBe(iter.next().value, "bar");
73 }());