/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/ */

// Test details of the implementation of ToPropertyDescriptor exposed to scripts
// thanks to scriptable proxies.

// A LoggingProxy object logs certain operations performed on it.
var log = [];
function LoggingProxy(target) {
    return new Proxy(target, {
        has: function (t, id) {
            log.push("has " + id);
            return id in t;
        },
        get: function (t, id) {
            log.push("get " + id);
            return t[id];
        }
    });
}

// Tragically, we use separate code to implement Object.defineProperty on
// arrays and on proxies. So run the test three times.
var testSubjects = [
    {},
    [],
    new Proxy({}, {})
];

for (var obj of testSubjects) {
    log = [];

    // Object.defineProperty is one public method that performs a
    // ToPropertyDescriptor call.
    Object.defineProperty(obj, "x", new LoggingProxy({
        enumerable: true,
        configurable: true,
        value: 3,
        writable: true
    }));

    // It should have performed exactly these operations on the proxy, in this
    // order. See ES6 rev 24 (2014 April 27) 6.2.4.5 ToPropertyDescriptor.
    assertDeepEq(log, [
        "has enumerable", "get enumerable",
        "has configurable", "get configurable",
        "has value", "get value",
        "has writable", "get writable",
        "has get",
        "has set"
    ]);
}

reportCompare(0, 0);
