blob: c5f939bc511928a1f33ef436bb9ac29257e27821 [file] [log] [blame]
function shouldBe(actual, expected)
{
if (actual !== expected)
throw new Error('bad value: ' + actual);
}
var iteratorPrototype = "Cocoa"[Symbol.iterator]().__proto__.__proto__;
shouldBe(iteratorPrototype !== Object.prototype, true);
shouldBe(iteratorPrototype.__proto__, Object.prototype);
shouldBe(JSON.stringify(Object.getOwnPropertyNames(iteratorPrototype)), '[]');
shouldBe(Object.getOwnPropertySymbols(iteratorPrototype).length, 1);
shouldBe(Object.getOwnPropertySymbols(iteratorPrototype)[0], Symbol.iterator);
shouldBe(iteratorPrototype[Symbol.iterator](), iteratorPrototype);
var stringIterator = "Hello"[Symbol.iterator]();
shouldBe(iteratorPrototype[Symbol.iterator].call(stringIterator), stringIterator);
function inheritIteratorPrototype(iterator)
{
var prototype = iterator.__proto__;
shouldBe(prototype !== iteratorPrototype, true);
shouldBe(Object.getOwnPropertyDescriptor(prototype, 'constructor'), undefined);
shouldBe(prototype.__proto__, iteratorPrototype);
shouldBe(iteratorPrototype[Symbol.iterator].name, '[Symbol.iterator]');
shouldBe(iteratorPrototype.hasOwnProperty(Symbol.iterator), true);
}
inheritIteratorPrototype("Cappuccino"[Symbol.iterator]());
inheritIteratorPrototype(new Map()[Symbol.iterator]());
inheritIteratorPrototype(new Set()[Symbol.iterator]());
inheritIteratorPrototype(new Array()[Symbol.iterator]());
inheritIteratorPrototype((function (a, b, c) { return arguments; }(0, 1, 2))[Symbol.iterator]());
inheritIteratorPrototype((function (a, b, c) { 'use strict'; return arguments; }(0, 1, 2))[Symbol.iterator]());
function testChain(iterable)
{
// Iterator instance
var iterator = iterable[Symbol.iterator]();
// %MapIteratorPrototype%
var proto1 = Object.getPrototypeOf(iterator);
// %IteratorPrototype%
var proto2 = Object.getPrototypeOf(proto1);
shouldBe(proto2.hasOwnProperty(Symbol.iterator), true);
shouldBe(proto1.hasOwnProperty(Symbol.iterator), false);
shouldBe(iterator.hasOwnProperty(Symbol.iterator), false);
shouldBe(iterator[Symbol.iterator](), iterator);
}
testChain("Cocoa");
testChain(new Map());
testChain(new Set());
testChain(new Array());