// Reviewed /** #### ch Error: bad error thrown: Error: Terminate iteration. */ // This test checks the behavior of custom iterable objects. var returnCalled = false; var iter = { __key: 0, next: function () { return { done: this.__key === 42, value: this.__key++ }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; } }; var expected = 0; for (var value of iter) { if (value !== expected++) throw "Error: bad value: " + value; } if (returnCalled) throw "Error: return is called."; var returnCalled = false; var iter = { __key: 0, next: function () { return { done: this.__key === 42, value: this.__key++ }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; return { done: true, value: undefined }; } }; try { for (var value of iter) { throw "Error: Terminate iteration."; } } catch (e) { if (String(e) !== "Error: Terminate iteration.") throw "Error: bad error thrown: " + e; } if (!returnCalled) throw "Error: return is not called."; var returnCalled = false; var iter = { __key: 0, next: function () { return { done: this.__key === 42, value: this.__key++ }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; return { done: true, value: undefined }; } }; for (var value of iter) { break; } if (!returnCalled) throw "Error: return is not called."; var returnCalled = false; var iter = { __key: 0, get next() { throw "Error: looking up next."; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; } }; try { for (var value of iter) { throw "Error: Iteration should not occur."; } } catch (e) { if (String(e) !== "Error: looking up next.") throw "Error: bad error thrown: " + e; } if (returnCalled) throw "Error: return is called."; var iter = { __key: 0, next: function () { return { done: this.__key === 42, value: this.__key++ }; }, [Symbol.iterator]: function () { return this; }, get return() { throw "Error: looking up return." } }; try { for (var value of iter) { throw "Error: Terminate iteration."; } } catch (e) { if (String(e) !== "Error: looking up return.") throw "Error: bad error thrown: " + e; } var returnCalled = false; var iter = { __key: 0, next: function () { throw "Error: next is called." }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; return { done: true, value: undefined }; } }; try { for (var value of iter) { throw "Error: Terminate iteration."; } } catch (e) { if (String(e) !== "Error: next is called.") throw "Error: bad error thrown: " + e; } if (returnCalled) throw "Error: return is called."; var returnCalled = false; var iter = { __key: 0, next: function () { return { done: false, value: 42 }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; throw "Error: return is called."; } }; try { for (var value of iter) { throw "Error: Terminate iteration."; } } catch (e) { if (String(e) !== "Error: Terminate iteration.") throw "Error: bad error thrown: " + e; } if (!returnCalled) throw "Error: return is not called."; var returnCalled = false; var iter = { __key: 0, next: function () { return { done: false, value: 42 }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; throw "Error: return is called."; } }; try { for (var value of iter) { break; } } catch (e) { if (String(e) !== "Error: return is called.") throw "Error: bad error thrown: " + e; } if (!returnCalled) throw "Error: return is not called."; var primitives = [ undefined, null, 42, "string", true, Symbol("Cocoa") ]; function iteratorInterfaceErrorTest(notIteratorResult) { var returnCalled = false; var iter = { __key: 0, next: function () { return notIteratorResult; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; return undefined; } }; try { for (var value of iter) { throw "Error: Iteration should not occur."; } } catch (e) { if (String(e) !== "TypeError: Iterator result interface is not an object.") throw "Error: bad error thrown: " + e; } if (returnCalled) throw "Error: return is called."; } function iteratorInterfaceErrorTestReturn(notIteratorResult) { var returnCalled = false; var iter = { __key: 0, next: function () { return { done: false, value: 42 }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; return notIteratorResult; } }; try { for (var value of iter) { throw "Error: Terminate iteration."; } } catch (e) { if (String(e) !== "Error: Terminate iteration.") throw "Error: bad error thrown: " + e; } if (!returnCalled) throw "Error: return is not called."; } primitives.forEach(iteratorInterfaceErrorTest); primitives.forEach(iteratorInterfaceErrorTestReturn); function iteratorInterfaceBreakTestReturn(notIteratorResult) { var returnCalled = false; var iter = { __key: 0, next: function () { return { done: false, value: 42 }; }, [Symbol.iterator]: function () { return this; }, return: function () { returnCalled = true; return notIteratorResult; } }; try { for (var value of iter) { break; } } catch (e) { if (String(e) !== "TypeError: Iterator result interface is not an object.") throw "Error: bad error thrown: " + e; } if (!returnCalled) throw "Error: return is not called."; } primitives.forEach(iteratorInterfaceBreakTestReturn);