/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ //----------------------------------------------------------------------------- var BUGNUMBER = 505587; var summary = 'ES5 Object.getOwnPropertyDescriptor(O)'; var actual = ''; var expect = ''; printBugNumber(BUGNUMBER); printStatus (summary); /************** * BEGIN TEST * **************/ function assertEq(a, e, msg) { function SameValue(v1, v2) { if (v1 === 0 && v2 === 0) return 1 / v1 === 1 / v2; if (v1 !== v1 && v2 !== v2) return true; return v1 === v2; } if (!SameValue(a, e)) { var stack = new Error().stack || ""; throw "Assertion failed: got " + a + ", expected " + e + (msg ? ": " + msg : "") + (stack ? "\nStack:\n" + stack : ""); } } function expectDescriptor(actual, expected) { if (actual === undefined && expected === undefined) return; assertEq(typeof actual, "object"); assertEq(typeof expected, "object"); var fields = { value: true, get: true, set: true, enumerable: true, writable: true, configurable: true }; for (var p in fields) assertEq(actual.hasOwnProperty(p), expected.hasOwnProperty(p), p); for (var p in actual) assertEq(p in fields, true, p); for (var p in expected) assertEq(p in fields, true, p); assertEq(actual.hasOwnProperty("value"), actual.hasOwnProperty("writable")); assertEq(actual.hasOwnProperty("get"), actual.hasOwnProperty("set")); if (actual.hasOwnProperty("value")) { assertEq(actual.value, expected.value); assertEq(actual.writable, expected.writable); } else { assertEq(actual.get, expected.get); assertEq(actual.set, expected.set); } assertEq(actual.hasOwnProperty("enumerable"), true); assertEq(actual.hasOwnProperty("configurable"), true); assertEq(actual.enumerable, expected.enumerable); assertEq(actual.configurable, expected.configurable); } function adjustDescriptorField(o, actual, expect, field) { assertEq(field === "get" || field === "set", true); var lookup = "__lookup" + (field === "get" ? "G" : "S") + "etter"; if (typeof o[lookup] === "function") expect[field] = o[lookup](field); else actual[field] = expect[field] = undefined; /* censor if we can't lookup */ } /******************************************************************************/ var o, pd, expected; o = { get x() { return 12; } }; pd = Object.getOwnPropertyDescriptor(o, "x"); expected = { set: undefined, enumerable: true, configurable: true }; adjustDescriptorField(o, pd, expected, "get"); expectDescriptor(pd, expected); /******************************************************************************/ var o2; o = Object.create(Object.prototype, { x: {get: function () { return 12; } } }); pd = Object.getOwnPropertyDescriptor(o, "x"); expected = { set: undefined, enumerable: false, configurable: false }; adjustDescriptorField(o, pd, expected, "get"); expectDescriptor(pd, expected); o2 = Object.create(o); assertEq(Object.getOwnPropertyDescriptor(o2, "x"), undefined); /******************************************************************************/ o = {}; o.b = 12; pd = Object.getOwnPropertyDescriptor(o, "b"); expected = { value: 12, writable: true, enumerable: true, configurable: true }; expectDescriptor(pd, expected); /******************************************************************************/ o = { get y() { return 17; }, set y(z) { } }; pd = Object.getOwnPropertyDescriptor(o, "y"); expected = { enumerable: true, configurable: true }; adjustDescriptorField(o, pd, expected, "get"); adjustDescriptorField(o, pd, expected, "set"); expectDescriptor(pd, expected); /******************************************************************************/ o = {}; pd = Object.getOwnPropertyDescriptor(o, "absent"); expectDescriptor(pd, undefined); /******************************************************************************/ pd = Object.getOwnPropertyDescriptor([], "length"); expected = { value: 0, writable: true, enumerable: false, configurable: false }; expectDescriptor(pd, expected); pd = Object.getOwnPropertyDescriptor([1], "length"); expected = { value: 1, writable: true, enumerable: false, configurable: false }; expectDescriptor(pd, expected); pd = Object.getOwnPropertyDescriptor([1,], "length"); expected = { value: 1, writable: true, enumerable: false, configurable: false }; expectDescriptor(pd, expected); pd = Object.getOwnPropertyDescriptor([1,,], "length"); expected = { value: 2, writable: true, enumerable: false, configurable: false }; expectDescriptor(pd, expected); /******************************************************************************/ pd = Object.getOwnPropertyDescriptor(new String("foobar"), "length"); expected = { value: 6, writable: false, enumerable: false, configurable: false }; expectDescriptor(pd, expected); /******************************************************************************/ function foo() { } o = foo; pd = Object.getOwnPropertyDescriptor(o, "length"); expected = { value: 0, writable: false, enumerable: false, configurable: true }; expectDescriptor(pd, expected); pd = Object.getOwnPropertyDescriptor(o, "prototype"); expected = { value: foo.prototype, writable: true, enumerable: false, configurable: false }; expectDescriptor(pd, expected); /******************************************************************************/ pd = Object.getOwnPropertyDescriptor(Function, "length"); expected = { value: 1, writable: false, enumerable: false, configurable: true }; expectDescriptor(pd, expected); /******************************************************************************/ o = /foo/im; pd = Object.getOwnPropertyDescriptor(o, "lastIndex"); expected = { value: 0, writable: true, enumerable: false, configurable: false }; expectDescriptor(pd, expected); /******************************************************************************/ reportCompare(expect, actual, "Object.getOwnPropertyDescriptor"); printStatus("All tests passed");