-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathex1.test.js
More file actions
66 lines (55 loc) · 1.67 KB
/
ex1.test.js
File metadata and controls
66 lines (55 loc) · 1.67 KB
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
60
61
62
63
64
65
66
'use strict';
const { createHidingProxy } = require('./ex1');
function assert(condition, message) {
if (!condition) throw new Error(message || 'Assertion failed');
}
function assertThrows(fn, expectedMessagePart) {
let threw = false;
try {
fn();
} catch (err) {
threw = true;
if (expectedMessagePart) {
assert(
String(err && err.message).includes(expectedMessagePart),
`Expected error message to include "${expectedMessagePart}"`
);
}
}
assert(threw, 'Expected function to throw');
}
{
const target = { visible: 1, secret: 2 };
const proxy = createHidingProxy(target, ['secret']);
assert(proxy.secret === undefined, 'Expected hidden property access to return undefined');
assert(('secret' in proxy) === false, 'Expected hidden property to be absent in `in` checks');
assert(Object.keys(proxy).includes('secret') === false, 'Expected Object.keys to hide property');
assert(Reflect.ownKeys(proxy).includes('secret') === false, 'Expected Reflect.ownKeys to hide property');
assert(proxy.visible === 1, 'Expected non-hidden property to remain accessible');
}
{
const target = {};
Object.defineProperty(target, 'fixed', {
value: 123,
configurable: false,
enumerable: true,
});
assertThrows(
() => createHidingProxy(target, ['fixed']),
'non-configurable'
);
}
{
let proxyRef = null;
const target = {
get receiverKind() {
return this === proxyRef ? 'proxy' : 'target';
},
};
proxyRef = createHidingProxy(target, []);
assert(
proxyRef.receiverKind === 'proxy',
'Expected getter receiver semantics to be preserved via Reflect.get'
);
}
console.log('ex1 tests passed');