Source code

Revision control

Copy as Markdown

Other Tools

// Any copyright is dedicated to the Public Domain.
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!");