
With the addition of symbol keys, work can now be done on starting to implement the well-known symbol functionality. The most important of these well-known symbols is by far Symbol.iterator. This patch adds IteratorPrototype, as well as ArrayIterator and ArrayIteratorPrototype. In the future, sometime after StringIterator has also been added, this will allow us to use Symbol.iterator directly in for..of loops, enabling the use of custom iterator objects. Also makes adding iterator support to native objects much easier (as will have to be done for Map and Set, when they get added).
48 lines
1.9 KiB
JavaScript
48 lines
1.9 KiB
JavaScript
test("length", () => {
|
|
expect(Array.prototype[Symbol.iterator].length).toBe(0);
|
|
});
|
|
|
|
test("same function as Array.prototype.values", () => {
|
|
expect(Array.prototype[Symbol.iterator]).toBe(Array.prototype.values);
|
|
});
|
|
|
|
test("basic functionality", () => {
|
|
const a = [1, 2, 3];
|
|
const it = a[Symbol.iterator]();
|
|
expect(it.next()).toEqual({ value: 1, done: false });
|
|
expect(it.next()).toEqual({ value: 2, done: false });
|
|
expect(it.next()).toEqual({ value: 3, done: false });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
});
|
|
|
|
test("works when applied to non-object", () => {
|
|
[true, false, 9, 2n, Symbol()].forEach(primitive => {
|
|
const it = [][Symbol.iterator].call(primitive);
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
});
|
|
});
|
|
|
|
test("item added to array before exhaustion is accessible", () => {
|
|
const a = [1, 2];
|
|
const it = a[Symbol.iterator]();
|
|
expect(it.next()).toEqual({ value: 1, done: false });
|
|
expect(it.next()).toEqual({ value: 2, done: false });
|
|
a.push(3);
|
|
expect(it.next()).toEqual({ value: 3, done: false });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
});
|
|
|
|
test("item added to array after exhaustion is inaccesible", () => {
|
|
const a = [1, 2];
|
|
const it = a[Symbol.iterator]();
|
|
expect(it.next()).toEqual({ value: 1, done: false });
|
|
expect(it.next()).toEqual({ value: 2, done: false });
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
a.push(3);
|
|
expect(it.next()).toEqual({ value: undefined, done: true });
|
|
});
|