// @vitest-environment happy-dom
import { afterEach, describe, expect, it } from "vitest";
import {
getTimelineResourceBudgetStatus,
readTimelinePerformanceDiagnostics,
resolveTimelineScrollStrategy,
} from "./timelinePerformanceDiagnostics";
import { resolveTimelineViewportBudgets } from "./timelineViewportBudgets";
describe("timeline performance diagnostics", () => {
afterEach(() => {
document.body.replaceChildren();
});
it("reads mounted resources without mutating the timeline", () => {
document.body.innerHTML = `
`;
const before = document.body.innerHTML;
expect(readTimelinePerformanceDiagnostics()).toMatchObject({
timelineRoots: 1,
mountedRows: 2,
mountedClipRoots: 4,
maxMountedClipRootsInOneRow: 2,
mountedTimeGridCells: 2,
schedulerQueued: 3,
schedulerActive: 2,
cacheBytes: 4096,
posterStates: { idle: 0, loading: 0, ready: 1, fallback: 0, error: 1 },
});
expect(document.body.innerHTML).toBe(before);
});
it("returns the zero baseline after unmount or reset removes the DOM", () => {
document.body.innerHTML = '';
expect(readTimelinePerformanceDiagnostics().mountedClipRoots).toBe(1);
document.body.replaceChildren();
expect(readTimelinePerformanceDiagnostics()).toEqual({
timelineRoots: 0,
mountedRows: 0,
mountedClipRoots: 0,
maxMountedClipRootsInOneRow: 0,
mountedTimeGridCells: 0,
mountedTimelineDescendants: 0,
schedulerQueued: 0,
schedulerActive: 0,
cacheBytes: 0,
posterStates: { idle: 0, loading: 0, ready: 0, fallback: 0, error: 0 },
});
});
it("treats every DOM ceiling as inclusive", () => {
const budgets = resolveTimelineViewportBudgets({
maxMountedClipRoots: 2,
maxMountedClipRootsPerRow: 1,
maxMountedRows: 2,
maxMountedTimelineDescendants: 4,
});
expect(
getTimelineResourceBudgetStatus(
{
...readTimelinePerformanceDiagnostics(),
mountedClipRoots: 2,
maxMountedClipRootsInOneRow: 2,
mountedTimelineDescendants: 4,
},
budgets,
),
).toEqual({
timelineRoot: false,
rows: true,
clipRoots: true,
clipRootsPerRow: false,
descendants: true,
});
});
it("fails the resource status when the timeline is absent", () => {
expect(getTimelineResourceBudgetStatus(readTimelinePerformanceDiagnostics())).toMatchObject({
timelineRoot: false,
});
});
it("selects direct scrolling only through the configured safety envelope", () => {
expect(resolveTimelineScrollStrategy(8_000_000)).toBe("direct");
expect(resolveTimelineScrollStrategy(8_000_001)).toBe("segmented");
expect(() => resolveTimelineScrollStrategy(Number.NaN)).toThrow("content width");
});
});