97 lines
2.3 KiB
JavaScript
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]);
|
|
});
|