ladybird/Libraries/LibJS/Tests/builtins/Object/Object.defineProperties.js
Aliaksandr Kalenik e81833423b LibJS: Add PutByNumericId and change PutById to be string key only
Previously, PutById constructed a PropertyKey from the identifier,
which coerced numeric-like strings to numbers. This moves that decision
to bytecode generation: the bytecode generator now emits PutByNumericId
for numeric keys and PutById for string keys. This removes per-execution
parsing from the interpreter.

1.4x speedup on the following microbenchmark:
```js
const o = {};
for (let i = 0; i < 10_000_000; i++) {
    o.a = 1;
    o.b = 2;
    o.c = 3;
}
```
2025-09-13 20:02:28 +02:00

64 lines
1.8 KiB
JavaScript

test("length is 2", () => {
expect(Object.defineProperties).toHaveLength(2);
});
describe("errors", () => {
test("non-object argument", () => {
expect(() => Object.defineProperties(42, {})).toThrowWithMessage(
TypeError,
"Object argument is not an object"
);
});
});
describe("normal behavior", () => {
test("returns given object", () => {
const o = {};
expect(Object.defineProperties(o, {})).toBe(o);
});
test("defines given properties on object", () => {
const properties = {
foo: {
writable: true,
configurable: true,
value: "foo",
},
bar: {
enumerable: true,
value: "bar",
},
baz: {
get() {},
set() {},
},
};
const o = Object.defineProperties({}, properties);
expect(Object.getOwnPropertyNames(o)).toEqual(["foo", "bar", "baz"]);
expect(Object.getOwnPropertyDescriptor(o, "foo")).toEqual({
value: "foo",
writable: true,
enumerable: false,
configurable: true,
});
expect(Object.getOwnPropertyDescriptor(o, "bar")).toEqual({
value: "bar",
writable: false,
enumerable: true,
configurable: false,
});
expect(Object.getOwnPropertyDescriptor(o, "baz")).toEqual({
get: properties.baz.get,
set: properties.baz.set,
enumerable: false,
configurable: false,
});
});
test("maps numeric string key 0 to array index 0", () => {
var arr = [0];
// prettier-ignore
Object.defineProperties(arr, { "0": { value: 12 } });
expect(arr[0]).toBe(12);
});
});