| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- if (this.WScript && this.WScript.LoadScriptFile) { // Check for running in ch
- this.WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
- }
- function verifyObjectDescriptors(descriptors, allTruePropName, allFalsePropName) {
- var allProperties = Object.getOwnPropertyNames(descriptors).concat(Object.getOwnPropertySymbols(descriptors));
- assert.areEqual([allTruePropName, allFalsePropName], allProperties, "Result should have one descriptor for each own property");
- assert.isTrue(descriptors.hasOwnProperty(allTruePropName), "Result should contain all own properties");
- assert.isTrue(descriptors.hasOwnProperty(allFalsePropName), "Result should contain all own properties");
- assert.areEqual(descriptors[allTruePropName].value, "fooAllTrue", "Result value attribute should match the value set by defineProperties");
- assert.areEqual(descriptors[allFalsePropName].value, "fooAllFalse", "Result value attribute should match the value set by defineProperties");
- var expectedProps = ['configurable', 'writable', 'enumerable'];
- for (var i in expectedProps) {
- assert.isTrue(descriptors[allTruePropName][expectedProps[i]], "Result value attribute should match the value set by defineProperties");
- assert.isFalse(descriptors[allFalsePropName][expectedProps[i]], "Result value attribute should match the value set by defineProperties");
- }
- }
- var tests = [
- {
- name: "Object has getOwnPropertyDescriptors method",
- body: function() {
- assert.isTrue(Object.hasOwnProperty("getOwnPropertyDescriptors"), 'Object should have getOwnPropertyDescriptors method');
- assert.isFalse(Object.hasOwnProperty({}, "getOwnPropertyDescriptors"), 'New objects should have a property getOwnPropertyDescriptors');
- assert.isUndefined(Object.getOwnPropertyDescriptor({}, "getOwnPropertyDescriptors"), 'Object.getOwnPropertyDescriptor({}, "getOwnPropertyDescriptors") should be undefined');
- for (var p in {}) {
- assert.isTrue(p != "getOwnPropertyDescriptors", "getOwnPropertyDescriptors should not be enumerable on new objects");
- }
- assert.areEqual(1, Object.getOwnPropertyDescriptors.length, "Object.getOwnPropertyDescriptors requires exactly one parameter.");
- }
- },
- {
- name: "Correctly handles bad parameters.",
- body: function() {
- assert.throws(function() {
- Object.getOwnPropertyDescriptors();
- }, TypeError, "Missing first parameter should cause a TypeError.", "Object expected");
- assert.throws(function() {
- Object.getOwnPropertyDescriptors(null);
- }, TypeError, "Null first parameter should cause a TypeError", "Object expected");
- }
- },
- {
- name: "The resulting get and set are identical with the original get and set.",
- body: function() {
- // This test is adapted from https://github.com/tc39/proposal-object-getownpropertydescriptors/blob/master/test/built-ins/Object/getOwnPropertyDescriptors/has-accessors.js
- var a = {
- get a() {},
- set a(value) {}
- };
- var b = Object.getOwnPropertyDescriptors(a);
- assert.isTrue(b.a.get === Object.getOwnPropertyDescriptor(a, 'a').get);
- assert.isTrue(b.a.set === Object.getOwnPropertyDescriptor(a, 'a').set);
- }
- },
- {
- name: "For properties with string names, the list of property descriptors includes all own properties with correct descriptors",
- body: function() {
- var foo = {}
- Object.defineProperties(foo, {
- "fooAllTrue": {
- configurable: true,
- enumerable: true,
- value: "fooAllTrue",
- writable: true
- },
- "fooAllFalse": {
- configurable: false,
- enumerable: false,
- value: "fooAllFalse",
- writable: false
- }
- });
- var desc = Object.getOwnPropertyDescriptors(foo);
- assert.isTrue(desc instanceof Object, "Result must be an object");
- verifyObjectDescriptors(desc, "fooAllTrue", "fooAllFalse");
- }
- },
- {
- name: "For properties with number names, the list of property descriptors includes all own properties with correct descriptors",
- body: function() {
- var foo = {}
- var allTrueNum = 1234;
- var allFalseNum = 5678;
- Object.defineProperties(foo, {
- [allTrueNum]: {
- configurable: true,
- enumerable: true,
- value: "fooAllTrue",
- writable: true
- },
- [allFalseNum]: {
- configurable: false,
- enumerable: false,
- value: "fooAllFalse",
- writable: false
- }
- });
- var desc = Object.getOwnPropertyDescriptors(foo);
- assert.isTrue(desc instanceof Object, "Result must be an object");
- verifyObjectDescriptors(desc, allTrueNum.toString(), allFalseNum.toString());
- // Also verify that the properties are accessible as numbers
- assert.areEqual(desc[allTrueNum].value, "fooAllTrue", "For properties with number names, resulting properties should be accessible with numeric names.")
- assert.areEqual(desc[allFalseNum].value, "fooAllFalse", "For properties with number names, resulting properties should be accessible with numeric names.")
- }
- },
- {
- name: "For properties with symbol names, the list of property descriptors includes all own properties with correct descriptors",
- body: function() {
- var foo = {}
- var allTrueSymbol = Symbol("allTrue");
- var allFalseSymbol = Symbol("allFalse");
- Object.defineProperties(foo, {
- [allTrueSymbol]: {
- configurable: true,
- enumerable: true,
- value: "fooAllTrue",
- writable: true
- },
- [allFalseSymbol]: {
- configurable: false,
- enumerable: false,
- value: "fooAllFalse",
- writable: false
- }
- });
- var desc = Object.getOwnPropertyDescriptors(foo);
- assert.isTrue(desc instanceof Object, "Result must be an object");
- verifyObjectDescriptors(desc, allTrueSymbol, allFalseSymbol);
- }
- },
- {
- name:"For any property, if getOwnPropertyDescriptor(property) is undefined, that property should not be present on the result.",
- body: function() {
- // Adapted from: https://github.com/ljharb/test262/blob/c2eaa30b08fb1e041b7297e415b6bad8461f50dc/test/built-ins/Object/getOwnPropertyDescriptors/proxy-undefined-descriptor.js
- var proxyHandler = {
- getOwnPropertyDescriptor: function () {},
- };
- var key = "a";
- var obj = {};
- obj[key] = "value";
- var proxy = new Proxy(obj, proxyHandler);
- var descriptor = Object.getOwnPropertyDescriptor(proxy, key);
- assert.areEqual(undefined, descriptor, "Descriptor matches result of [[GetOwnPropertyDescriptor]] trap");
- var result = Object.getOwnPropertyDescriptors(proxy);
- assert.isFalse(result.hasOwnProperty(key), "key should not be present in result");
- }
- },
- ]
- testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });
|