summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Symbol/enumeration.js
blob: de993d69a78f6947923f7e012cdf28a267ee1f2d (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
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/ */

// for-in loops skip properties with symbol keys, even enumerable properties.
var obj = {};
obj[Symbol.for("moon")] = "sun";
obj[Symbol("asleep")] = "awake";
obj[Symbol.iterator] = "List";
for (var x in obj)
    throw "FAIL: " + String(x);

// This includes inherited properties.
var obj2 = Object.create(obj);
for (var x in obj2)
    throw "FAIL: " + String(x);

// The same goes for proxies.
var p = new Proxy(obj, {});
for (var x in p)
    throw "FAIL: " + String(x);
var p2 = new Proxy(obj2, {});
for (var x in p2)
    throw "FAIL: " + String(x);

// Object.keys() and .getOwnPropertyNames() also skip symbols.
assertEq(Object.keys(obj).length, 0);
assertEq(Object.keys(p).length, 0);
assertEq(Object.keys(obj2).length, 0);
assertEq(Object.keys(p2).length, 0);
assertEq(Object.getOwnPropertyNames(obj).length, 0);
assertEq(Object.getOwnPropertyNames(p).length, 0);
assertEq(Object.getOwnPropertyNames(obj2).length, 0);
assertEq(Object.getOwnPropertyNames(p2).length, 0);

// Test interaction of Object.keys(), proxies, and symbol property keys.
var log = [];
var h = {
    ownKeys: (t) => {
        log.push("ownKeys");
        return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator];
    },
    getOwnPropertyDescriptor: (t, key) => {
        log.push("gopd", key);
        return {configurable: true, enumerable: true, value: 0, writable: true};
    }
};
p = new Proxy({}, h);
assertDeepEq(Object.keys(p), ["a", "0"]);
assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);

if (typeof reportCompare === "function")
    reportCompare(0, 0);