/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ // Reflect.ownKeys(obj) returns an array of an object's own property keys. // Test that Reflect.ownKeys gets the expected result when applied to various // objects. (These tests also check the basics: that the result is an array, // that its prototype is correct, etc.) var sym = Symbol.for("comet"); var sym2 = Symbol.for("meteor"); var cases = [ {object: {z: 3, y: 2, x: 1}, keys: ["z", "y", "x"]}, {object: [], keys: ["length"]}, {object: new Int8Array(4), keys: ["0", "1", "2", "3"]}, {object: new Proxy({a: 7}, {}), keys: ["a"]}, {object: {[sym]: "ok"}, keys: [sym]}, {object: {[sym]: 0, // test 9.1.12 ordering "str": 0, "773": 0, "0": 0, [sym2]: 0, "-1": 0, "8": 0, "second str": 0}, keys: ["0", "8", "773", // indexes in numeric order "str", "-1", "second str", // strings in insertion order sym, sym2]}, // symbols in insertion order {object: newGlobal().Math, // cross-compartment wrapper keys: Reflect.ownKeys(Math)} ]; for (var {object, keys} of cases) assertDeepEq(Reflect.ownKeys(object), keys); // Reflect.ownKeys() creates a new array each time it is called. var object = {}, keys = []; for (var i = 0; i < 3; i++) { var newKeys = Reflect.ownKeys(object); assertEq(newKeys !== keys, true); keys = newKeys; } // Proxy behavior with successful ownKeys() handler keys = ["str", "0"]; obj = {}; proxy = new Proxy(obj, { ownKeys() { return keys; } }); var actual = Reflect.ownKeys(proxy); assertDeepEq(actual, keys); // we get correct answers assertEq(actual !== keys, true); // but not the same object // If a proxy breaks invariants, a TypeError is thrown. var obj = Object.preventExtensions({}); var proxy = new Proxy(obj, { ownKeys() { return ["something"]; } }); assertThrowsInstanceOf(() => Reflect.ownKeys(proxy), TypeError); // For more Reflect.ownKeys tests, see target.js. reportCompare(0, 0);