function assertThrowsMsg(f, msg) { try { f(); assertEq(0, 1); } catch(e) { assertEq(e instanceof TypeError, true); assertEq(e.message, msg); } } // For-of function testForOf(val) { for (var x of val) {} } for (v of [{}, Math, new Proxy({}, {})]) { assertThrowsMsg(() => testForOf(v), "val is not iterable"); } assertThrowsMsg(() => testForOf(null), "val is null"); assertThrowsMsg(() => { for (var x of () => 1) {}}, "() => 1 is not iterable"); // Destructuring function testDestr(val) { var [a, b] = val; } for (v of [{}, Math, new Proxy({}, {})]) { assertThrowsMsg(() => testDestr(v), "val is not iterable"); } assertThrowsMsg(() => testDestr(null), "val is null"); assertThrowsMsg(() => { [a, b] = () => 1; }, "() => 1 is not iterable"); // Spread function testSpread(val) { [...val]; } for (v of [{}, Math, new Proxy({}, {})]) { assertThrowsMsg(() => testSpread(v), "val is not iterable"); } assertThrowsMsg(() => testSpread(null), "val is null"); assertThrowsMsg(() => { [...() => 1]; }, "() => 1 is not iterable");