blob: 5ea399fe8719f736803c5da28211a4938bd95b59 [file] [log] [blame]
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
*/
//-----------------------------------------------------------------------------
var BUGNUMBER = 619283;
var summary =
"ECMAScript built-in methods that immediately throw when |this| is " +
"|undefined| or |null| (due to CheckObjectCoercible, ToObject, or ToString)";
print(BUGNUMBER + ": " + summary);
/**************
* BEGIN TEST *
**************/
// This test fills out for the non-standard methods which
// ecma_5/misc/builtin-methods-reject-null-undefined-this.js declines to test.
var ClassToMethodMap =
{
Object: [/*
* Don't box this just yet for these methods -- they're used too
* much without qualification to do that. :-(
*/
/* "__defineGetter__", "__defineSetter__", */
"__lookupGetter__", "__lookupSetter__", "watch", "unwatch",
"toSource"],
Function: ["toSource"],
Array: ["toSource"],
String: ["toSource", "quote", "bold", "italics", "fixed", "fontsize",
"fontcolor", "link", "anchor", "strike", "small", "big", "blink",
"sup", "sub", "substr", "trimLeft", "trimRight", "toJSON"],
Boolean: ["toSource", "toJSON"],
Number: ["toSource", "toJSON"],
Date: ["toSource", "toLocaleFormat", "getYear", "setYear",
"toGMTString"],
RegExp: ["toSource"],
Error: ["toSource"],
};
var badThisValues = [null, undefined];
function testMethod(Class, className, method)
{
var expr;
// Try out explicit this values
for (var i = 0, sz = badThisValues.length; i < sz; i++)
{
var badThis = badThisValues[i];
expr = className + ".prototype." + method + ".call(" + badThis + ")";
try
{
Class.prototype[method].call(badThis);
throw new Error(expr + " didn't throw a TypeError");
}
catch (e)
{
assertEq(e instanceof TypeError, true,
"wrong error for " + expr + ", instead threw " + e);
}
expr = className + ".prototype." + method + ".apply(" + badThis + ")";
try
{
Class.prototype[method].apply(badThis);
throw new Error(expr + " didn't throw a TypeError");
}
catch (e)
{
assertEq(e instanceof TypeError, true,
"wrong error for " + expr + ", instead threw " + e);
}
}
// ..and for good measure..
expr = "(0, " + className + ".prototype." + method + ")()"
try
{
// comma operator to call GetValue() on the method and de-Reference it
(0, Class.prototype[method])();
throw new Error(expr + " didn't throw a TypeError");
}
catch (e)
{
assertEq(e instanceof TypeError, true,
"wrong error for " + expr + ", instead threw " + e);
}
}
for (var className in ClassToMethodMap)
{
var Class = this[className];
var methodNames = ClassToMethodMap[className];
for (var i = 0, sz = methodNames.length; i < sz; i++)
{
var method = methodNames[i];
testMethod(Class, className, method);
}
}
/******************************************************************************/
if (typeof reportCompare === "function")
reportCompare(true, true);
print("All tests passed!");