function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`bad value: ${String(actual)}`); } function shouldThrow(func, errorMessage) { var errorThrown = false; var error = null; try { func(); } catch (e) { errorThrown = true; error = e; } if (!errorThrown) throw new Error("not thrown"); if (String(error) !== errorMessage) throw new Error(`bad error: ${String(error)}`); } (function () { function * generator() { yield * (function * () { try { yield "foo"; } catch(e) { return; } }()); // OK, continue executing. yield "bar"; } var iter = generator(); iter.next(); shouldBe(iter["throw"]().value, "bar"); }()); (function () { function * generator() { yield * (function * () { try { yield "foo"; } catch (e) { throw e; } }()); // OK, continue executing. yield "bar"; } var iter = generator(); iter.next(); shouldThrow(() => { iter["throw"](new Error("NG")); }, `Error: NG`); }()); (function () { function * generator() { yield * (function * () { try { yield "foo"; } catch (e) { } yield "cocoa"; }()); // OK, continue executing. yield "bar"; } var iter = generator(); iter.next(); shouldBe(iter["throw"]().value, "cocoa"); shouldBe(iter.next().value, "bar"); }());