| /** |
| * 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"); |