| Index: test/mjsunit/harmony/object-values.js
|
| diff --git a/test/mjsunit/harmony/object-values.js b/test/mjsunit/harmony/object-values.js
|
| index e312889f854fa3544e00ea7b0908f787b6260f69..f56fe8a7b3a6d8d9c45ac6e7b355871a78d058bd 100644
|
| --- a/test/mjsunit/harmony/object-values.js
|
| +++ b/test/mjsunit/harmony/object-values.js
|
| @@ -3,10 +3,19 @@
|
| // found in the LICENSE file.
|
|
|
| // Flags: --harmony-object-values-entries --harmony-proxies --harmony-reflect
|
| +// Flags: --allow-natives-syntax
|
|
|
| function TestMeta() {
|
| assertEquals(1, Object.values.length);
|
| assertEquals(Function.prototype, Object.getPrototypeOf(Object.values));
|
| + assertEquals("values", Object.values.name);
|
| +
|
| + var descriptor = Object.getOwnPropertyDescriptor(Object, "values");
|
| + assertTrue(descriptor.writable);
|
| + assertFalse(descriptor.enumerable);
|
| + assertTrue(descriptor.configurable);
|
| +
|
| + assertThrows(() => new Object.values({}), TypeError);
|
| }
|
| TestMeta();
|
|
|
| @@ -27,10 +36,21 @@ function TestBasic() {
|
| Object.defineProperty(O, "HIDDEN", { enumerable: false, value: NaN });
|
| assertEquals([123, "ducks", 456, 1, 3, "quack", 2, 4], Object.values(O));
|
| assertEquals(Object.values(O), Object.keys(O).map(key => O[key]));
|
| +
|
| + assertTrue(Array.isArray(Object.values({})));
|
| + assertEquals(0, Object.values({}).length);
|
| }
|
| TestBasic();
|
|
|
|
|
| +function TestToObject() {
|
| + assertThrows(function() { Object.values(); }, TypeError);
|
| + assertThrows(function() { Object.values(null); }, TypeError);
|
| + assertThrows(function() { Object.values(void 0); }, TypeError);
|
| +}
|
| +TestToObject();
|
| +
|
| +
|
| function TestOrder() {
|
| var O = {
|
| a: 1,
|
| @@ -38,6 +58,8 @@ function TestOrder() {
|
| };
|
| O[456] = 123;
|
| Object.defineProperty(O, "HIDDEN", { enumerable: false, value: NaN });
|
| + var priv = %CreatePrivateSymbol("Secret");
|
| + O[priv] = 56;
|
|
|
| var log = [];
|
| var P = new Proxy(O, {
|
| @@ -49,6 +71,10 @@ function TestOrder() {
|
| log.push(`[[Get]](${JSON.stringify(name)})`);
|
| return Reflect.get(target, name);
|
| },
|
| + getOwnPropertyDescriptor(target, name) {
|
| + log.push(`[[GetOwnProperty]](${JSON.stringify(name)})`);
|
| + return Reflect.getOwnPropertyDescriptor(target, name);
|
| + },
|
| set(target, name, value) {
|
| assertUnreachable();
|
| }
|
| @@ -57,8 +83,147 @@ function TestOrder() {
|
| assertEquals([123, 1], Object.values(P));
|
| assertEquals([
|
| "[[OwnPropertyKeys]]",
|
| + "[[GetOwnProperty]](\"456\")",
|
| "[[Get]](\"456\")",
|
| - "[[Get]](\"a\")"
|
| + "[[GetOwnProperty]](\"a\")",
|
| + "[[Get]](\"a\")",
|
| + "[[GetOwnProperty]](\"HIDDEN\")"
|
| ], log);
|
| }
|
| TestOrder();
|
| +
|
| +
|
| +function TestOrderWithDuplicates() {
|
| + var O = {
|
| + a: 1,
|
| + [Symbol.iterator]: null
|
| + };
|
| + O[456] = 123;
|
| + Object.defineProperty(O, "HIDDEN", { enumerable: false, value: NaN });
|
| + O[priv] = 56;
|
| + var priv = %CreatePrivateSymbol("private");
|
| +
|
| + var log = [];
|
| + var P = new Proxy(O, {
|
| + ownKeys(target) {
|
| + log.push("[[OwnPropertyKeys]]");
|
| + return [ "a", Symbol.iterator, "a", "456", "HIDDEN", "HIDDEN", "456" ];
|
| + },
|
| + get(target, name) {
|
| + log.push(`[[Get]](${JSON.stringify(name)})`);
|
| + return Reflect.get(target, name);
|
| + },
|
| + getOwnPropertyDescriptor(target, name) {
|
| + log.push(`[[GetOwnProperty]](${JSON.stringify(name)})`);
|
| + return Reflect.getOwnPropertyDescriptor(target, name);
|
| + },
|
| + set(target, name, value) {
|
| + assertUnreachable();
|
| + }
|
| + });
|
| +
|
| + assertEquals([1, 1, 123, 123], Object.values(P));
|
| + assertEquals([
|
| + "[[OwnPropertyKeys]]",
|
| + "[[GetOwnProperty]](\"a\")",
|
| + "[[Get]](\"a\")",
|
| + "[[GetOwnProperty]](\"a\")",
|
| + "[[Get]](\"a\")",
|
| + "[[GetOwnProperty]](\"456\")",
|
| + "[[Get]](\"456\")",
|
| + "[[GetOwnProperty]](\"HIDDEN\")",
|
| + "[[GetOwnProperty]](\"HIDDEN\")",
|
| + "[[GetOwnProperty]](\"456\")",
|
| + "[[Get]](\"456\")",
|
| + ], log);
|
| +}
|
| +TestOrderWithDuplicates();
|
| +
|
| +
|
| +function TestPropertyFilter() {
|
| + var object = { prop3: 30 };
|
| + object[2] = 40;
|
| + object["prop4"] = 50;
|
| + Object.defineProperty(object, "prop5", { value: 60, enumerable: true });
|
| + Object.defineProperty(object, "prop6", { value: 70, enumerable: false });
|
| + Object.defineProperty(object, "prop7", {
|
| + enumerable: true, get() { return 80; }});
|
| + var sym = Symbol("prop8");
|
| + object[sym] = 90;
|
| +
|
| + values = Object.values(object);
|
| + assertEquals(5, values.length);
|
| + assertEquals([40,30,50,60,80], values);
|
| +}
|
| +TestPropertyFilter();
|
| +
|
| +
|
| +function TestWithProxy() {
|
| + var obj1 = {prop1:10};
|
| + var proxy1 = new Proxy(obj1, { });
|
| + assertEquals([10], Object.values(proxy1));
|
| +
|
| + var obj2 = {};
|
| + Object.defineProperty(obj2, "prop2", { value: 20, enumerable: true });
|
| + Object.defineProperty(obj2, "prop3", {
|
| + get() { return 30; }, enumerable: true });
|
| + var proxy2 = new Proxy(obj2, {
|
| + getOwnPropertyDescriptor(target, name) {
|
| + return Reflect.getOwnPropertyDescriptor(target, name);
|
| + }
|
| + });
|
| + assertEquals([20, 30], Object.values(proxy2));
|
| +
|
| + var obj3 = {};
|
| + var count = 0;
|
| + var proxy3 = new Proxy(obj3, {
|
| + get(target, property, receiver) {
|
| + return count++ * 5;
|
| + },
|
| + getOwnPropertyDescriptor(target, property) {
|
| + return { configurable: true, enumerable: true };
|
| + },
|
| + ownKeys(target) {
|
| + return [ "prop0", "prop1", Symbol("prop2"), Symbol("prop5") ];
|
| + }
|
| + });
|
| + assertEquals([0, 5], Object.values(proxy3));
|
| +}
|
| +TestWithProxy();
|
| +
|
| +
|
| +function TestMutateDuringEnumeration() {
|
| + var aDeletesB = {
|
| + get a() {
|
| + delete this.b;
|
| + return 1;
|
| + },
|
| + b: 2
|
| + };
|
| + assertEquals([1], Object.values(aDeletesB));
|
| +
|
| + var aRemovesB = {
|
| + get a() {
|
| + Object.defineProperty(this, "b", { enumerable: false });
|
| + return 1;
|
| + },
|
| + b: 2
|
| + };
|
| + assertEquals([1], Object.values(aRemovesB));
|
| +
|
| + var aAddsB = { get a() { this.b = 2; return 1; } };
|
| + assertEquals([1], Object.values(aAddsB));
|
| +
|
| + var aMakesBEnumerable = {};
|
| + Object.defineProperty(aMakesBEnumerable, "a", {
|
| + get() {
|
| + Object.defineProperty(this, "b", { enumerable: true });
|
| + return 1;
|
| + },
|
| + enumerable: true
|
| + });
|
| + Object.defineProperty(aMakesBEnumerable, "b", {
|
| + value: 2, configurable:true, enumerable: false });
|
| + assertEquals([1, 2], Object.values(aMakesBEnumerable));
|
| +}
|
| +TestMutateDuringEnumeration();
|
|
|