blob: 37497fd348dcbb5073d441b9be23fc549082222a [file] [log] [blame]
/**
* These return* functions are used by the
* replacer tests taken from bug 512447
*/
function returnObjectFor1(k, v)
{
if (k == "1")
return {};
return v;
}
function returnArrayFor1(k, v)
{
if (k == "1")
return [];
return v;
}
function returnNullFor1(k, v)
{
if (k == "1")
return null;
return v;
}
function returnStringForUndefined(k, v)
{
if (v === undefined)
return "undefined value";
return v;
}
var cycleObject = {}; cycleObject.cycle = cycleObject;
function returnCycleObjectFor1(k, v)
{
if (k == "1")
return cycleObject;
return v;
}
var array = [0, 1, 2]; array[3] = array;
function returnCycleArrayFor1(k, v)
{
if (k == "1")
return array;
return v;
}
// BEGIN TEST
var x;
x = JSON.stringify({ key: 2 },
function(k,v) { return k ? undefined : v; });
assertEq(x, "{}");
x = JSON.stringify(["hmm", "hmm"],
function(k,v) { return k !== "" ? undefined : v; });
assertEq(x, "[null,null]");
var foo = ["hmm"];
function censor(k, v)
{
if (v !== foo)
return "XXX";
return v;
}
x = JSON.stringify(foo, censor);
assertEq(x, '["XXX"]');
foo = ["bar", ["baz"], "qux"];
x = JSON.stringify(foo, censor);
assertEq(x, '["XXX","XXX","XXX"]');
function censor2(k, v)
{
if (typeof(v) == "string")
return "XXX";
return v;
}
foo = ["bar", ["baz"], "qux"];
x = JSON.stringify(foo, censor2);
assertEq(x, '["XXX",["XXX"],"XXX"]');
foo = { bar: 42, qux: 42, quux: 42 };
x = JSON.stringify(foo, ["bar"]);
assertEq(x, '{"bar":42}');
foo = {bar: {bar: 42, schmoo:[]}, qux: 42, quux: 42};
x = JSON.stringify(foo, ["bar", "schmoo"]);
assertEq(x, '{"bar":{"bar":42,"schmoo":[]}}');
x = JSON.stringify(foo, null, "");
assertEq(x, '{"bar":{"bar":42,"schmoo":[]},"qux":42,"quux":42}');
x = JSON.stringify(foo, null, " ");
assertEq(x, '{\n "bar": {\n "bar": 42,\n "schmoo": []\n },\n "qux": 42,\n "quux": 42\n}');
foo = {bar:{bar:{}}}
x = JSON.stringify(foo, null, " ");
assertEq(x, '{\n "bar": {\n "bar": {}\n }\n}');
x = JSON.stringify({ x: 1, arr: [1] },
function (k,v) { return typeof v === 'number' ? 3 : v; });
assertEq(x, '{"x":3,"arr":[3]}');
foo = ['e'];
x = JSON.stringify(foo, null, '\t');
assertEq(x, '[\n\t"e"\n]');
foo = {0:0, 1:1, 2:2, 3:undefined};
x = JSON.stringify(foo, returnObjectFor1);
assertEq(x, '{"0":0,"1":{},"2":2}');
x = JSON.stringify(foo, returnArrayFor1);
assertEq(x, '{"0":0,"1":[],"2":2}');
x = JSON.stringify(foo, returnNullFor1);
assertEq(x, '{"0":0,"1":null,"2":2}');
x = JSON.stringify(foo, returnStringForUndefined);
assertEq(x, '{"0":0,"1":1,"2":2,"3":"undefined value"}');
try
{
JSON.stringify(foo, returnCycleObjectFor1);
throw new Error("no error thrown");
}
catch (e)
{
assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
}
try
{
JSON.stringify(foo, returnCycleArrayFor1);
throw new Error("no error thrown");
}
catch (e)
{
assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
}
foo = [0, 1, 2, undefined];
try
{
JSON.stringify(foo, returnCycleObjectFor1);
throw new Error("no error thrown");
}
catch (e)
{
assertEq(e instanceof TypeError, true, "no TypeError thrown: " + e);
}
/******************************************************************************/
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");