mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 19:27:35 +00:00
LibJS: Partially implement resizable ArrayBuffer objects
This is (part of) a normative change in the ECMA-262 spec. See:
a9ae96e
This implements just support for resizing ArrayBuffer objects. This does
not implement the SharedArrayBuffer changes, as we do not have enough
support to do so.
This commit is contained in:
parent
a1e2f131c4
commit
29ac6e3689
13 changed files with 369 additions and 14 deletions
|
@ -17,3 +17,18 @@ test("ArrayBuffer size limit", () => {
|
|||
new ArrayBuffer(2 ** 53);
|
||||
}).toThrowWithMessage(RangeError, "Invalid array buffer length");
|
||||
});
|
||||
|
||||
test("invalid ArrayBuffer maximum size option", () => {
|
||||
expect(() => {
|
||||
new ArrayBuffer(10, { maxByteLength: -1 });
|
||||
}).toThrowWithMessage(RangeError, "Index must be a positive integer");
|
||||
});
|
||||
|
||||
test("ArrayBuffer size exceeds maximum size", () => {
|
||||
expect(() => {
|
||||
new ArrayBuffer(10, { maxByteLength: 5 });
|
||||
}).toThrowWithMessage(
|
||||
RangeError,
|
||||
"ArrayBuffer byte length of 10 exceeds the max byte length of 5"
|
||||
);
|
||||
});
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
describe("errors", () => {
|
||||
test("called on non-ArrayBuffer object", () => {
|
||||
expect(() => {
|
||||
ArrayBuffer.prototype.maxByteLength;
|
||||
}).toThrowWithMessage(TypeError, "Not an object of type ArrayBuffer");
|
||||
});
|
||||
});
|
||||
|
||||
describe("normal behavior", () => {
|
||||
test("detached buffer", () => {
|
||||
let buffer = new ArrayBuffer(5);
|
||||
detachArrayBuffer(buffer);
|
||||
expect(buffer.maxByteLength).toBe(0);
|
||||
|
||||
buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
detachArrayBuffer(buffer);
|
||||
expect(buffer.maxByteLength).toBe(0);
|
||||
});
|
||||
|
||||
test("fixed buffer", () => {
|
||||
let buffer = new ArrayBuffer(5);
|
||||
expect(buffer.maxByteLength).toBe(5);
|
||||
});
|
||||
|
||||
test("resizable buffer", () => {
|
||||
let buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
expect(buffer.maxByteLength).toBe(10);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,19 @@
|
|||
describe("errors", () => {
|
||||
test("called on non-ArrayBuffer object", () => {
|
||||
expect(() => {
|
||||
ArrayBuffer.prototype.resizable;
|
||||
}).toThrowWithMessage(TypeError, "Not an object of type ArrayBuffer");
|
||||
});
|
||||
});
|
||||
|
||||
describe("normal behavior", () => {
|
||||
test("fixed buffer", () => {
|
||||
let buffer = new ArrayBuffer(5);
|
||||
expect(buffer.resizable).toBeFalse();
|
||||
});
|
||||
|
||||
test("resizable buffer", () => {
|
||||
let buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
expect(buffer.resizable).toBeTrue();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,57 @@
|
|||
describe("errors", () => {
|
||||
test("called on non-ArrayBuffer object", () => {
|
||||
expect(() => {
|
||||
ArrayBuffer.prototype.resize(10);
|
||||
}).toThrowWithMessage(TypeError, "Not an object of type ArrayBuffer");
|
||||
});
|
||||
|
||||
test("fixed buffer", () => {
|
||||
let buffer = new ArrayBuffer(5);
|
||||
detachArrayBuffer(buffer);
|
||||
|
||||
expect(() => {
|
||||
buffer.resize(10);
|
||||
}).toThrowWithMessage(TypeError, "ArrayBuffer is not resizable");
|
||||
});
|
||||
|
||||
test("detached buffer", () => {
|
||||
let buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
detachArrayBuffer(buffer);
|
||||
|
||||
expect(() => {
|
||||
buffer.resize(10);
|
||||
}).toThrowWithMessage(TypeError, "ArrayBuffer is detached");
|
||||
});
|
||||
|
||||
test("invalid new byte length", () => {
|
||||
let buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
|
||||
expect(() => {
|
||||
buffer.resize(-1);
|
||||
}).toThrowWithMessage(RangeError, "Index must be a positive integer");
|
||||
});
|
||||
|
||||
test("new byte length exceeds maximum size", () => {
|
||||
let buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
|
||||
expect(() => {
|
||||
buffer.resize(11);
|
||||
}).toThrowWithMessage(
|
||||
RangeError,
|
||||
"ArrayBuffer byte length of 11 exceeds the max byte length of 10"
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("normal behavior", () => {
|
||||
test("resizable buffer", () => {
|
||||
let buffer = new ArrayBuffer(5, { maxByteLength: 10 });
|
||||
expect(buffer.byteLength).toBe(5);
|
||||
expect(buffer.maxByteLength).toBe(10);
|
||||
|
||||
for (let i = 0; i <= buffer.maxByteLength; ++i) {
|
||||
buffer.resize(i);
|
||||
expect(buffer.byteLength).toBe(i);
|
||||
}
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue