1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Redistribution and use in source and binary forms, with or without
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// modification, are permitted provided that the following conditions are
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// met:
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions of source code must retain the above copyright
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       notice, this list of conditions and the following disclaimer.
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Redistributions in binary form must reproduce the above
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       copyright notice, this list of conditions and the following
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       disclaimer in the documentation and/or other materials provided
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       with the distribution.
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//     * Neither the name of Google Inc. nor the names of its
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       contributors may be used to endorse or promote products derived
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//       from this software without specific prior written permission.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch//
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Flags: --expose-gc --allow-natives-syntax
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction assertSize(expected, collection) {
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (collection instanceof Map || collection instanceof Set) {
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(expected, collection.size);
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test valid getter and setter calls on Sets and WeakSets
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestValidSetCalls(m) {
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.add(new Object) });
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.has(new Object) });
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.delete(new Object) });
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestValidSetCalls(new Set);
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestValidSetCalls(new WeakSet);
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test valid getter and setter calls on Maps and WeakMaps
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestValidMapCalls(m) {
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.get(new Object) });
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.set(new Object) });
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.has(new Object) });
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertDoesNotThrow(function () { m.delete(new Object) });
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestValidMapCalls(new Map);
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestValidMapCalls(new WeakMap);
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test invalid getter and setter calls for WeakMap only
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestInvalidCalls(m) {
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.get(undefined) }, TypeError);
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.set(undefined, 0) }, TypeError);
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.get(null) }, TypeError);
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.set(null, 0) }, TypeError);
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.get(0) }, TypeError);
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.set(0, 0) }, TypeError);
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.get('a-key') }, TypeError);
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function () { m.set('a-key', 0) }, TypeError);
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestInvalidCalls(new WeakMap);
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test expected behavior for Sets and WeakSets
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSet(set, key) {
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(set.has(key));
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(set, set.add(key));
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(set.has(key));
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(set.delete(key));
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(set.has(key));
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(set.delete(key));
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(set.has(key));
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetBehavior(set) {
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 20; i++) {
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestSet(set, new Object);
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestSet(set, i);
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestSet(set, i / 100);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestSet(set, 'key-' + i);
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var keys = [ +0, -0, +Infinity, -Infinity, true, false, null, undefined ];
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < keys.length; i++) {
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestSet(set, keys[i]);
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetBehavior(new Set);
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSet(new WeakSet, new Object);
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test expected mapping behavior for Maps and WeakMaps
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapping(map, key, value) {
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(map, map.set(key, value));
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(value, map.get(key));
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapBehavior1(m) {
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestMapping(m, new Object, 23);
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestMapping(m, new Object, 'the-value');
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestMapping(m, new Object, new Object);
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapBehavior1(new Map);
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapBehavior1(new WeakMap);
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test expected mapping behavior for Maps only
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapBehavior2(m) {
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 20; i++) {
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestMapping(m, i, new Object);
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestMapping(m, i / 10, new Object);
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestMapping(m, 'key-' + i, new Object);
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // -0 is handled in TestMinusZeroMap
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var keys = [ 0, +Infinity, -Infinity, true, false, null, undefined ];
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < keys.length; i++) {
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestMapping(m, keys[i], new Object);
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapBehavior2(new Map);
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test expected querying behavior of Maps and WeakMaps
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestQuery(m) {
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var key = new Object;
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var values = [ 'x', 0, +Infinity, -Infinity, true, false, null, undefined ];
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < values.length; i++) {
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestMapping(m, key, values[i]);
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertTrue(m.has(key));
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertFalse(m.has(new Object));
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestQuery(new Map);
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestQuery(new WeakMap);
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test expected deletion behavior of Maps and WeakMaps
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDelete(m) {
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var key = new Object;
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestMapping(m, key, 'to-be-deleted');
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(m.delete(key));
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(m.delete(key));
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(m.delete(new Object));
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(m.get(key), undefined);
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDelete(new Map);
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDelete(new WeakMap);
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test GC of Maps and WeakMaps with entry
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestGC1(m) {
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var key = new Object;
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.set(key, 'not-collected');
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  gc();
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame('not-collected', m.get(key));
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestGC1(new Map);
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestGC1(new WeakMap);
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test GC of Maps and WeakMaps with chained entries
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestGC2(m) {
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var head = new Object;
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (key = head, i = 0; i < 10; i++, key = m.get(key)) {
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    m.set(key, new Object);
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  gc();
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var count = 0;
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (key = head; key != undefined; key = m.get(key)) {
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    count++;
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(11, count);
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestGC2(new Map);
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestGC2(new WeakMap);
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test property attribute [[Enumerable]]
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestEnumerable(func) {
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function props(x) {
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var array = [];
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var p in x) array.push(p);
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return array.sort();
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([], props(func));
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([], props(func.prototype));
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([], props(new func()));
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(Set);
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(Map);
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(WeakMap);
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestEnumerable(WeakSet);
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test arbitrary properties on Maps and WeakMaps
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestArbitrary(m) {
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function TestProperty(map, property, value) {
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map[property] = value;
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(value, map[property]);
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 20; i++) {
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestProperty(m, i, 'val' + i);
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TestProperty(m, 'foo' + i, 'bar' + i);
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  TestMapping(m, new Object, 'foobar');
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArbitrary(new Map);
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestArbitrary(new WeakMap);
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test direct constructor call
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { Set(); }, TypeError);
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { Map(); }, TypeError);
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { WeakMap(); }, TypeError);
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertThrows(function() { WeakSet(); }, TypeError);
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test whether NaN values as keys are treated correctly.
225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar s = new Set;
226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(s.has(NaN));
227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(s.has(NaN + 1));
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(s.has(23));
229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochs.add(NaN);
230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(s.has(NaN));
231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(s.has(NaN + 1));
232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(s.has(23));
233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m = new Map;
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(m.has(NaN));
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(m.has(NaN + 1));
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(m.has(23));
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochm.set(NaN, 'a-value');
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(m.has(NaN));
239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(m.has(NaN + 1));
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(m.has(23));
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test some common JavaScript idioms for Sets
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar s = new Set;
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(s instanceof Set);
246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Set.prototype.add instanceof Function)
247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Set.prototype.has instanceof Function)
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Set.prototype.delete instanceof Function)
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Set.prototype.clear instanceof Function)
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test some common JavaScript idioms for Maps
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m = new Map;
254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(m instanceof Map);
255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Map.prototype.set instanceof Function)
256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Map.prototype.get instanceof Function)
257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Map.prototype.has instanceof Function)
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Map.prototype.delete instanceof Function)
259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Map.prototype.clear instanceof Function)
260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test some common JavaScript idioms for WeakMaps
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m = new WeakMap;
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(m instanceof WeakMap);
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakMap.prototype.set instanceof Function)
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakMap.prototype.get instanceof Function)
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakMap.prototype.has instanceof Function)
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakMap.prototype.delete instanceof Function)
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakMap.prototype.clear instanceof Function)
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test some common JavaScript idioms for WeakSets
273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar s = new WeakSet;
274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(s instanceof WeakSet);
275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakSet.prototype.add instanceof Function)
276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakSet.prototype.has instanceof Function)
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakSet.prototype.delete instanceof Function)
278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakSet.prototype.clear instanceof Function)
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test class of instance and prototype.
282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Set", %_ClassOf(new Set))
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Object", %_ClassOf(Set.prototype))
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Map", %_ClassOf(new Map))
285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Object", %_ClassOf(Map.prototype))
286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("WeakMap", %_ClassOf(new WeakMap))
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Object", %_ClassOf(WeakMap.prototype))
288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("WeakSet", %_ClassOf(new WeakSet))
289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Object", %_ClassOf(WeakMap.prototype))
290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test name of constructor.
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Set", Set.name);
294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("Map", Map.name);
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("WeakMap", WeakMap.name);
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals("WeakSet", WeakSet.name);
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test prototype property of Set, Map, WeakMap and WeakSet.
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestPrototype(C) {
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(C.prototype instanceof Object);
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals({
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value: {},
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    writable: false,
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    enumerable: false,
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    configurable: false
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, Object.getOwnPropertyDescriptor(C, "prototype"));
308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestPrototype(Set);
310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestPrototype(Map);
311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestPrototype(WeakMap);
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestPrototype(WeakSet);
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test constructor property of the Set, Map, WeakMap and WeakSet prototype.
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestConstructor(C) {
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(C === Object.prototype.constructor);
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(C, C.prototype.constructor);
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(C, (new C).__proto__.constructor);
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, C.length);
321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestConstructor(Set);
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestConstructor(Map);
324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestConstructor(WeakMap);
325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestConstructor(WeakSet);
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test the Set, Map, WeakMap and WeakSet global properties themselves.
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestDescriptor(global, C) {
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals({
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value: C,
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    writable: true,
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    enumerable: false,
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    configurable: true
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, Object.getOwnPropertyDescriptor(global, C.name));
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDescriptor(this, Set);
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDescriptor(this, Map);
339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDescriptor(this, WeakMap);
340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestDescriptor(this, WeakSet);
341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Regression test for WeakMap prototype.
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(WeakMap.prototype.constructor === WeakMap)
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(Object.getPrototypeOf(WeakMap.prototype) === Object.prototype)
346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Regression test for issue 1617: The prototype of the WeakMap constructor
349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// needs to be unique (i.e. different from the one of the Object constructor).
350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(WeakMap.prototype === Object.prototype);
351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar o = Object.create({});
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse("get" in o);
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse("set" in o);
354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, o.get);
355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, o.set);
356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar o = Object.create({}, { myValue: {
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value: 10,
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  enumerable: false,
359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  configurable: true,
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  writable: true
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}});
362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(10, o.myValue);
363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Regression test for issue 1884: Invoking any of the methods for Harmony
366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// maps, sets, or weak maps, with a wrong type of receiver should be throwing
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// a proper TypeError.
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar alwaysBogus = [ undefined, null, true, "x", 23, {} ];
369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar bogusReceiversTestSet = [
370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  { proto: Set.prototype,
371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    funcs: [ 'add', 'has', 'delete' ],
372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    receivers: alwaysBogus.concat([ new Map, new WeakMap, new WeakSet ]),
373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  },
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  { proto: Map.prototype,
375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    funcs: [ 'get', 'set', 'has', 'delete' ],
376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    receivers: alwaysBogus.concat([ new Set, new WeakMap, new WeakSet ]),
377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  },
378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  { proto: WeakMap.prototype,
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    funcs: [ 'get', 'set', 'has', 'delete' ],
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    receivers: alwaysBogus.concat([ new Set, new Map, new WeakSet ]),
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  },
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  { proto: WeakSet.prototype,
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    funcs: [ 'add', 'has', 'delete' ],
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    receivers: alwaysBogus.concat([ new Set, new Map, new WeakMap ]),
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  },
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch];
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestBogusReceivers(testSet) {
388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < testSet.length; i++) {
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var proto = testSet[i].proto;
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var funcs = testSet[i].funcs;
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var receivers = testSet[i].receivers;
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (var j = 0; j < funcs.length; j++) {
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      var func = proto[funcs[j]];
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var k = 0; k < receivers.length; k++) {
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        assertThrows(function () { func.call(receivers[k], {}) }, TypeError);
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestBogusReceivers(bogusReceiversTestSet);
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Stress Test
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// There is a proposed stress-test available at the es-discuss mailing list
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// which cannot be reasonably automated.  Check it out by hand if you like:
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// https://mail.mozilla.org/pipermail/es-discuss/2011-May/014096.html
407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Set and Map size getters
410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar setSizeDescriptor = Object.getOwnPropertyDescriptor(Set.prototype, 'size');
411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, setSizeDescriptor.value);
412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, setSizeDescriptor.set);
413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(setSizeDescriptor.get instanceof Function);
414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, setSizeDescriptor.get.prototype);
415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(setSizeDescriptor.enumerable);
416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(setSizeDescriptor.configurable);
417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar s = new Set();
419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(s.hasOwnProperty('size'));
420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 10; i++) {
421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(i, s.size);
422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.add(i);
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 9; i >= 0; i--) {
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.delete(i);
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(i, s.size);
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar mapSizeDescriptor = Object.getOwnPropertyDescriptor(Map.prototype, 'size');
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, mapSizeDescriptor.value);
432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, mapSizeDescriptor.set);
433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(mapSizeDescriptor.get instanceof Function);
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertEquals(undefined, mapSizeDescriptor.get.prototype);
435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(mapSizeDescriptor.enumerable);
436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertTrue(mapSizeDescriptor.configurable);
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar m = new Map();
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochassertFalse(m.hasOwnProperty('size'));
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 0; i < 10; i++) {
441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(i, m.size);
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.set(i, i);
443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfor (var i = 9; i >= 0; i--) {
445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.delete(i);
446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(i, m.size);
447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test Set clear
451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = new Set();
453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.add(42);
454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has(42));
455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, s.size);
456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.clear();
457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(s.has(42));
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(0, s.size);
459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test Map clear
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var m = new Map();
465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.set(42, true);
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(m.has(42));
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, m.size);
468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.clear();
469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(m.has(42));
470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(0, m.size);
471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test WeakMap clear
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var k = new Object();
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var w = new WeakMap();
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  w.set(k, 23);
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(w.has(k));
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(23, w.get(k));
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  w.clear();
482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(w.has(k));
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(undefined, w.get(k));
484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Test WeakSet clear
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function() {
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var k = new Object();
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var w = new WeakSet();
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  w.add(k);
492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(w.has(k));
493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  w.clear();
494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertFalse(w.has(k));
495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMinusZeroSet() {
499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = new Set();
500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.add(-0);
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, s.values().next().value);
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s.add(0);
503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, s.size);
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has(0));
505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has(-0));
506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMinusZeroMap() {
510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var m = new Map();
511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.set(-0, 'minus');
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSame(0, m.keys().next().value);
513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m.set(0, 'plus');
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, m.size);
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(m.has(0));
516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(m.has(-0));
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('plus', m.get(0));
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('plus', m.get(-0));
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachInvalidTypes() {
523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Set.prototype.set.forEach.call({});
525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set.forEach({});
530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEach() {
535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('c');
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var receiver = {};
542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v, k, s) {
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(v, k);
544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(set, s);
545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertSame(this, receiver);
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer += v;
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 'a') {
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.delete('b');
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('d');
550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('e');
551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('f');
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (v === 'c') {
553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('b');
554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.delete('e');
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, receiver);
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('acdfb', buffer);
559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachAddAtEnd() {
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v) {
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer += v;
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 'b') {
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('c');
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('abc', buffer);
576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachDeleteNext() {
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('c');
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v) {
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer += v;
588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 'b') {
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.delete('c');
590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('ab', buffer);
594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachDeleteVisitedAndAddAgain() {
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('c');
602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v) {
605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer += v;
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 'b') {
607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.delete('a');
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (v === 'c') {
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('a');
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('abca', buffer);
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachClear() {
618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('c');
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v) {
625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer += v;
626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 'a') {
627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.clear();
628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('d');
629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set.add('e');
630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('ade', buffer);
634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachNested() {
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('c');
642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v) {
645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer += v;
646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set.forEach(function(v) {
647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer += v;
648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (v === 'a') {
649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set.delete('b');
650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    });
652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('aaccac', buffer);
655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachEarlyExit() {
659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('a');
661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('b');
662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.add('c');
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = '';
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ex = {};
666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  try {
667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set.forEach(function(v) {
668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer += v;
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw ex;
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    });
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } catch (e) {
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(ex, e);
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('a', buffer);
675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachGC() {
679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new Set();
680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 100; i++) {
681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set.add(i);
682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var accumulated = 0;
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set.forEach(function(v) {
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    accumulated += v;
687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v % 10 === 0) {
688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      gc();
689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(4950, accumulated);
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachInvalidTypes() {
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map.prototype.map.forEach.call({});
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map.forEach({});
702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEach() {
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 'c');
711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var receiver = {};
714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v, k, m) {
715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(map, m);
716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(this, receiver);
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(k, v);
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (k === 0) {
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(1);
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(3, 'd');
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(4, 'e');
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(5, 'f');
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (k === 2) {
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(1, 'B');
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(4);
726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, receiver);
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a', 2, 'c', 3, 'd', 5, 'f', 1, 'B'], buffer);
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachAddAtEnd() {
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v, k) {
740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(k, v);
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (k === 1) {
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(2, 'c');
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a', 1, 'b', 2, 'c'], buffer);
747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachDeleteNext() {
751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 'c');
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v, k) {
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(k, v);
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (k === 1) {
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(2);
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a', 1, 'b'], buffer);
765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetForEachDeleteVisitedAndAddAgain() {
769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 'c');
773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v, k) {
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(k, v);
777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (k === 1) {
778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(0);
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else if (k === 2) {
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(0, 'a');
781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a', 1, 'b', 2, 'c', 0, 'a'], buffer);
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachClear() {
789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 'c');
793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v, k) {
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(k, v);
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (k === 0) {
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.clear();
799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(3, 'd');
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.set(4, 'e');
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a', 3, 'd', 4, 'e'], buffer);
805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachNested() {
809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 'c');
813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v, k) {
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(k, v);
817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map.forEach(function(v, k) {
818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer.push(k, v);
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (k === 0) {
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.delete(1);
821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    });
823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a', 0, 'a', 2, 'c', 2, 'c', 0, 'a', 2, 'c'], buffer);
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachEarlyExit() {
830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 'a');
832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 'b');
833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 'c');
834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var ex = {};
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  try {
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map.forEach(function(v, k) {
839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      buffer.push(k, v);
840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      throw ex;
841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    });
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } catch (e) {
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    assertEquals(ex, e);
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 'a'], buffer);
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachGC() {
850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map();
851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (var i = 0; i < 100; i++) {
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    map.set(i, i);
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var accumulated = 0;
856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v) {
857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    accumulated += v;
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v % 10 === 0) {
859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      gc();
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(4950, accumulated);
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachAllRemovedTransition() {
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map;
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 0);
869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v) {
872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(v);
873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 0) {
874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 1; i < 4; i++) {
875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(i, i);
876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 3) {
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 0; i < 4; i++) {
881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.delete(i);
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 4; i < 8; i++) {
884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(i, i);
885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 1, 2, 3, 4, 5, 6, 7], buffer);
890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachClearTransition() {
894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map;
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 0);
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v) {
900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(v);
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (++i < 5) {
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var j = 0; j < 5; j++) {
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.clear();
904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(i, i);
905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 1, 2, 3, 4], buffer);
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachNestedNonTrivialTransition() {
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map;
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 0);
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(1, 1);
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(2, 2);
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(3, 3);
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.delete(0);
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var i = 0;
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v) {
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (++i > 10) return;
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(v);
927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v == 3) {
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(1);
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var j = 4; j < 10; j++) {
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(j, j);
932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var j = 4; j < 10; j += 2) {
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.delete(j);
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(2);
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var j = 10; j < 20; j++) {
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(j, j);
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var j = 10; j < 20; j += 2) {
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.delete(j);
943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map.delete(3);
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([1, 2, 3, 5, 7, 9, 11, 13, 15, 17], buffer);
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachAllRemovedTransitionNoClear() {
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map;
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 0);
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v) {
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(v);
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 0) {
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 1; i < 8; i++) {
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(i, i);
963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 4) {
967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 0; i < 8; i++) {
968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.delete(i);
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 1, 2, 3, 4], buffer);
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestMapForEachNoMoreElementsAfterTransition() {
978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new Map;
979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.set(0, 0);
980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var buffer = [];
982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  map.forEach(function(v) {
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    buffer.push(v);
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 0) {
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 1; i < 16; i++) {
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.set(i, i);
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (v === 4) {
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for (var i = 5; i < 16; i++) {
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        map.delete(i);
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertArrayEquals([0, 1, 2, 3, 4], buffer);
998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Allows testing iterator-based constructors easily.
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar oneAndTwo = new Map();
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar k0 = {key: 0};
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar k1 = {key: 1};
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvar k2 = {key: 2};
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochoneAndTwo.set(k1, 1);
1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochoneAndTwo.set(k2, 2);
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructor(ctor) {
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = new ctor(null);
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(0, s);
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s = new ctor(undefined);
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(0, s);
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // No @@iterator
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor({});
1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(true);
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // @@iterator not callable
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var object = {};
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object[Symbol.iterator] = 42;
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(object);
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // @@iterator result not object
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var object = {};
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object[Symbol.iterator] = function() {
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 42;
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    };
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(object);
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s2 = new Set();
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s2.add(k0);
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s2.add(k1);
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s2.add(k2);
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  s = new ctor(s2.values());
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(3, s);
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has(k0));
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has(k1));
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has(k2));
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructor(Set);
1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructor(WeakSet);
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructorAddNotCallable(ctor) {
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var originalPrototypeAdd = ctor.prototype.add;
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ctor.prototype.add = 42;
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(oneAndTwo.values());
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ctor.prototype.add = originalPrototypeAdd;
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorAddNotCallable(Set);
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorAddNotCallable(WeakSet);
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructorGetAddOnce(ctor) {
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var originalPrototypeAdd = ctor.prototype.add;
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var getAddCount = 0;
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object.defineProperty(ctor.prototype, 'add', {
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    get: function() {
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      getAddCount++;
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return function() {};
1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = new ctor(oneAndTwo.values());
1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, getAddCount);
1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(0, s);
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object.defineProperty(ctor.prototype, 'add', {
1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value: originalPrototypeAdd,
1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    writable: true
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorGetAddOnce(Set);
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorGetAddOnce(WeakSet);
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructorAddReplaced(ctor) {
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var originalPrototypeAdd = ctor.prototype.add;
1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var addCount = 0;
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ctor.prototype.add = function(value) {
1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    addCount++;
1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    originalPrototypeAdd.call(this, value);
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ctor.prototype.add = null;
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = new ctor(oneAndTwo.keys());
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(2, addCount);
1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(2, s);
1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ctor.prototype.add = originalPrototypeAdd;
1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorAddReplaced(Set);
1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorAddReplaced(WeakSet);
1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructorOrderOfDoneValue(ctor) {
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var valueCount = 0, doneCount = 0;
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = {
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    next: function() {
1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return {
1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        get value() {
1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          valueCount++;
1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        },
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        get done() {
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          doneCount++;
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          throw new Error();
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      };
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  iterator[Symbol.iterator] = function() {
1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this;
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(iterator);
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, doneCount);
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(0, valueCount);
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorOrderOfDoneValue(Set);
1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorOrderOfDoneValue(WeakSet);
1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructorNextNotAnObject(ctor) {
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = {
1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    next: function() {
1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'abc';
1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  iterator[Symbol.iterator] = function() {
1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this;
1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(iterator);
1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorNextNotAnObject(Set);
1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorNextNotAnObject(WeakSet);
1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestWeakSetConstructorNonObjectKeys() {
1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new WeakSet([1]);
1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestSetConstructorIterableValue(ctor) {
1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  'use strict';
1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Strict mode is required to prevent implicit wrapping in the getter.
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object.defineProperty(Number.prototype, Symbol.iterator, {
1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    get: function() {
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assertEquals('object', typeof this);
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return function() {
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return oneAndTwo.keys();
1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      };
1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    },
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    configurable: true
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var set = new ctor(42);
1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(2, set);
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(set.has(k1));
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(set.has(k2));
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete Number.prototype[Symbol.iterator];
1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorIterableValue(Set);
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestSetConstructorIterableValue(WeakSet);
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestSetConstructorStringValue() {
1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var s = new Set('abc');
1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(3, s);
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has('a'));
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has('b'));
1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertTrue(s.has('c'));
1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructor(ctor) {
1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var m = new ctor(null);
1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(0, m);
1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m = new ctor(undefined);
1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(0, m);
1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // No @@iterator
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor({});
1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(true);
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // @@iterator not callable
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var object = {};
1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object[Symbol.iterator] = 42;
1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(object);
1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // @@iterator result not object
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    var object = {};
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    object[Symbol.iterator] = function() {
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 42;
1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    };
1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(object);
1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var m2 = new Map();
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m2.set(k0, 'a');
1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m2.set(k1, 'b');
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m2.set(k2, 'c');
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  m = new ctor(m2.entries());
1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(3, m);
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('a', m.get(k0));
1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('b', m.get(k1));
1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals('c', m.get(k2));
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructor(Map);
1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructor(WeakMap);
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorSetNotCallable(ctor) {
1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var originalPrototypeSet = ctor.prototype.set;
1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ctor.prototype.set = 42;
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(oneAndTwo.entries());
1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ctor.prototype.set = originalPrototypeSet;
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorSetNotCallable(Map);
1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorSetNotCallable(WeakMap);
1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorGetAddOnce(ctor) {
1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var originalPrototypeSet = ctor.prototype.set;
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var getSetCount = 0;
1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object.defineProperty(ctor.prototype, 'set', {
1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    get: function() {
1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      getSetCount++;
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return function() {};
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var m = new ctor(oneAndTwo.entries());
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, getSetCount);
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(0, m);
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object.defineProperty(ctor.prototype, 'set', {
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value: originalPrototypeSet,
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    writable: true
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorGetAddOnce(Map);
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorGetAddOnce(WeakMap);
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorSetReplaced(ctor) {
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var originalPrototypeSet = ctor.prototype.set;
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var setCount = 0;
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ctor.prototype.set = function(key, value) {
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    setCount++;
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    originalPrototypeSet.call(this, key, value);
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ctor.prototype.set = null;
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var m = new ctor(oneAndTwo.entries());
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(2, setCount);
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(2, m);
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ctor.prototype.set = originalPrototypeSet;
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorSetReplaced(Map);
1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorSetReplaced(WeakMap);
1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorOrderOfDoneValue(ctor) {
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var valueCount = 0, doneCount = 0;
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  function FakeError() {}
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = {
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    next: function() {
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return {
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        get value() {
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          valueCount++;
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        },
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        get done() {
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          doneCount++;
1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          throw new FakeError();
1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
1298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      };
1299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  iterator[Symbol.iterator] = function() {
1302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this;
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(iterator);
1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, FakeError);
1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, doneCount);
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(0, valueCount);
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorOrderOfDoneValue(Map);
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorOrderOfDoneValue(WeakMap);
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorNextNotAnObject(ctor) {
1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var iterator = {
1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    next: function() {
1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'abc';
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  iterator[Symbol.iterator] = function() {
1321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return this;
1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(iterator);
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorNextNotAnObject(Map);
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorNextNotAnObject(WeakMap);
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorIteratorNotObjectValues(ctor) {
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new ctor(oneAndTwo.values());
1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorIteratorNotObjectValues(Map);
1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorIteratorNotObjectValues(WeakMap);
1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch(function TestWeakMapConstructorNonObjectKeys() {
1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertThrows(function() {
1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new WeakMap([[1, 2]])
1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }, TypeError);
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch})();
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfunction TestMapConstructorIterableValue(ctor) {
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  'use strict';
1349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Strict mode is required to prevent implicit wrapping in the getter.
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object.defineProperty(Number.prototype, Symbol.iterator, {
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    get: function() {
1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assertEquals('object', typeof this);
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return function() {
1354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return oneAndTwo.entries();
1355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      };
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    },
1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    configurable: true
1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  });
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  var map = new ctor(42);
1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertSize(2, map);
1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(1, map.get(k1));
1363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  assertEquals(2, map.get(k2));
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  delete Number.prototype[Symbol.iterator];
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorIterableValue(Map);
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTestMapConstructorIterableValue(WeakMap);
1369