JSTests:
[WebKit-https.git] / JSTests / stress / Object_static_methods_Object.getOwnPropertyDescriptors-proxy.js
1 function shouldBe(expected, actual, msg) {
2     if (msg === void 0)
3         msg = '';
4     else
5         msg = ' for ' + msg;
6     if (actual !== expected)
7         throw new Error('bad value' + msg + ': ' + actual + '. Expected ' + expected);
8 }
9
10 function shouldBeDataProperty(expected, value, name) {
11     if (name === void 0)
12         name = '<property descriptor>';
13     shouldBe(value, expected.value, name + '.value');
14     shouldBe(true, expected.enumerable, name + '.enumerable');
15     shouldBe(true, expected.configurable, name + '.configurable');
16     shouldBe(true, expected.writable, name + '.writable');
17     shouldBe(undefined, expected.get, name + '.get');
18     shouldBe(undefined, expected.set, name + '.set');
19 }
20
21 function shouldThrow(op, errorConstructor, desc) {
22     try {
23         op();
24         throw new Error(`Expected ${desc || 'operation'} to throw ${errorConstructor.name}, but no exception thrown`);
25     } catch (e) {
26         if (!(e instanceof errorConstructor)) {
27             throw new Error(`threw ${e}, but should have thrown ${errorConstructor.name}`);
28         }
29     }
30 }
31
32 (function testPropertyFilteringAndOrder() {
33     var log = [];
34     var sym = Symbol('test');
35     var O = {
36         0: 0,
37         [sym]: 3,
38         'a': 2,
39         1: 1
40     };
41
42     var P = new Proxy(O, {
43         ownKeys(target) {
44             log.push('ownKeys()');
45             return Reflect.ownKeys(target);
46         },
47         getOwnPropertyDescriptor(target, name) {
48             log.push(`getOwnPropertyDescriptor(${String(name)})`);
49             return Reflect.getOwnPropertyDescriptor(target, name);
50         },
51         get() { throw new Error('[[Get]] trap should be unreachable'); },
52         set() { throw new Error('[[Set]] trap should be unreachable'); },
53         deleteProperty() { throw new Error('[[Delete]] trap should be unreachable'); },
54         defineProperty() { throw new Error('[[DefineOwnProperty]] trap should be unreachable'); }
55     });
56
57     var result = Object.getOwnPropertyDescriptors(P);
58     shouldBe('ownKeys()|getOwnPropertyDescriptor(0)|getOwnPropertyDescriptor(1)|getOwnPropertyDescriptor(a)|getOwnPropertyDescriptor(Symbol(test))', log.join('|'));
59     shouldBeDataProperty(result[0], 0, 'result[0]');
60     shouldBeDataProperty(result[1], 1, 'result[1]');
61     shouldBeDataProperty(result.a, 2, 'result["a"]');
62     shouldBeDataProperty(result[sym], 3, 'result[Symbol(test)]');
63
64     var result2 = Object.getOwnPropertyDescriptors(O);
65     shouldBeDataProperty(result2[0], 0, 'result2[0]');
66     shouldBeDataProperty(result2[1], 1, 'result2[1]');
67     shouldBeDataProperty(result2.a, 2, 'result2["a"]');
68     shouldBeDataProperty(result2[sym], 3, 'result2[Symbol(test)]');
69 })();
70
71 (function testDuplicatePropertyNames() {
72     var i = 0;
73     var log = [];
74     var P = new Proxy({}, {
75     ownKeys() {
76         log.push(`ownKeys()`);
77         return [ 'A', 'A' ];
78     },
79     getOwnPropertyDescriptor(t, name) {
80         log.push(`getOwnPropertyDescriptor(${name})`);
81         if (i++) return;
82         return {
83             configurable: true,
84             writable: false,
85             value: 'VALUE'
86         };
87     },
88     get() { throw new Error('[[Get]] trap should be unreachable'); },
89     set() { throw new Error('[[Set]] trap should be unreachable'); },
90     deleteProperty() { throw new Error('[[Delete]] trap should be unreachable'); },
91     defineProperty() { throw new Error('[[DefineOwnProperty]] trap should be unreachable'); }
92   });
93
94   shouldThrow(() => Object.getOwnPropertyDescriptors(P), TypeError, 'ownKeys returning duplicates');
95   shouldBe('ownKeys()', log.join('|'));
96 })();
97
98 (function testUndefinedPropertyDescriptor() {
99     var log = [];
100     var P = new Proxy({}, {
101         ownKeys() {
102             log.push(`ownKeys()`);
103             return ['fakeProperty'];
104         },
105         getOwnPropertyDescriptor(t, name) {
106             log.push(`getOwnPropertyDescriptor(${name})`);
107             return undefined;
108         },
109         get() { throw new Error('[[Get]] trap should be unreachable'); },
110         set() { throw new Error('[[Set]] trap should be unreachable'); },
111         deleteProperty() { throw new Error('[[Delete]] trap should be unreachable'); },
112         defineProperty() { throw new Error('[[DefineOwnProperty]] trap should be unreachable'); }
113     });
114
115     var result = Object.getOwnPropertyDescriptors(P);
116     shouldBe(false, result.hasOwnProperty('fakeProperty'));
117     shouldBe(false, 'fakeProperty' in result);
118     shouldBe('ownKeys()|getOwnPropertyDescriptor(fakeProperty)', log.join('|'));
119 })();