import { assert, assertArrayEquals, assertThrows } from "./assert.js";
function innerProxy(target, isExtensible) {
return new Proxy(target, { isExtensible });
}
assertThrows(TypeError, () => Reflect.defineProperty(
new Proxy(innerProxy({}, 0), { defineProperty: () => true }), "x", {}));
assertThrows(TypeError, () => Reflect.defineProperty(
new Proxy(innerProxy({ x: 1 }, 0), { defineProperty: () => true }), "x", {}));
assertThrows(TypeError, () => Reflect.getOwnPropertyDescriptor(
new Proxy(innerProxy({ x: 1 }, 0), { getOwnPropertyDescriptor: () => undefined }), "x"));
assertThrows(TypeError, () => Reflect.has(
new Proxy(innerProxy({ x: 1 }, 0), { has: () => false }), "x"));
assertThrows(TypeError, () => Reflect.defineProperty(
new Proxy(innerProxy({}, () => false), { defineProperty: () => true }), "x", {}));
for (const op of [
(p) => Reflect.defineProperty(new Proxy(p, { defineProperty: () => true }), "x", {}),
(p) => Reflect.getOwnPropertyDescriptor(new Proxy(p, { getOwnPropertyDescriptor: () => undefined }), "x"),
(p) => Reflect.has(new Proxy(p, { has: () => false }), "x"),
]) {
assertThrows(RangeError, () => op(innerProxy({ x: 1 }, () => { throw new RangeError(); })));
}
function trapLog(target, op, expected) {
const log = [];
const p = new Proxy(target, {
getOwnPropertyDescriptor(t, k) { log.push("gOPD"); return Reflect.getOwnPropertyDescriptor(t, k); },
isExtensible(t) { log.push("isExtensible"); return Reflect.isExtensible(t); },
});
assert(op(p), expected);
return log;
}
assertArrayEquals(trapLog({ x: 1 }, (p) => Reflect.defineProperty(
new Proxy(p, { defineProperty: () => true }), "x", { value: 2 }), true), ["gOPD", "isExtensible"]);
assertArrayEquals(trapLog({ x: 1 }, (p) => Reflect.getOwnPropertyDescriptor(
new Proxy(p, { getOwnPropertyDescriptor: () => undefined }), "x"), undefined), ["gOPD", "isExtensible"]);
assertArrayEquals(trapLog({ x: 1 }, (p) => Reflect.has(
new Proxy(p, { has: () => false }), "x"), false), ["gOPD", "isExtensible"]);
assertArrayEquals(trapLog({}, (p) => Reflect.has(
new Proxy(p, { has: () => false }), "x"), false), ["gOPD"]);
assertArrayEquals(trapLog({}, (p) => Reflect.getOwnPropertyDescriptor(
new Proxy(p, { getOwnPropertyDescriptor: () => undefined }), "x"), undefined), ["gOPD"]);
assertArrayEquals(trapLog({}, (p) => Reflect.defineProperty(
new Proxy(p, { defineProperty: () => true }), "x", { value: 1 }), true), ["gOPD", "isExtensible"]);