OpenCut/apps/web/src/lib/time.test.ts

60 lines
1.8 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import {
formatTimeCode,
getLastFrameTime,
getSnappedSeekTime,
guessTimeCodeFormat,
parseTimeCode,
roundToFrame,
snapTimeToFrame,
} from "./time";
describe("time utils", () => {
test("formatTimeCode formats HH:MM:SS:CS", () => {
expect(formatTimeCode({ timeInSeconds: 3661.23 })).toBe("01:01:01:23");
});
test("formatTimeCode formats HH:MM:SS:FF with fps", () => {
expect(
formatTimeCode({
timeInSeconds: 10.5,
format: "HH:MM:SS:FF",
fps: 30,
}),
).toBe("00:00:10:15");
});
test("parseTimeCode parses HH:MM:SS", () => {
expect(parseTimeCode({ timeCode: "01:02:03", format: "HH:MM:SS", fps: 30 })).toBe(
3723,
);
});
test("parseTimeCode returns null for invalid MM:SS", () => {
expect(parseTimeCode({ timeCode: "01:99", format: "MM:SS", fps: 30 })).toBe(
null,
);
});
test("guessTimeCodeFormat infers based on segment count", () => {
expect(guessTimeCodeFormat({ timeCode: "12:34" })).toBe("MM:SS");
expect(guessTimeCodeFormat({ timeCode: "01:02:03" })).toBe("HH:MM:SS");
expect(guessTimeCodeFormat({ timeCode: "01:02:03:12" })).toBe(
"HH:MM:SS:FF",
);
});
test("snapTime helpers round and clamp correctly", () => {
expect(roundToFrame({ time: 1.234, fps: 30 })).toBe(1.2333333333333334);
expect(snapTimeToFrame({ time: 1.234, fps: 30 })).toBe(1.2333333333333334);
expect(getSnappedSeekTime({ rawTime: -1, duration: 100, fps: 30 })).toBe(0);
expect(getSnappedSeekTime({ rawTime: 101, duration: 100, fps: 30 })).toBe(100);
});
test("getLastFrameTime handles fps edge cases", () => {
expect(getLastFrameTime({ duration: 5, fps: 25 })).toBe(4.96);
expect(getLastFrameTime({ duration: 5, fps: 0 })).toBe(5);
expect(getLastFrameTime({ duration: 0, fps: 25 })).toBe(0);
});
});