| function shouldBe(actual, expected) { |
| if (actual !== expected) |
| throw new Error('bad value: ' + 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)}`); |
| } |
| |
| class CallGuard { |
| constructor() |
| { |
| this.called = false; |
| } |
| |
| call() |
| { |
| this.called = true; |
| } |
| } |
| |
| (function () { |
| let guard = new CallGuard(); |
| try { |
| throw { value: 42, done: false }; |
| } catch ({ value, done }) { |
| shouldBe(value, 42); |
| shouldBe(done, false); |
| guard.call(); |
| } |
| shouldBe(guard.called, true); |
| }()); |
| |
| (function () { |
| let guard = new CallGuard(); |
| try { |
| throw { value: 42, done: false }; |
| } catch ({ value: v, done: d }) { |
| shouldBe(v, 42); |
| shouldBe(d, false); |
| guard.call(); |
| } |
| shouldBe(guard.called, true); |
| // lexical |
| shouldBe(typeof v, "undefined"); |
| shouldBe(typeof d, "undefined"); |
| }()); |
| |
| shouldThrow(function () { |
| try { |
| throw { get error() { throw new Error("OK"); } }; |
| } catch ({ error }) { |
| } |
| }, `Error: OK`); |
| |
| let guard = new CallGuard(); |
| shouldThrow(function () { |
| try { |
| throw { get error() { throw new Error("OK"); } }; |
| } catch ({ error }) { |
| } finally { |
| guard.call(); |
| } |
| }, `Error: OK`); |
| shouldBe(guard.called, true); |
| |
| (function initialize() { |
| let guard = new CallGuard(); |
| try { |
| throw { value: 42, done: false }; |
| } catch ({ value, done, hello = 44 }) { |
| shouldBe(value, 42); |
| shouldBe(done, false); |
| shouldBe(hello, 44); |
| guard.call(); |
| } |
| shouldBe(guard.called, true); |
| }()); |
| |
| (function array() { |
| let guard = new CallGuard(); |
| try { |
| throw [0, 1, 2, 3, 4, 5]; |
| } catch ([ a, b, c, ...d ]) { |
| shouldBe(a, 0); |
| shouldBe(b, 1); |
| shouldBe(c, 2); |
| shouldBe(JSON.stringify(d), `[3,4,5]`); |
| guard.call(); |
| } |
| shouldBe(guard.called, true); |
| }()); |
| |
| (function generator() { |
| function *gen(v) { |
| try { |
| throw v; |
| } catch ({ value = yield 42 }) { |
| yield value; |
| } |
| } |
| |
| { |
| let g = gen({}); |
| { |
| let { value, done } = g.next(); |
| shouldBe(value, 42); |
| shouldBe(done, false); |
| } |
| { |
| let { value, done } = g.next("OK"); |
| shouldBe(value, "OK"); |
| shouldBe(done, false); |
| } |
| { |
| let { value, done } = g.next("OK"); |
| shouldBe(value, undefined); |
| shouldBe(done, true); |
| } |
| } |
| |
| { |
| let g = gen({value: 400}); |
| { |
| let { value, done } = g.next(); |
| shouldBe(value, 400); |
| shouldBe(done, false); |
| } |
| { |
| let { value, done } = g.next("OK"); |
| shouldBe(value, undefined); |
| shouldBe(done, true); |
| } |
| } |
| }()); |