--- /dev/null
+// 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 (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;
+}