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);
|