diff options
Diffstat (limited to 'Userland/Libraries/LibJS/Tests/builtins/Object/Object.preventExtensions.js')
-rw-r--r-- | Userland/Libraries/LibJS/Tests/builtins/Object/Object.preventExtensions.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Userland/Libraries/LibJS/Tests/builtins/Object/Object.preventExtensions.js b/Userland/Libraries/LibJS/Tests/builtins/Object/Object.preventExtensions.js new file mode 100644 index 0000000000..292c3f5999 --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/builtins/Object/Object.preventExtensions.js @@ -0,0 +1,67 @@ +describe("correct behavior", () => { + test("non-object arguments", () => { + expect(Object.preventExtensions()).toBeUndefined(); + expect(Object.preventExtensions(undefined)).toBeUndefined(); + expect(Object.preventExtensions(null)).toBeNull(); + expect(Object.preventExtensions(true)).toBeTrue(); + expect(Object.preventExtensions(6)).toBe(6); + expect(Object.preventExtensions("test")).toBe("test"); + + let s = Symbol(); + expect(Object.preventExtensions(s)).toBe(s); + }); + + test("basic functionality", () => { + let o = { foo: "foo" }; + expect(o.foo).toBe("foo"); + o.bar = "bar"; + expect(o.bar).toBe("bar"); + + expect(Object.preventExtensions(o)).toBe(o); + expect(o.foo).toBe("foo"); + expect(o.bar).toBe("bar"); + + o.baz = "baz"; + expect(o.baz).toBeUndefined(); + }); + + test("modifying existing properties", () => { + const o = { foo: "bar" }; + Object.preventExtensions(o); + o.foo = "baz"; + expect(o.foo).toBe("baz"); + }); + + test("deleting existing properties", () => { + const o = { foo: "bar" }; + Object.preventExtensions(o); + delete o.foo; + expect(o).not.toHaveProperty("foo"); + }); +}); + +describe("errors", () => { + test("defining a property on a non-extensible object", () => { + let o = {}; + Object.preventExtensions(o); + + expect(() => { + Object.defineProperty(o, "baz", { value: "baz" }); + }).toThrowWithMessage(TypeError, "Cannot define property baz on non-extensible object"); + + expect(o.baz).toBeUndefined(); + }); + + test("putting property on a non-extensible object", () => { + let o = {}; + Object.preventExtensions(o); + + expect(() => { + "use strict"; + o.foo = "foo"; + }).toThrowWithMessage(TypeError, "Cannot define property foo on non-extensible object"); + + expect((o.foo = "foo")).toBe("foo"); + expect(o.foo).toBeUndefined(); + }); +}); |