Set.js (1965B)
1 /* 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/licenses/publicdomain/ 4 */ 5 6 load(libdir + "asserts.js"); 7 8 var set = new Set(); 9 set.add(set); 10 11 var magic = deserialize(serialize(set)); 12 assertEq(magic.size, 1); 13 assertEq(magic.values().next().value, magic); 14 15 var values = [ 16 "a", "\uDEFF", undefined, null, -3.5, true, false, NaN, 155, -2 17 ] 18 19 set = new Set(); 20 for (var value of values) { 21 set.add(value) 22 } 23 24 magic = deserialize(serialize(set)); 25 var i = 0; 26 for (value of magic) { 27 assertEq(value, values[i++]); 28 } 29 30 assertDeepEq([...set.keys()], [...magic.keys()]); 31 assertDeepEq([...set.values()], [...magic.values()]); 32 33 var obj = {a: 1}; 34 obj.set = new Set(); 35 obj.set.add(obj); 36 37 magic = deserialize(serialize(obj)); 38 39 assertEq(magic.set.values().next().value, magic); 40 assertEq(magic.a, 1); 41 42 set = new Set(); 43 set.add(new Number(1)); 44 set.add(new String("aaaa")); 45 set.add(new Date(NaN)); 46 47 magic = deserialize(serialize(set)); 48 49 values = magic.values(); 50 assertEq(values.next().value.valueOf(), 1); 51 assertEq(values.next().value.valueOf(), "aaaa"); 52 assertEq(values.next().value.valueOf(), NaN); 53 assertEq(values.next().done, true); 54 55 // Make sure expandos aren't cloned (Bug 1041172) 56 set = new Set(); 57 set.a = "aaaaa"; 58 magic = deserialize(serialize(set)); 59 assertEq("a" in magic, false); 60 assertEq(Object.keys(magic).length, 0); 61 62 // Busted [[Prototype]] shouldn't matter 63 set = new Set(); 64 Object.setPrototypeOf(set, null); 65 Set.prototype.add.call(set, "aaa"); 66 magic = deserialize(serialize(set)); 67 assertEq(magic.has("aaa"), true); 68 assertEq(magic.size, 1); 69 70 // Can't fuzz around with Set after it is cloned 71 obj = { 72 a: new Set(), 73 get b() { 74 obj.a.delete("test"); 75 return "invoked"; 76 } 77 } 78 obj.a.add("test"); 79 assertEq(obj.a.has("test"), true); 80 magic = deserialize(serialize(obj)); 81 assertEq(obj.a.has("test"), false); 82 assertEq(magic.a.size, 1); 83 assertEq([...magic.a.keys()].toString(), "test"); 84 assertEq(magic.b, "invoked");