NODEDC_MISSION_CORE/apps/control-station/test/rerunViewportPlayback.test.mjs

97 lines
2.3 KiB
JavaScript

import assert from "node:assert/strict";
import { after, before, test } from "node:test";
import { createServer } from "vite";
let server;
let attemptRecordedAutoplay;
let createLatestAnimationFrameEmitter;
before(async () => {
server = await createServer({
appType: "custom",
logLevel: "silent",
server: { middlewareMode: true },
});
({ attemptRecordedAutoplay, createLatestAnimationFrameEmitter } =
await server.ssrLoadModule("/src/components/RerunViewport.tsx"));
});
after(async () => {
await server?.close();
});
test("recorded autoplay reports success only after seek and play both succeed", () => {
let seekAttempts = 0;
let playAttempts = 0;
const seekToStart = () => {
seekAttempts += 1;
};
const startPlaying = () => {
playAttempts += 1;
if (playAttempts === 1) throw new Error("receiver is not ready yet");
};
assert.equal(attemptRecordedAutoplay(seekToStart, startPlaying), false);
assert.equal(attemptRecordedAutoplay(seekToStart, startPlaying), true);
assert.equal(seekAttempts, 2);
assert.equal(playAttempts, 2);
});
test("recorded autoplay does not try play when the seek itself fails", () => {
let playAttempts = 0;
assert.equal(attemptRecordedAutoplay(
() => {
throw new Error("timeline is not ready yet");
},
() => {
playAttempts += 1;
},
), false);
assert.equal(playAttempts, 0);
});
test("time updates coalesce to the latest value once per animation frame", () => {
let nextHandle = 1;
const frames = new Map();
const cancelled = [];
const emitted = [];
const emitter = createLatestAnimationFrameEmitter({
emit(value) {
emitted.push(value);
},
requestFrame(callback) {
const handle = nextHandle;
nextHandle += 1;
frames.set(handle, callback);
return handle;
},
cancelFrame(handle) {
cancelled.push(handle);
frames.delete(handle);
},
});
emitter.push(1);
emitter.push(2);
emitter.push(3);
assert.equal(frames.size, 1);
assert.deepEqual(emitted, []);
const firstFrame = frames.get(1);
frames.delete(1);
firstFrame(0);
assert.deepEqual(emitted, [3]);
emitter.push(4);
assert.equal(frames.size, 1);
emitter.cancel();
assert.deepEqual(cancelled, [2]);
assert.deepEqual(emitted, [3]);
emitter.push(5);
assert.equal(frames.size, 0);
assert.deepEqual(emitted, [3]);
});