Files
hyperframes/packages/parsers/src/gsapObjectArrayTiming.test.ts

57 lines
2.0 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
findObjectArrayKeyframeIndex,
getCompatibleObjectArrayKeyframeTiming,
getObjectArrayKeyframeTiming,
} from "./gsapObjectArrayTiming.js";
describe("getObjectArrayKeyframeTiming", () => {
it("preserves tenth-percent precision for evenly distributed arrays", () => {
expect(getObjectArrayKeyframeTiming([undefined, undefined, undefined, undefined])).toEqual({
percentages: [0, 33.3, 66.7, 100],
});
});
it("maps positive authored durations to cumulative percentages", () => {
expect(getObjectArrayKeyframeTiming([1, 2, 1])).toEqual({
percentages: [25, 75, 100],
totalDuration: 4,
});
});
it.each([
[[0, 1, 1], "zero"],
[[1, -1, 1], "negative"],
[[1, Number.NaN, 1], "non-finite"],
[[1, "__raw:total * 0.5", 1], "expression"],
[[1, undefined, 1], "partial"],
])("rejects %s duration timing (%s)", (durations) => {
expect(getObjectArrayKeyframeTiming(durations)).toBeNull();
});
});
describe("findObjectArrayKeyframeIndex", () => {
it("falls back to the nearest array entry for an in-range percentage", () => {
expect(
findObjectArrayKeyframeIndex([undefined, undefined, undefined, undefined], 50, {
fallbackToNearest: true,
}),
).toBe(1);
});
it("rejects out-of-range and unresolved timing", () => {
expect(findObjectArrayKeyframeIndex([undefined, undefined], -1)).toBeNull();
expect(findObjectArrayKeyframeIndex([undefined, undefined], 101)).toBeNull();
expect(findObjectArrayKeyframeIndex([1, 0, 1], 50)).toBeNull();
});
});
describe("getCompatibleObjectArrayKeyframeTiming", () => {
it("accepts absent or matching outer durations and rejects conflicts", () => {
expect(getCompatibleObjectArrayKeyframeTiming([0.25, 0.75], undefined)).not.toBeNull();
expect(getCompatibleObjectArrayKeyframeTiming([0.25, 0.75], 1)).not.toBeNull();
expect(getCompatibleObjectArrayKeyframeTiming([0.25, 0.75], 2)).toBeNull();
expect(getCompatibleObjectArrayKeyframeTiming([0.25, 0.75], "1")).toBeNull();
});
});