15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 the V8 project authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags: --allow-natives-syntax
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIterator() {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var s = new Set;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = s.values();
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('Set Iterator', %_ClassOf(iter));
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var SetIteratorPrototype = iter.__proto__;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(SetIteratorPrototype.hasOwnProperty('constructor'));
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(SetIteratorPrototype.__proto__, Object.prototype);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var propertyNames = Object.getOwnPropertyNames(SetIteratorPrototype);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertArrayEquals(['next'], propertyNames);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(new Set().values().__proto__, SetIteratorPrototype);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(new Set().entries().__proto__, SetIteratorPrototype);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIteratorValues() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var s = new Set;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(1);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(2);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(3);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = s.values();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 1, done: false}, iter.next());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 2, done: false}, iter.next());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 3, done: false}, iter.next());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIteratorKeys() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(Set.prototype.keys, Set.prototype.values);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIteratorEntries() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var s = new Set;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(1);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(2);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(3);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = s.entries();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: [1, 1], done: false}, iter.next());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: [2, 2], done: false}, iter.next());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: [3, 3], done: false}, iter.next());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIteratorMutations() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var s = new Set;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(1);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = s.values();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 1, done: false}, iter.next());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(2);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(3);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(4);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(5);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 2, done: false}, iter.next());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.delete(3);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 4, done: false}, iter.next());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.delete(5);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s.add(4);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetInvalidReceiver() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertThrows(function() {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Set.prototype.values.call({});
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, TypeError);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertThrows(function() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Set.prototype.entries.call({});
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, TypeError);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIteratorInvalidReceiver() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = new Set().values();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertThrows(function() {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iter.next.call({});
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestSetIteratorSymbol() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(Set.prototype[Symbol.iterator], Set.prototype.values);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(Set.prototype.hasOwnProperty(Symbol.iterator));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(Set.prototype.propertyIsEnumerable(Symbol.iterator));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = new Set().values();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(iter, iter[Symbol.iterator]());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(iter[Symbol.iterator].name, '[Symbol.iterator]');
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestMapIterator() {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var m = new Map;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = m.values();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals('Map Iterator', %_ClassOf(iter));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var MapIteratorPrototype = iter.__proto__;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(MapIteratorPrototype.hasOwnProperty('constructor'));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(MapIteratorPrototype.__proto__, Object.prototype);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var propertyNames = Object.getOwnPropertyNames(MapIteratorPrototype);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertArrayEquals(['next'], propertyNames);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  assertEquals(new Map().values().__proto__, MapIteratorPrototype);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(new Map().keys().__proto__, MapIteratorPrototype);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(new Map().entries().__proto__, MapIteratorPrototype);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(function TestMapIteratorValues() {
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  var m = new Map;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(1, 11);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(2, 22);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(3, 33);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = m.values();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 11, done: false}, iter.next());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 22, done: false}, iter.next());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 33, done: false}, iter.next());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestMapIteratorKeys() {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var m = new Map;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(1, 11);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(2, 22);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(3, 33);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = m.keys();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 1, done: false}, iter.next());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 2, done: false}, iter.next());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: 3, done: false}, iter.next());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestMapIteratorEntries() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var m = new Map;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(1, 11);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(2, 22);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  m.set(3, 33);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = m.entries();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: [1, 11], done: false}, iter.next());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: [2, 22], done: false}, iter.next());
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  assertEquals({value: [3, 33], done: false}, iter.next());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals({value: undefined, done: true}, iter.next());
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)(function TestMapInvalidReceiver() {
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  assertThrows(function() {
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Map.prototype.values.call({});
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, TypeError);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertThrows(function() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Map.prototype.keys.call({});
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, TypeError);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertThrows(function() {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Map.prototype.entries.call({});
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, TypeError);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestMapIteratorInvalidReceiver() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = new Map().values();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertThrows(function() {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iter.next.call({});
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }, TypeError);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)(function TestMapIteratorSymbol() {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(Map.prototype[Symbol.iterator], Map.prototype.entries);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertTrue(Map.prototype.hasOwnProperty(Symbol.iterator));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertFalse(Map.prototype.propertyIsEnumerable(Symbol.iterator));
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var iter = new Map().values();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(iter, iter[Symbol.iterator]());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assertEquals(iter[Symbol.iterator].name, '[Symbol.iterator]');
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)})();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)