// Any copyright is dedicated to the Public Domain. // http://creativecommons.org/licenses/publicdomain/ var gTestfile = 'stringify-boxed-primitives.js'; //----------------------------------------------------------------------------- var BUGNUMBER = 584909; var summary = "Stringification of Boolean/String/Number objects"; print(BUGNUMBER + ": " + summary); /************** * BEGIN TEST * **************/ function redefine(obj, prop, fun) { var desc = { value: fun, writable: true, configurable: true, enumerable: false }; Object.defineProperty(obj, prop, desc); } assertEq(JSON.stringify(new Boolean(false)), "false"); assertEq(JSON.stringify(new Number(5)), "5"); assertEq(JSON.stringify(new String("foopy")), '"foopy"'); var numToString = Number.prototype.toString; var numValueOf = Number.prototype.valueOf; var objToString = Object.prototype.toString; var objValueOf = Object.prototype.valueOf; var boolToString = Boolean.prototype.toString; var boolValueOf = Boolean.prototype.valueOf; redefine(Boolean.prototype, "toString", function() { return 17; }); assertEq(JSON.stringify(new Boolean(false)), "false") delete Boolean.prototype.toString; assertEq(JSON.stringify(new Boolean(false)), "false"); delete Object.prototype.toString; assertEq(JSON.stringify(new Boolean(false)), "false"); delete Boolean.prototype.valueOf; assertEq(JSON.stringify(new Boolean(false)), "false"); delete Object.prototype.valueOf; assertEq(JSON.stringify(new Boolean(false)), "false"); redefine(Boolean.prototype, "toString", boolToString); redefine(Boolean.prototype, "valueOf", boolValueOf); redefine(Object.prototype, "toString", objToString); redefine(Object.prototype, "valueOf", objValueOf); redefine(Number.prototype, "toString", function() { return 42; }); assertEq(JSON.stringify(new Number(5)), "5"); redefine(Number.prototype, "valueOf", function() { return 17; }); assertEq(JSON.stringify(new Number(5)), "17"); delete Number.prototype.toString; assertEq(JSON.stringify(new Number(5)), "17"); delete Number.prototype.valueOf; assertEq(JSON.stringify(new Number(5)), "null"); // isNaN(Number("[object Number]")) delete Object.prototype.toString; try { JSON.stringify(new Number(5)); throw new Error("didn't throw"); } catch (e) { assertEq(e instanceof TypeError, true, "ToNumber failure, should throw TypeError"); } delete Object.prototype.valueOf; try { JSON.stringify(new Number(5)); throw new Error("didn't throw"); } catch (e) { assertEq(e instanceof TypeError, true, "ToNumber failure, should throw TypeError"); } redefine(Number.prototype, "toString", numToString); redefine(Number.prototype, "valueOf", numValueOf); redefine(Object.prototype, "toString", objToString); redefine(Object.prototype, "valueOf", objValueOf); redefine(String.prototype, "valueOf", function() { return 17; }); assertEq(JSON.stringify(new String(5)), '"5"'); redefine(String.prototype, "toString", function() { return 42; }); assertEq(JSON.stringify(new String(5)), '"42"'); delete String.prototype.toString; assertEq(JSON.stringify(new String(5)), '"[object String]"'); delete Object.prototype.toString; assertEq(JSON.stringify(new String(5)), '"17"'); delete String.prototype.valueOf; try { JSON.stringify(new String(5)); throw new Error("didn't throw"); } catch (e) { assertEq(e instanceof TypeError, true, "ToString failure, should throw TypeError"); } delete Object.prototype.valueOf; try { JSON.stringify(new String(5)); throw new Error("didn't throw"); } catch (e) { assertEq(e instanceof TypeError, true, "ToString failure, should throw TypeError"); } /******************************************************************************/ if (typeof reportCompare === "function") reportCompare(true, true); print("All tests passed!");