Files
Live_RC/tests/session_replay.test.js
2026-09-04 15:58:24 +02:00

65 lines
2.9 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import {
advanceSessionReplay,
buildSessionReplaySnapshot,
createSessionReplayRuntime,
loadSessionReplay,
pauseSessionReplay,
playSessionReplay,
resetSessionReplay,
setSessionReplaySpeed,
} from "../src/session_replay.js";
const passings = [
{ timestamp: 1000, competitorKey: "a", driverName: "Alpha", transponder: "1", lapMs: 0, validLap: true },
{ timestamp: 1200, competitorKey: "b", driverName: "Beta", transponder: "2", lapMs: 0, validLap: true },
{ timestamp: 11000, competitorKey: "a", driverName: "Alpha", transponder: "1", lapMs: 10000, validLap: true },
{ timestamp: 11700, competitorKey: "b", driverName: "Beta", transponder: "2", lapMs: 10500, validLap: true },
{ timestamp: 20500, competitorKey: "a", driverName: "Alpha", transponder: "1", lapMs: 9500, validLap: true },
{ timestamp: 21000, competitorKey: "b", driverName: "Beta", transponder: "2", lapMs: 9300, validLap: false },
];
test("session replay builds an isolated race leaderboard at the selected time", () => {
const runtime = createSessionReplayRuntime();
loadSessionReplay(runtime, { id: "race_1", name: "A final", type: "final" }, { passings: [...passings].reverse() });
runtime.elapsedMs = 15000;
const snapshot = buildSessionReplaySnapshot(runtime);
assert.equal(snapshot.visiblePassings.length, 4);
assert.deepEqual(snapshot.leaderboard.map((row) => [row.driverName, row.laps]), [["Alpha", 1], ["Beta", 1]]);
assert.equal(snapshot.latestPassing.driverName, "Beta");
assert.equal(runtime.passings.length, 6);
});
test("practice replay ranks best valid lap and ignores invalid laps", () => {
const runtime = createSessionReplayRuntime();
loadSessionReplay(runtime, { id: "practice_1", name: "Practice", type: "practice" }, { passings });
runtime.elapsedMs = runtime.durationMs;
const snapshot = buildSessionReplaySnapshot(runtime);
assert.equal(snapshot.leaderboard[0].driverName, "Alpha");
assert.equal(snapshot.leaderboard[0].bestLapMs, 9500);
assert.equal(snapshot.leaderboard[1].bestLapMs, 10500);
assert.equal(snapshot.leaderboard[1].laps, 1);
});
test("session replay play, speed, pause, finish, and reset are deterministic", () => {
const runtime = createSessionReplayRuntime();
loadSessionReplay(runtime, { id: "race_1", type: "final" }, { passings });
assert.equal(playSessionReplay(runtime, 100), true);
setSessionReplaySpeed(runtime, 5, 1100);
assert.equal(runtime.elapsedMs, 1000);
advanceSessionReplay(runtime, 2100);
assert.equal(runtime.elapsedMs, 6000);
assert.equal(pauseSessionReplay(runtime, 2200), true);
assert.equal(runtime.status, "paused");
playSessionReplay(runtime, 3000);
advanceSessionReplay(runtime, 10000);
assert.equal(runtime.status, "finished");
assert.equal(runtime.elapsedMs, runtime.durationMs);
resetSessionReplay(runtime);
assert.equal(runtime.status, "paused");
assert.equal(runtime.elapsedMs, 0);
});