diff options
Diffstat (limited to 'Userland/Libraries/LibJS/Tests/builtins/Proxy/Proxy.handler-apply.js')
-rw-r--r-- | Userland/Libraries/LibJS/Tests/builtins/Proxy/Proxy.handler-apply.js | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Tests/builtins/Proxy/Proxy.handler-apply.js b/Userland/Libraries/LibJS/Tests/builtins/Proxy/Proxy.handler-apply.js new file mode 100644 index 0000000000..0e59d4f473 --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/builtins/Proxy/Proxy.handler-apply.js @@ -0,0 +1,36 @@ +describe("[[Call]] trap normal behavior", () => { + test("forwarding when not defined in handler", () => { + let p = new Proxy(() => 5, { apply: null }); + expect(p()).toBe(5); + p = new Proxy(() => 5, { apply: undefined }); + expect(p()).toBe(5); + p = new Proxy(() => 5, {}); + expect(p()).toBe(5); + }); + + test("correct arguments supplied to trap", () => { + const f = (a, b) => a + b; + const handler = { + apply(target, this_, arguments) { + expect(target).toBe(f); + expect(this_).toBe(handler); + if (arguments[2]) return arguments[0] * arguments[1]; + return f(...arguments); + }, + }; + p = new Proxy(f, handler); + + expect(p(2, 4)).toBe(6); + expect(p(2, 4, true)).toBe(8); + }); +}); + +describe("[[Call]] invariants", () => { + test("target must have a [[Call]] slot", () => { + [{}, [], new Proxy({}, {})].forEach(item => { + expect(() => { + new Proxy(item, {})(); + }).toThrowWithMessage(TypeError, "[object ProxyObject] is not a function"); + }); + }); +}); |