Source code

Revision control

Copy as Markdown

Other Tools

/*
* Any copyright is dedicated to the Public Domain.
*/
load(libdir + "asserts.js");
var set = new Set();
set.add(set);
var magic = deserialize(serialize(set));
assertEq(magic.size, 1);
assertEq(magic.values().next().value, magic);
var values = [
"a", "\uDEFF", undefined, null, -3.5, true, false, NaN, 155, -2
]
set = new Set();
for (var value of values) {
set.add(value)
}
magic = deserialize(serialize(set));
var i = 0;
for (value of magic) {
assertEq(value, values[i++]);
}
assertDeepEq([...set.keys()], [...magic.keys()]);
assertDeepEq([...set.values()], [...magic.values()]);
var obj = {a: 1};
obj.set = new Set();
obj.set.add(obj);
magic = deserialize(serialize(obj));
assertEq(magic.set.values().next().value, magic);
assertEq(magic.a, 1);
set = new Set();
set.add(new Number(1));
set.add(new String("aaaa"));
set.add(new Date(NaN));
magic = deserialize(serialize(set));
values = magic.values();
assertEq(values.next().value.valueOf(), 1);
assertEq(values.next().value.valueOf(), "aaaa");
assertEq(values.next().value.valueOf(), NaN);
assertEq(values.next().done, true);
// Make sure expandos aren't cloned (Bug 1041172)
set = new Set();
set.a = "aaaaa";
magic = deserialize(serialize(set));
assertEq("a" in magic, false);
assertEq(Object.keys(magic).length, 0);
// Busted [[Prototype]] shouldn't matter
set = new Set();
Object.setPrototypeOf(set, null);
Set.prototype.add.call(set, "aaa");
magic = deserialize(serialize(set));
assertEq(magic.has("aaa"), true);
assertEq(magic.size, 1);
// Can't fuzz around with Set after it is cloned
obj = {
a: new Set(),
get b() {
obj.a.delete("test");
return "invoked";
}
}
obj.a.add("test");
assertEq(obj.a.has("test"), true);
magic = deserialize(serialize(obj));
assertEq(obj.a.has("test"), false);
assertEq(magic.a.size, 1);
assertEq([...magic.a.keys()].toString(), "test");
assertEq(magic.b, "invoked");