63 lines
2.5 KiB
JavaScript
63 lines
2.5 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { readFile } from "node:fs/promises";
|
|
import { StreamedJob } from "../src/lib/streamed-job.js";
|
|
import { samplePacked } from "../src/lib/packed-playback.js";
|
|
|
|
const metadata = JSON.parse(await readFile("public/data/stream.json", "utf8"));
|
|
const bytes = await readFile("public/data/print-job.bin");
|
|
const full = { ...metadata, buffer: new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4) };
|
|
const request = async (url) => {
|
|
const bytes = await readFile(`public${url}`);
|
|
return new Response(bytes);
|
|
};
|
|
const makeJob = async () => {
|
|
const response = await request(`/data/stream/${metadata.version}/overview.bin`);
|
|
return new StreamedJob(metadata, new Float32Array(await response.arrayBuffer()), request);
|
|
};
|
|
|
|
test("所有分层数据完整覆盖原始路径且边界采样一致", async () => {
|
|
const job = await makeJob();
|
|
let end = 0;
|
|
for (const chunk of metadata.chunks) {
|
|
assert.equal(chunk.start, end);
|
|
await job.ensure(chunk.endTime, false);
|
|
for (const time of [chunk.startTime + 0.001, (chunk.startTime + chunk.endTime) / 2, chunk.endTime]) {
|
|
assert.deepEqual(samplePacked(job, time), samplePacked(full, time));
|
|
}
|
|
end = chunk.end;
|
|
}
|
|
assert.equal(end, metadata.count);
|
|
assert.deepEqual(job.buffer, full.buffer);
|
|
});
|
|
|
|
test("失败分块可重试且不得伪造可用状态", async () => {
|
|
const job = await makeJob();
|
|
job.request = async () => new Response("", { status: 503 });
|
|
await assert.rejects(job.ensure(100, false), /加载失败/);
|
|
assert.equal(job.ready(100), false);
|
|
assert.equal(job.pending.size, 0);
|
|
job.request = request;
|
|
await job.ensure(100, false);
|
|
assert.equal(job.ready(100), true);
|
|
});
|
|
|
|
test("演讲准备完整校验路径和原始指令", async () => {
|
|
const job = await makeJob();
|
|
await job.loadAll();
|
|
assert.equal(job.loaded.size, metadata.chunks.length);
|
|
assert.deepEqual(job.buffer, full.buffer);
|
|
const sample = samplePacked(job, metadata.duration * 0.63);
|
|
assert.match(job.commands[sample.line], /^G1/);
|
|
});
|
|
|
|
test("完整路径并发加载复用请求且不阻止当前层下载", async () => {
|
|
const job = await makeJob();
|
|
let requests = 0;
|
|
job.request = async (...args) => { requests++; return request(...args); };
|
|
await Promise.all([job.loadAll(), job.loadAll(), job.ensure(100, false)]);
|
|
assert.equal(requests, 4);
|
|
assert.equal(job.fullLoad, null);
|
|
assert.deepEqual(job.buffer, full.buffer);
|
|
});
|