| /* -*- 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"); |