// @vitest-environment happy-dom import { act } from "react"; import { beforeAll, describe, expect, it, vi } from "vitest"; import { installReactActEnvironment, mountReactHarness } from "../../hooks/domSelectionTestHarness"; import { KeyframeNavigation } from "./KeyframeNavigation"; beforeAll(installReactActEnvironment); /** * Regression: a merged gutter row shows the keyframes of EVERY tween in the * property group. The panel guesses "the group's animation" for the write, so a * click on a keyframe authored by a sibling tween named the wrong animation and * the writer silently found nothing to remove. The diamond now reports the * clicked keyframe's own animationId. */ const MERGED_ROW = [ { percentage: 0, tweenPercentage: 0, properties: { x: 0 }, animationId: "delta-to-500-position" }, { percentage: 50, tweenPercentage: 25, properties: { x: 120 }, animationId: "delta-to-4000-position", }, ]; function clickDiamond(currentPercentage: number, onRemoveKeyframe: (...args: never[]) => void) { const root = mountReactHarness( , ); const diamond = document.querySelector('[title="Remove x keyframe"]'); expect(diamond).not.toBeNull(); act(() => { diamond?.click(); }); act(() => root.unmount()); } describe("KeyframeNavigation diamond", () => { it("reports the clicked keyframe's own animation on a merged row", () => { const onRemoveKeyframe = vi.fn(); clickDiamond(50, onRemoveKeyframe); expect(onRemoveKeyframe).toHaveBeenCalledWith(25, "delta-to-4000-position"); }); it("still reports the first tween's keyframe as its own", () => { const onRemoveKeyframe = vi.fn(); clickDiamond(0, onRemoveKeyframe); expect(onRemoveKeyframe).toHaveBeenCalledWith(0, "delta-to-500-position"); }); });