summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/object/defineProperty-proxy.js
blob: b5ece940bc4f9690331e23371b9428af7c3ecadf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/* 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);