summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/object/propertyIsEnumerable-proxy.js
blob: a1dda90e0ae82f9bee6e256a64ac8b5a08d0fa9b (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
55
56
57
58
59
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

function logProxy(object) {
    var log = [];
    var handler = {
        getOwnPropertyDescriptor(target, propertyKey) {
            log.push(propertyKey);
            return Object.getOwnPropertyDescriptor(target, propertyKey);
        }
    };
    var proxy = new Proxy(object, new Proxy(handler, {
        get(target, propertyKey, receiver) {
            if (!(propertyKey in target)) {
                throw new Error(`Unexpected call to trap: "${propertyKey}"`);
            }
            return target[propertyKey];
        }
    }));
    return {proxy, log};
}

var properties = ["string-property"];
if (typeof Symbol === 'function')
    properties.push(Symbol("symbol-property"));

for (var property of properties) {
    // Test 1: property is not present on object
    var {proxy, log} = logProxy({});
    var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
    assertEq(result, false);
    assertDeepEq(log, [property]);

    // Test 2: property is present on object and enumerable
    var {proxy, log} = logProxy({[property]: 0});
    var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
    assertEq(result, true);
    assertDeepEq(log, [property]);

    // Test 3: property is present on object, but not enumerable
    var {proxy, log} = logProxy(Object.defineProperty({[property]: 0}, property, {enumerable: false}));
    var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
    assertEq(result, false);
    assertDeepEq(log, [property]);

    // Test 4: property is present on prototype object
    var {proxy, log} = logProxy(Object.create({[property]: 0}));
    var result = Object.prototype.propertyIsEnumerable.call(proxy, property);
    assertEq(result, false);
    assertDeepEq(log, [property]);

    // Test 5: property is present on prototype object, prototype is proxy object
    var {proxy, log} = logProxy({[property]: 0});
    var result = Object.prototype.propertyIsEnumerable.call(Object.create(proxy), property);
    assertEq(result, false);
    assertDeepEq(log, []);
}

reportCompare(0, 0);