59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
describe("[[PreventExtension]] trap normal behavior", () => {
|
|
test("forwarding when not defined in handler", () => {
|
|
let p = new Proxy({}, { preventExtensions: null });
|
|
expect(Object.preventExtensions(p)).toBe(p);
|
|
p = new Proxy({}, { preventExtensions: undefined });
|
|
expect(Object.preventExtensions(p)).toBe(p);
|
|
p = new Proxy({}, {});
|
|
expect(Object.preventExtensions(p)).toBe(p);
|
|
});
|
|
|
|
test("correct arguments supplied to trap", () => {
|
|
let o = {};
|
|
p = new Proxy(o, {
|
|
preventExtensions(target) {
|
|
expect(target).toBe(o);
|
|
return true;
|
|
},
|
|
});
|
|
|
|
Object.preventExtensions(o);
|
|
Object.preventExtensions(p);
|
|
});
|
|
});
|
|
|
|
describe("[[PreventExtensions]] invariants", () => {
|
|
test("cannot return false", () => {
|
|
let p = new Proxy(
|
|
{},
|
|
{
|
|
preventExtensions() {
|
|
return false;
|
|
},
|
|
}
|
|
);
|
|
|
|
expect(() => {
|
|
Object.preventExtensions(p);
|
|
}).toThrowWithMessage(TypeError, "Object's [[PreventExtensions]] method returned false");
|
|
});
|
|
|
|
test("cannot return true if the target is extensible", () => {
|
|
let o = {};
|
|
let p = new Proxy(o, {
|
|
preventExtensions() {
|
|
return true;
|
|
},
|
|
});
|
|
|
|
expect(() => {
|
|
Object.preventExtensions(p);
|
|
}).toThrowWithMessage(
|
|
TypeError,
|
|
"Proxy handler's preventExtensions trap violates invariant: cannot return true if the target object is extensible"
|
|
);
|
|
|
|
Object.preventExtensions(o);
|
|
expect(Object.preventExtensions(p)).toBe(p);
|
|
});
|
|
});
|