import { describe, expect, it } from "vitest"; import { clampToolcraftTimelineDurationSeconds, clampToolcraftTimelineTime, getToolcraftTimelineKeyframeId, roundToolcraftTimelineKeyframeTime, toolcraftTimelineDefaultDurationSeconds, toolcraftTimelineMaxDurationSeconds, toolcraftTimelineMinDurationSeconds, } from "./timeline-values"; describe("timeline values", () => { it("clamps duration with explicit fallback semantics", () => { expect(clampToolcraftTimelineDurationSeconds(Number.NaN)).toBe( toolcraftTimelineDefaultDurationSeconds, ); expect( clampToolcraftTimelineDurationSeconds( Number.NaN, toolcraftTimelineMinDurationSeconds, ), ).toBe(toolcraftTimelineMinDurationSeconds); expect(clampToolcraftTimelineDurationSeconds(0)).toBe( toolcraftTimelineMinDurationSeconds, ); expect(clampToolcraftTimelineDurationSeconds(90)).toBe( toolcraftTimelineMaxDurationSeconds, ); }); it("clamps playhead time to the active duration", () => { expect(clampToolcraftTimelineTime(Number.NaN, 8)).toBe(0); expect(clampToolcraftTimelineTime(-1, 8)).toBe(0); expect(clampToolcraftTimelineTime(12, 8)).toBe(8); expect(clampToolcraftTimelineTime(4.25, 8)).toBe(4.25); }); it("rounds and formats keyframe ids consistently", () => { expect(roundToolcraftTimelineKeyframeTime(1.236)).toBe(1.24); expect(getToolcraftTimelineKeyframeId("opacity", 2)).toBe("opacity::2"); expect(getToolcraftTimelineKeyframeId("opacity", 2.5)).toBe("opacity::2.5"); expect(getToolcraftTimelineKeyframeId("opacity", 2.05)).toBe("opacity::2.05"); }); });