import test from "node:test";
import assert from "node:assert/strict";
import {
SCRUB_INTERVAL_MS,
SCRUB_MAXIMUM_STEP,
randomAccessPointAtOrBefore,
scrubStrideFrames,
scrubWalkStart,
shouldDrawPreview,
} from "./scrub.js";
const KEYFRAMES = [0, 4, 8];
test("a target snaps back to the random-access point that decodes it", () => {
assert.equal(randomAccessPointAtOrBefore(KEYFRAMES, 0), 0);
assert.equal(randomAccessPointAtOrBefore(KEYFRAMES, 3), 0);
assert.equal(randomAccessPointAtOrBefore(KEYFRAMES, 4), 4);
assert.equal(randomAccessPointAtOrBefore(KEYFRAMES, 7), 4);
assert.equal(randomAccessPointAtOrBefore(KEYFRAMES, 11), 8);
assert.equal(randomAccessPointAtOrBefore(KEYFRAMES, 40), 8);
});
test("a track without a leading random-access point returns the target itself", () => {
assert.equal(randomAccessPointAtOrBefore([6], 2), 2);
assert.equal(randomAccessPointAtOrBefore([], 2), 2);
});
test("a stride is what fits in one publishing interval", () => {
assert.equal(scrubStrideFrames(null), 1);
assert.equal(scrubStrideFrames(30), 5);
assert.equal(scrubStrideFrames(SCRUB_INTERVAL_MS), 1);
assert.equal(scrubStrideFrames(400), 1);
assert.equal(scrubStrideFrames(0), SCRUB_MAXIMUM_STEP);
assert.equal(scrubStrideFrames(1e-9), SCRUB_MAXIMUM_STEP);
assert.equal(scrubStrideFrames(7), 21);
});
test("a walk continues forwards and restarts backwards", () => {
const rate = 30;
assert.equal(scrubWalkStart(2, 11, rate, KEYFRAMES), 7);
assert.equal(scrubWalkStart(2, 5, rate, KEYFRAMES), 5);
assert.equal(scrubWalkStart(5, 5, rate, KEYFRAMES), 5);
assert.equal(scrubWalkStart(11, 6, rate, KEYFRAMES), 4);
assert.equal(scrubWalkStart(null, 6, rate, KEYFRAMES), 4);
});
test("an unmeasured walk steps one frame and a fast one is still bounded", () => {
assert.equal(scrubWalkStart(2, 11, null, KEYFRAMES), 3);
assert.equal(scrubWalkStart(0, 10_000, 0, KEYFRAMES), SCRUB_MAXIMUM_STEP);
});
test("a preview is drawn while the walk is elsewhere and never over the exact frame", () => {
assert.equal(shouldDrawPreview(0, 500), true);
assert.equal(shouldDrawPreview(700, 500), true);
assert.equal(shouldDrawPreview(null, 0), true);
assert.equal(shouldDrawPreview(500, 500), false);
});
test("a single-group-of-pictures track restarts a backwards walk at frame zero", () => {
assert.equal(scrubWalkStart(700, 500, 30, [0]), 0);
assert.equal(scrubWalkStart(0, 500, 30, [0]), 5);
});