1/* Copyright JS Foundation and other contributors, http://js.foundation 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16var set = new Set(); 17var int = 1; 18assert (set.size === 0); 19assert (set.add (int) === set); 20assert (set.has (int)); 21assert (set.size === 1); 22 23var str = "foobar" 24assert (set.add (str) === set); 25assert (set.has (str)); 26assert (set.size === 2); 27 28var number = 5.78; 29assert (set.add (number) === set); 30assert (set.has (number)); 31assert (set.size === 3); 32 33var object = { a : 2, b : 4}; 34assert (set.add (object) === set); 35assert (set.has (object)); 36assert (set.size === 4); 37 38var func = function () {}; 39assert (set.add (func) === set); 40assert (set.has (func)); 41assert (set.size === 5); 42 43var symbol = Symbol ("foo"); 44assert (set.add (symbol) === set); 45assert (set.has (symbol)); 46assert (set.size === 6); 47 48assert (!set.has(5)); 49assert (!set.has("foo")); 50assert (!set.has({ a : 2, b : 4})); 51assert (!set.has(function () {})); 52assert (!set.has(Symbol ("foo"))); 53 54var elements = [int, str, number, object, func, symbol]; 55 56var i = 0; 57set.forEach (function (value, key) { 58 assert (key === elements[i]); 59 assert (value === elements[i]); 60 i++; 61}); 62 63assert (set.delete (int)); 64assert (set.size === 5); 65assert (set.delete (str)); 66assert (set.size === 4); 67assert (set.delete (number)); 68assert (set.size === 3); 69assert (set.delete (object)); 70assert (set.size === 2); 71assert (set.delete (func)); 72assert (set.size === 1); 73assert (set.delete (symbol)); 74assert (set.size === 0); 75 76set = new Set([1, 2, 3, 4]); 77assert (set.has(1)); 78assert (set.has(2)); 79assert (set.has(3)); 80assert (set.has(4)); 81 82assert (set.size === 4); 83assert (set.add (2) === set); 84assert (set.size === 4); 85assert (set.delete (2)); 86assert (set.size === 3); 87 88set.clear(); 89assert(set.size === 0); 90 91set.add(3); 92assert(set.delete(3)); 93assert(!set.delete(3)); 94 95function createIterable(arr, methods = {}) { 96 let iterable = function *() { 97 let idx = 0; 98 while (idx < arr.length) { 99 yield arr[idx]; 100 idx++; 101 } 102 }(); 103 iterable['return'] = methods['return']; 104 iterable['throw'] = methods['throw']; 105 106 return iterable; 107}; 108 109var closed = false; 110var iter = createIterable([1, 2, 3], { 111 'return': function(){ closed = true; return {}; } 112}); 113var add = Set.prototype.add; 114Set.prototype.add = function(){ throw 0 }; 115try { 116 new Set(iter); 117} catch(e){} 118Set.prototype.add = add; 119 120assert(closed === true); 121 122/* Test third argument of callback */ 123var s = new Set([1, 2, 3]); 124 125s.forEach(function(value, key, thisArg) { 126 assert (typeof thisArg === "object"); 127 assert(thisArg === s); 128}); 129 130var set = new Set(); 131set.add(-0); 132var k; 133set.forEach(function (value) { 134 k = 1 / value; 135}); 136 137assert(k === Infinity); 138assert(set.has(+0) === true); 139