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