1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-23 15:16:54 -05:00
denoland-deno/cli/tests/unit/structured_clone_test.ts
Marcos Casagrande 34fb380ed3
feat(ext/web): use ArrayBuffer.was_detached() (#16307)
This PR adds a way to reliably check if an ArrayBuffer was detached
2022-10-25 14:22:37 +02:00

53 lines
1.6 KiB
TypeScript

import { assert, assertEquals, assertThrows } from "./test_util.ts";
// Basic tests for the structured clone algorithm. Mainly tests TypeScript
// typings. Actual functionality is tested in WPT.
Deno.test("self.structuredClone", async () => {
const arrayOriginal = ["hello world"];
const channelOriginal = new MessageChannel();
const [arrayCloned, portTransferred] = self
.structuredClone([arrayOriginal, channelOriginal.port2], {
transfer: [channelOriginal.port2],
});
assert(arrayOriginal !== arrayCloned); // not the same identity
assertEquals(arrayCloned, arrayOriginal); // but same value
channelOriginal.port1.postMessage("1");
await new Promise((resolve) => portTransferred.onmessage = () => resolve(1));
channelOriginal.port1.close();
portTransferred.close();
});
Deno.test("correct DataCloneError message", () => {
assertThrows(
() => {
const sab = new SharedArrayBuffer(1024);
structuredClone(sab, { transfer: [sab] });
},
DOMException,
"Value not transferable",
);
const ab = new ArrayBuffer(1);
// detach ArrayBuffer
structuredClone(ab, { transfer: [ab] });
assertThrows(
() => {
structuredClone(ab, { transfer: [ab] });
},
DOMException,
"ArrayBuffer at index 0 is already detached",
);
const ab2 = new ArrayBuffer(0);
assertThrows(
() => {
structuredClone([ab2, ab], { transfer: [ab2, ab] });
},
DOMException,
"ArrayBuffer at index 1 is already detached",
);
// ab2 should not be detached after above failure
structuredClone(ab2, { transfer: [ab2] });
});