Map.js (2567B)
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 map = new Map(); 9 map.set("self", map); 10 11 var magic = deserialize(serialize(map)); 12 assertEq(magic.get("self"), magic); 13 assertEq(magic.size, 1); 14 15 map = new Map(); 16 map.set(map, "self"); 17 18 magic = deserialize(serialize(map)); 19 assertEq(magic.get(magic), "self"); 20 assertEq(magic.size, 1); 21 22 var values = [ 23 "a", "\uDEFF", undefined, null, -3.5, true, false, NaN, 155, -2 24 ] 25 26 map = new Map(); 27 for (var value of values) { 28 map.set(value, value); 29 } 30 31 magic = deserialize(serialize(map)); 32 var i = 0; 33 for (value of magic) { 34 assertEq(value[0], value[1]); 35 assertEq(value[0], values[i++]); 36 } 37 38 assertDeepEq([...map.keys()], [...magic.keys()]); 39 assertDeepEq([...map.values()], [...magic.values()]); 40 41 var obj = {a: 1}; 42 obj.map = new Map(); 43 obj.map.set("obj", obj); 44 45 magic = deserialize(serialize(obj)); 46 47 assertEq(magic.map.get("obj"), magic); 48 assertEq(magic.a, 1); 49 50 map = new Map(); 51 map.set("a", new Number(1)); 52 map.set("b", new String("aaaa")); 53 map.set("c", new Date(NaN)); 54 55 magic = deserialize(serialize(map)); 56 57 assertEq(magic.get("a").valueOf(), 1); 58 assertEq(magic.get("b").valueOf(), "aaaa"); 59 assertEq(magic.get("c").valueOf(), NaN); 60 61 assertDeepEq([...map.keys()], ["a", "b", "c"]); 62 63 map = new Map(); 64 map.set("x", new Map()); 65 map.get("x").set("x", map); 66 map.get("x").set("b", null); 67 68 magic = deserialize(serialize(map)); 69 70 assertEq(magic.get("x").get("x"), magic); 71 assertEq(magic.get("x").get("b"), null); 72 73 map = new Map() 74 map.set({a: 1}, "b"); 75 76 magic = deserialize(serialize(map)); 77 78 obj = [...magic.keys()][0]; 79 assertEq(obj.a, 1); 80 assertEq(magic.get(obj), "b"); 81 82 // Make sure expandos aren't cloned (Bug 1041172) 83 map = new Map(); 84 map.a = "aaaaa"; 85 magic = deserialize(serialize(map)); 86 assertEq("a" in magic, false); 87 assertEq(Object.keys(magic).length, 0); 88 89 // Busted [[Prototype]] shouldn't matter 90 map = new Map(); 91 Object.setPrototypeOf(map, null); 92 Map.prototype.set.call(map, "self", map); 93 magic = deserialize(serialize(map)); 94 assertEq(magic.get("self"), magic); 95 assertEq(magic.size, 1); 96 97 // Can't fuzz around with Map after it is cloned 98 obj = { 99 a: new Map(), 100 get b() { 101 obj.a.delete("test"); 102 return "invoked"; 103 } 104 } 105 obj.a.set("test", "hello"); 106 assertEq(obj.a.has("test"), true); 107 magic = deserialize(serialize(obj)); 108 assertEq(obj.a.has("test"), false); 109 assertEq(magic.a.size, 1); 110 assertEq(magic.a.get("test"), "hello"); 111 assertEq([...magic.a.keys()].toString(), "test"); 112 assertEq(magic.b, "invoked");