michael@0: // Any copyright is dedicated to the Public Domain. michael@0: // http://creativecommons.org/licenses/publicdomain/ michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: var BUGNUMBER = 430133; michael@0: var summary = 'ES5 Object.defineProperty(O, P, Attributes)'; michael@0: michael@0: print(BUGNUMBER + ": " + summary); michael@0: michael@0: /************** michael@0: * BEGIN TEST * michael@0: **************/ michael@0: michael@0: var o = []; michael@0: Object.defineProperty(o, 0, { value: 17 }); michael@0: var desc = Object.getOwnPropertyDescriptor(o, 0); michael@0: assertEq(desc !== undefined, true); michael@0: assertEq(desc.value, 17); michael@0: assertEq(desc.enumerable, false); michael@0: assertEq(desc.configurable, false); michael@0: assertEq(desc.writable, false); michael@0: michael@0: desc = Object.getOwnPropertyDescriptor(o, "length"); michael@0: assertEq(desc !== undefined, true); michael@0: assertEq(desc.enumerable, false); michael@0: assertEq(desc.configurable, false); michael@0: assertEq(desc.writable, true); michael@0: assertEq(desc.value, 1); michael@0: assertEq(o.length, 1); michael@0: michael@0: Object.defineProperty(o, "foobar", michael@0: { value: 42, enumerable: false, configurable: true }); michael@0: assertEq(o.foobar, 42); michael@0: desc = Object.getOwnPropertyDescriptor(o, "foobar"); michael@0: assertEq(desc !== undefined, true); michael@0: assertEq(desc.value, 42); michael@0: assertEq(desc.configurable, true); michael@0: assertEq(desc.enumerable, false); michael@0: assertEq(desc.writable, false); michael@0: michael@0: var called = false; michael@0: o = { set x(a) { called = true; } }; michael@0: Object.defineProperty(o, "x", { get: function() { return "get"; } }); michael@0: desc = Object.getOwnPropertyDescriptor(o, "x"); michael@0: assertEq("set" in desc, true); michael@0: assertEq("get" in desc, true); michael@0: assertEq(called, false); michael@0: o.x = 13; michael@0: assertEq(called, true); michael@0: michael@0: var toSource = Object.prototype.toSource || function() { }; michael@0: toSource.call(o); // a test for this not crashing michael@0: michael@0: var called = false; michael@0: var o = michael@0: Object.defineProperty({}, "foo", michael@0: { get: function() { return 17; }, michael@0: set: function(v) { called = true; } }); michael@0: michael@0: assertEq(o.foo, 17); michael@0: o.foo = 42; michael@0: assertEq(called, true); michael@0: michael@0: /* michael@0: * XXX need tests for Object.defineProperty(array, "length", { ... }) when we michael@0: * support it! michael@0: */ michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true); michael@0: michael@0: print("All tests passed!");