/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
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");