ladybird/Userland/Libraries/LibJS/Tests/builtins/Object/Object.getOwnPropertyDescriptor.js
Andreas Kling 686213c2b8 LibJS: Make Object.getOwnPropertyDescriptor() work on String subscripts
String objects are a bit special since the indexed properties are
overridden by the contents of the underlying PrimitiveString.

getOwnPropertyDescriptor() was not taking this into account, and would
instead return undefined when asked about an indexed property in a
String object.
2021-06-19 11:34:19 +02:00

97 lines
3 KiB
JavaScript

test("plain property", () => {
let o = { foo: "bar" };
expect(o).toHaveConfigurableProperty("foo");
expect(o).toHaveEnumerableProperty("foo");
expect(o).toHaveWritableProperty("foo");
expect(o).toHaveValueProperty("foo", "bar");
expect(o).not.toHaveGetterProperty("foo");
expect(o).not.toHaveSetterProperty("foo");
});
test("symbol property", () => {
let s = Symbol("foo");
let o = { [s]: "bar" };
expect(o).toHaveConfigurableProperty(s);
expect(o).toHaveEnumerableProperty(s);
expect(o).toHaveWritableProperty(s);
expect(o).toHaveValueProperty(s, "bar");
expect(o).not.toHaveGetterProperty(s);
expect(o).not.toHaveSetterProperty(s);
});
test("getter property", () => {
let o = { get foo() {} };
expect(o).toHaveConfigurableProperty("foo");
expect(o).toHaveEnumerableProperty("foo");
expect(o).not.toHaveWritableProperty("foo");
expect(o).not.toHaveValueProperty("foo");
expect(o).toHaveGetterProperty("foo");
expect(o).not.toHaveSetterProperty("foo");
});
test("setter property", () => {
let o = { set foo(_) {} };
expect(o).toHaveConfigurableProperty("foo");
expect(o).toHaveEnumerableProperty("foo");
expect(o).not.toHaveWritableProperty("foo");
expect(o).not.toHaveValueProperty("foo");
expect(o).not.toHaveGetterProperty("foo");
expect(o).toHaveSetterProperty("foo");
});
test("indexed property", () => {
let o = { 0: "foo" };
expect(o).toHaveConfigurableProperty(0);
expect(o).toHaveEnumerableProperty(0);
expect(o).toHaveWritableProperty(0);
expect(o).toHaveValueProperty(0, "foo");
expect(o).not.toHaveGetterProperty(0);
expect(o).not.toHaveSetterProperty(0);
expect(o).toHaveConfigurableProperty("0");
expect(o).toHaveEnumerableProperty("0");
expect(o).toHaveWritableProperty("0");
expect(o).toHaveValueProperty("0", "foo");
expect(o).not.toHaveGetterProperty("0");
expect(o).not.toHaveSetterProperty("0");
});
test("defined property", () => {
let o = {};
const attributes = {
enumerable: false,
writable: true,
value: 10,
};
Object.defineProperty(o, "foo", attributes);
Object.defineProperty(o, 1, attributes);
expect(o).not.toHaveConfigurableProperty("foo");
expect(o).not.toHaveEnumerableProperty("foo");
expect(o).toHaveWritableProperty("foo");
expect(o).toHaveValueProperty("foo", 10);
expect(o).not.toHaveGetterProperty("foo");
expect(o).not.toHaveSetterProperty("foo");
expect(o).not.toHaveConfigurableProperty(1);
expect(o).not.toHaveEnumerableProperty(1);
expect(o).toHaveWritableProperty(1);
expect(o).toHaveValueProperty(1, 10);
expect(o).not.toHaveGetterProperty(1);
expect(o).not.toHaveSetterProperty(1);
});
test("String object indexed properties", () => {
expect("foo").toHaveValueProperty(0, "f");
expect("foo").toHaveEnumerableProperty(0);
expect("foo").not.toHaveConfigurableProperty(0);
expect("foo").not.toHaveWritableProperty(0);
expect("foo").toHaveValueProperty(1, "o");
});