| // This test checks the behavior of the %ArrayIteratorPrototype%.next methods with call. |
| |
| var array = [0, 1, 2, 3, 4]; |
| var arrayIterator = array[Symbol.iterator](); |
| var arrayIteratorPrototype = arrayIterator.__proto__; |
| var arrayIteratorPrototypeNext = arrayIteratorPrototype.next; |
| |
| if (arrayIterator.hasOwnProperty('next')) |
| throw "next method should exists on %ArrayIteratorPrototype%"; |
| if (!arrayIteratorPrototype.hasOwnProperty('next')) |
| throw "next method should exists on %ArrayIteratorPrototype%"; |
| |
| var array1 = [42, 43, 41]; |
| var array1Iterator = array1[Symbol.iterator](); |
| var index = 0; |
| while (true) { |
| var result = arrayIteratorPrototypeNext.call(array1Iterator); |
| var value = result.value; |
| if (result.done) { |
| break; |
| } |
| if (value !== array1[index++]) |
| throw "Error: bad value: " + value; |
| } |
| if (index !== 3) |
| throw "Error: bad index: " + index; |
| |
| function increment(iter) { |
| return arrayIteratorPrototypeNext.call(iter); |
| } |
| var array1 = [42, 43, -20]; |
| var array2 = [42, 43, -20]; |
| var array1Iterator = array1[Symbol.iterator](); |
| var array2Iterator = array2[Symbol.iterator](); |
| for (var i = 0; i < 3; ++i) { |
| var value1 = increment(array1Iterator).value; |
| var value2 = increment(array2Iterator).value; |
| if (value1 !== value2) |
| throw "Error: bad value: " + value1 + " " + value2; |
| } |
| |
| var array1 = [ 0, 1, 2, 4, 5, 6 ]; |
| var array1Iterator = array1[Symbol.iterator](); |
| |
| var value = array1Iterator.next().value; |
| if (value !== 0) |
| throw "Error: bad value: " + value; |
| var value = array1Iterator.next().value; |
| if (value !== 1) |
| throw "Error: bad value: " + value; |
| var value = array1Iterator.next().value; |
| if (value !== 2) |
| throw "Error: bad value: " + value; |
| var value = arrayIteratorPrototypeNext.call(array1Iterator).value; |
| if (value !== 4) |
| throw "Error: bad value: " + value; |
| var value = arrayIteratorPrototypeNext.call(array1Iterator).value; |
| if (value !== 5) |
| throw "Error: bad value: " + value; |
| var value = arrayIteratorPrototypeNext.call(array1Iterator).value; |
| if (value !== 6) |
| throw "Error: bad value: " + value; |
| var value = arrayIteratorPrototypeNext.call(array1Iterator).value; |
| if (value !== undefined) |
| throw "Error: bad value: " + value; |
| |
| var primitives = [ |
| "string", |
| 42, |
| 0.03, |
| false, |
| true, |
| Symbol("Cocoa"), |
| null, |
| undefined |
| ]; |
| for (var primitive of primitives) { |
| var didThrow = null; |
| try { |
| arrayIteratorPrototypeNext.call(primitive); |
| } catch (e) { |
| didThrow = e; |
| } |
| if (!didThrow) |
| throw "Error: no error thrown"; |
| var expectedMessage = 'TypeError: %ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance'; |
| if (primitive === null) |
| expectedMessage = 'TypeError: %ArrayIteratorPrototype%.next requires that |this| not be null or undefined'; |
| if (primitive === undefined) |
| expectedMessage = 'TypeError: %ArrayIteratorPrototype%.next requires that |this| not be null or undefined'; |
| if (String(didThrow) !== expectedMessage) |
| throw "Error: bad error thrown: " + didThrow; |
| } |
| |
| var nonRelatedObjects = [ |
| {}, |
| [], |
| new Date(), |
| new Error(), |
| Object(Symbol()), |
| new String("Cappuccino"), |
| new Number(42), |
| new Boolean(false), |
| function () { }, |
| ]; |
| for (var object of nonRelatedObjects) { |
| var didThrow = null; |
| try { |
| arrayIteratorPrototypeNext.call(object); |
| } catch (e) { |
| didThrow = e; |
| } |
| if (!didThrow) |
| throw "Error: no error thrown"; |
| if (String(didThrow) !== 'TypeError: %ArrayIteratorPrototype%.next requires that |this| be an Array Iterator instance') |
| throw "Error: bad error thrown: " + didThrow; |
| } |