collection-iterator.js 7.22 KB
Newer Older
1 2 3 4
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
// Flags: --allow-natives-syntax
6

7 8 9 10 11 12 13 14
function test(f) {
  f();
  f();
  %OptimizeFunctionOnNextCall(f);
  f();
}

test(function TestSetIterator() {
15 16 17 18 19 20 21 22 23 24 25 26
  var s = new Set;
  var iter = s.values();

  var SetIteratorPrototype = iter.__proto__;
  assertFalse(SetIteratorPrototype.hasOwnProperty('constructor'));
  assertEquals(SetIteratorPrototype.__proto__, Object.prototype);

  var propertyNames = Object.getOwnPropertyNames(SetIteratorPrototype);
  assertArrayEquals(['next'], propertyNames);

  assertEquals(new Set().values().__proto__, SetIteratorPrototype);
  assertEquals(new Set().entries().__proto__, SetIteratorPrototype);
27 28 29 30 31 32 33 34 35

  assertEquals("[object Set Iterator]",
      Object.prototype.toString.call(iter));
  assertEquals("Set Iterator", SetIteratorPrototype[Symbol.toStringTag]);
  var desc = Object.getOwnPropertyDescriptor(
      SetIteratorPrototype, Symbol.toStringTag);
  assertTrue(desc.configurable);
  assertFalse(desc.writable);
  assertEquals("Set Iterator", desc.value);
36
});
37 38


39
test(function TestSetIteratorValues() {
40 41 42 43 44 45 46 47 48 49 50
  var s = new Set;
  s.add(1);
  s.add(2);
  s.add(3);
  var iter = s.values();

  assertEquals({value: 1, done: false}, iter.next());
  assertEquals({value: 2, done: false}, iter.next());
  assertEquals({value: 3, done: false}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
51
});
52 53


54
test(function TestSetIteratorKeys() {
55
  assertEquals(Set.prototype.keys, Set.prototype.values);
56
});
57 58


59
test(function TestSetIteratorEntries() {
60 61 62 63 64 65 66 67 68 69 70
  var s = new Set;
  s.add(1);
  s.add(2);
  s.add(3);
  var iter = s.entries();

  assertEquals({value: [1, 1], done: false}, iter.next());
  assertEquals({value: [2, 2], done: false}, iter.next());
  assertEquals({value: [3, 3], done: false}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
71
});
72 73


74
test(function TestSetIteratorMutations() {
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
  var s = new Set;
  s.add(1);
  var iter = s.values();
  assertEquals({value: 1, done: false}, iter.next());
  s.add(2);
  s.add(3);
  s.add(4);
  s.add(5);
  assertEquals({value: 2, done: false}, iter.next());
  s.delete(3);
  assertEquals({value: 4, done: false}, iter.next());
  s.delete(5);
  assertEquals({value: undefined, done: true}, iter.next());
  s.add(4);
  assertEquals({value: undefined, done: true}, iter.next());
90
});
91 92


93
test(function TestSetIteratorMutations2() {
94 95 96 97 98 99 100 101 102 103
  var s = new Set;
  s.add(1);
  s.add(2);
  var i = s.values();
  assertEquals({value: 1, done: false}, i.next());
  s.delete(2);
  s.delete(1);
  s.add(2);
  assertEquals({value: 2, done: false}, i.next());
  assertEquals({value: undefined, done: true}, i.next());
104
});
105 106


107
test(function TestSetIteratorMutations3() {
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
  var s = new Set;
  s.add(1);
  s.add(2);
  var i = s.values();
  assertEquals({value: 1, done: false}, i.next());
  s.delete(2);
  s.delete(1);
  for (var x = 2; x < 500; ++x) s.add(x);
  for (var x = 2; x < 500; ++x) s.delete(x);
  for (var x = 2; x < 1000; ++x) s.add(x);
  assertEquals({value: 2, done: false}, i.next());
  for (var x = 1001; x < 2000; ++x) s.add(x);
  s.delete(3);
  for (var x = 6; x < 2000; ++x) s.delete(x);
  assertEquals({value: 4, done: false}, i.next());
  s.delete(5);
  assertEquals({value: undefined, done: true}, i.next());
  s.add(4);
  assertEquals({value: undefined, done: true}, i.next());
127
});
128 129


130
test(function TestSetInvalidReceiver() {
131 132 133 134 135 136
  assertThrows(function() {
    Set.prototype.values.call({});
  }, TypeError);
  assertThrows(function() {
    Set.prototype.entries.call({});
  }, TypeError);
137
});
138 139


140
test(function TestSetIteratorInvalidReceiver() {
141 142 143 144
  var iter = new Set().values();
  assertThrows(function() {
    iter.next.call({});
  });
145
});
146 147


148
test(function TestSetIteratorSymbol() {
149 150 151 152 153 154 155
  assertEquals(Set.prototype[Symbol.iterator], Set.prototype.values);
  assertTrue(Set.prototype.hasOwnProperty(Symbol.iterator));
  assertFalse(Set.prototype.propertyIsEnumerable(Symbol.iterator));

  var iter = new Set().values();
  assertEquals(iter, iter[Symbol.iterator]());
  assertEquals(iter[Symbol.iterator].name, '[Symbol.iterator]');
156
});
157 158


159
test(function TestMapIterator() {
160 161 162 163 164 165 166 167 168 169 170 171 172
  var m = new Map;
  var iter = m.values();

  var MapIteratorPrototype = iter.__proto__;
  assertFalse(MapIteratorPrototype.hasOwnProperty('constructor'));
  assertEquals(MapIteratorPrototype.__proto__, Object.prototype);

  var propertyNames = Object.getOwnPropertyNames(MapIteratorPrototype);
  assertArrayEquals(['next'], propertyNames);

  assertEquals(new Map().values().__proto__, MapIteratorPrototype);
  assertEquals(new Map().keys().__proto__, MapIteratorPrototype);
  assertEquals(new Map().entries().__proto__, MapIteratorPrototype);
173 174 175 176 177 178 179 180 181

  assertEquals("[object Map Iterator]",
      Object.prototype.toString.call(iter));
  assertEquals("Map Iterator", MapIteratorPrototype[Symbol.toStringTag]);
  var desc = Object.getOwnPropertyDescriptor(
      MapIteratorPrototype, Symbol.toStringTag);
  assertTrue(desc.configurable);
  assertFalse(desc.writable);
  assertEquals("Map Iterator", desc.value);
182
});
183 184


185
test(function TestMapIteratorValues() {
186 187 188 189 190 191 192 193 194 195 196
  var m = new Map;
  m.set(1, 11);
  m.set(2, 22);
  m.set(3, 33);
  var iter = m.values();

  assertEquals({value: 11, done: false}, iter.next());
  assertEquals({value: 22, done: false}, iter.next());
  assertEquals({value: 33, done: false}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
197
});
198 199


200
test(function TestMapIteratorKeys() {
201 202 203 204 205 206 207 208 209 210 211
  var m = new Map;
  m.set(1, 11);
  m.set(2, 22);
  m.set(3, 33);
  var iter = m.keys();

  assertEquals({value: 1, done: false}, iter.next());
  assertEquals({value: 2, done: false}, iter.next());
  assertEquals({value: 3, done: false}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
212
});
213 214


215
test(function TestMapIteratorEntries() {
216 217 218 219 220 221 222 223 224 225 226
  var m = new Map;
  m.set(1, 11);
  m.set(2, 22);
  m.set(3, 33);
  var iter = m.entries();

  assertEquals({value: [1, 11], done: false}, iter.next());
  assertEquals({value: [2, 22], done: false}, iter.next());
  assertEquals({value: [3, 33], done: false}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
  assertEquals({value: undefined, done: true}, iter.next());
227
});
228 229


230
test(function TestMapInvalidReceiver() {
231 232 233 234 235 236 237 238 239
  assertThrows(function() {
    Map.prototype.values.call({});
  }, TypeError);
  assertThrows(function() {
    Map.prototype.keys.call({});
  }, TypeError);
  assertThrows(function() {
    Map.prototype.entries.call({});
  }, TypeError);
240
});
241 242


243
test(function TestMapIteratorInvalidReceiver() {
244 245 246 247
  var iter = new Map().values();
  assertThrows(function() {
    iter.next.call({});
  }, TypeError);
248
});
249 250


251
test(function TestMapIteratorSymbol() {
252 253 254 255 256 257 258
  assertEquals(Map.prototype[Symbol.iterator], Map.prototype.entries);
  assertTrue(Map.prototype.hasOwnProperty(Symbol.iterator));
  assertFalse(Map.prototype.propertyIsEnumerable(Symbol.iterator));

  var iter = new Map().values();
  assertEquals(iter, iter[Symbol.iterator]());
  assertEquals(iter[Symbol.iterator].name, '[Symbol.iterator]');
259
});