66 lines
1.7 KiB
JavaScript
66 lines
1.7 KiB
JavaScript
// META: global=window,worker
|
|
|
|
"use strict";
|
|
|
|
// The zstd-compressed bytes for the string "expected output".
|
|
const compressedZstdBytes = new Uint8Array([
|
|
0x28, 0xb5, 0x2f, 0xfd, 0x04, 0x58, 0x79, 0x00, 0x00, 0x65, 0x78, 0x70, 0x65,
|
|
0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5b, 0x11,
|
|
0xc6, 0x85,
|
|
]);
|
|
|
|
for (let chunkSize = 1; chunkSize < 16; ++chunkSize) {
|
|
promise_test(async t => {
|
|
const ds = new DecompressionStream("zstd");
|
|
|
|
const writer = ds.writable.getWriter();
|
|
const reader = ds.readable.getReader();
|
|
|
|
const writePromises = [];
|
|
|
|
for (
|
|
let beginning = 0;
|
|
beginning < compressedZstdBytes.length;
|
|
beginning += chunkSize
|
|
) {
|
|
writePromises.push(
|
|
writer.write(
|
|
compressedZstdBytes.slice(beginning, beginning + chunkSize)
|
|
)
|
|
);
|
|
}
|
|
|
|
const writerClosePromise = writer.close();
|
|
const chunks = [];
|
|
|
|
while (true) {
|
|
const { value, done } = await reader.read();
|
|
if (done) {
|
|
break;
|
|
}
|
|
chunks.push(value);
|
|
}
|
|
|
|
await Promise.all(writePromises);
|
|
await writerClosePromise;
|
|
|
|
let totalLength = 0;
|
|
for (const chunk of chunks) {
|
|
totalLength += chunk.byteLength;
|
|
}
|
|
|
|
const combined = new Uint8Array(totalLength);
|
|
let offset = 0;
|
|
for (const chunk of chunks) {
|
|
combined.set(chunk, offset);
|
|
offset += chunk.byteLength;
|
|
}
|
|
|
|
const decompressedText = new TextDecoder().decode(combined);
|
|
assert_equals(
|
|
decompressedText,
|
|
"expected output",
|
|
`Decompressed text with chunkSize=${chunkSize} should match the expected output.`
|
|
);
|
|
}, `decompressing valid zstd input in chunks of size ${chunkSize} should yield "expected output"`);
|
|
}
|