1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-30 16:40:57 -05:00
denoland-deno/tests/unit/structured_clone_test.ts

59 lines
1.7 KiB
TypeScript
Raw Normal View History

// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
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] as [string[], MessagePort],
{
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] });
});