Source code
Revision control
Copy as Markdown
Other Tools
/*
* Any copyright is dedicated to the Public Domain.
*/
//-----------------------------------------------------------------------------
var BUGNUMBER = 430133;
var summary = 'ES5 Object.defineProperties(O, Properties)';
print(BUGNUMBER + ": " + summary);
/**************
* BEGIN TEST *
**************/
assertEq("defineProperties" in Object, true);
assertEq(Object.defineProperties.length, 2);
var o, props, desc, passed;
o = {};
props =
{
a: { value: 17, enumerable: true, configurable: true, writable: true },
b: { value: 42, enumerable: false, configurable: false, writable: false }
};
Object.defineProperties(o, props);
assertEq("a" in o, true);
assertEq("b" in o, true);
desc = Object.getOwnPropertyDescriptor(o, "a");
assertEq(desc.value, 17);
assertEq(desc.enumerable, true);
assertEq(desc.configurable, true);
assertEq(desc.writable, true);
desc = Object.getOwnPropertyDescriptor(o, "b");
assertEq(desc.value, 42);
assertEq(desc.enumerable, false);
assertEq(desc.configurable, false);
assertEq(desc.writable, false);
props =
{
c: { value: NaN, enumerable: false, configurable: true, writable: true },
b: { value: 44 }
};
var error = "before";
try
{
Object.defineProperties(o, props);
error = "no exception thrown";
}
catch (e)
{
if (e instanceof TypeError)
error = "typeerror";
else
error = "bad exception: " + e;
}
assertEq(error, "typeerror", "didn't throw or threw wrongly");
assertEq("c" in o, true, "new property added");
assertEq(o.b, 42, "old property value preserved");
function Properties() { }
Properties.prototype = { b: { value: 42, enumerable: true } };
props = new Properties();
Object.defineProperty(props, "a", { enumerable: false });
o = {};
Object.defineProperties(o, props);
assertEq("a" in o, false);
assertEq(Object.getOwnPropertyDescriptor(o, "a"), undefined,
"Object.defineProperties(O, Properties) should only use enumerable " +
"properties on Properties");
assertEq("b" in o, false);
assertEq(Object.getOwnPropertyDescriptor(o, "b"), undefined,
"Object.defineProperties(O, Properties) should only use enumerable " +
"properties directly on Properties");
Number.prototype.foo = { value: 17, enumerable: true };
Boolean.prototype.bar = { value: 8675309, enumerable: true };
String.prototype.quux = { value: "Are you HAPPY yet?", enumerable: true };
o = {};
Object.defineProperties(o, 5); // ToObject only throws for null/undefined
assertEq("foo" in o, false, "foo is not an enumerable own property");
Object.defineProperties(o, false);
assertEq("bar" in o, false, "bar is not an enumerable own property");
Object.defineProperties(o, "");
assertEq("quux" in o, false, "quux is not an enumerable own property");
error = "before";
try
{
Object.defineProperties(o, "1");
}
catch (e)
{
if (e instanceof TypeError)
error = "typeerror";
else
error = "bad exception: " + e;
}
assertEq(error, "typeerror",
"should throw on Properties == '1' due to '1'[0] not being a " +
"property descriptor");
error = "before";
try
{
Object.defineProperties(o, null);
}
catch (e)
{
if (e instanceof TypeError)
error = "typeerror";
else
error = "bad exception: " + e;
}
assertEq(error, "typeerror", "should throw on Properties == null");
error = "before";
try
{
Object.defineProperties(o, undefined);
}
catch (e)
{
if (e instanceof TypeError)
error = "typeerror";
else
error = "bad exception: " + e;
}
assertEq(error, "typeerror", "should throw on Properties == undefined");
/******************************************************************************/
reportCompare(true, true);
print("All tests passed!");