/* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ //----------------------------------------------------------------------------- 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!");