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