summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/for-of/array-iterator-generic.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/for-of/array-iterator-generic.js')
-rw-r--r--js/src/jit-test/tests/for-of/array-iterator-generic.js33
1 files changed, 33 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/for-of/array-iterator-generic.js b/js/src/jit-test/tests/for-of/array-iterator-generic.js
new file mode 100644
index 0000000000..8e19bf8370
--- /dev/null
+++ b/js/src/jit-test/tests/for-of/array-iterator-generic.js
@@ -0,0 +1,33 @@
+// Array.prototype.iterator is generic.
+// That is, it can be applied to arraylike objects and strings, not just arrays.
+
+load(libdir + "asserts.js");
+load(libdir + "iteration.js");
+
+function test(obj) {
+ var it = Array.prototype[Symbol.iterator].call(obj);
+ var ki = Array.prototype.keys.call(obj);
+ var ei = Array.prototype.entries.call(obj);
+ for (var i = 0; i < (obj.length >>> 0); i++) {
+ assertIteratorNext(it, obj[i]);
+ assertIteratorNext(ki, i);
+ assertIteratorNext(ei, [i, obj[i]]);
+ }
+ assertIteratorDone(it, undefined);
+ assertIteratorDone(ki, undefined);
+ assertIteratorDone(ei, undefined);
+}
+
+test({length: 0});
+test({length: 0, 0: 'x', 1: 'y'});
+test({length: 2, 0: 'x', 1: 'y'});
+test(Object.create(['x', 'y', 'z']));
+test(Object.create({length: 2, 0: 'x', 1: 'y'}));
+test("");
+test("ponies");
+
+// Perverse length values.
+test({length: "011", 9: 9, 10: 10, 11: 11});
+test({length: -0});
+test({length: 2.7, 0: 0, 1: 1, 2: 2});
+test({length: {valueOf: function () { return 3; }}, 0: 0, 1: 1, 2: 2});