]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - tests/stress/array-iterators-next-with-call.js
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / tests / stress / array-iterators-next-with-call.js
diff --git a/tests/stress/array-iterators-next-with-call.js b/tests/stress/array-iterators-next-with-call.js
new file mode 100644 (file)
index 0000000..ef25de6
--- /dev/null
@@ -0,0 +1,115 @@
+// 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;
+}