import { cleanup, render } from "@testing-library/react";
import * as React from "react";
import { afterEach, beforeAll, vi } from "vitest";
import { timelineModule } from "../../modules/built-ins/timeline/timeline-module";
import { mediaSourceModule } from "../../modules/built-ins/media-source/media-source-module";
import { defineToolcraft } from "../../schema/define-toolcraft";
import type { ToolcraftTimelineMode } from "../../schema/types";
import type { ToolcraftInitialState } from "../../state/types";
import { ToolcraftRoot } from "../app-shell/toolcraft-root";
import { useToolcraft } from "../app-shell/use-toolcraft";
import { TimelinePanel } from "./timeline-panel";
export function installTimelinePanelTestEnvironment() {
beforeAll(() => {
Object.defineProperty(window, "matchMedia", {
value: (query: string) => ({
addEventListener: () => undefined,
addListener: () => undefined,
dispatchEvent: () => false,
matches: query === "(prefers-reduced-motion: reduce)",
media: query,
onchange: null,
removeEventListener: () => undefined,
removeListener: () => undefined,
}),
writable: true,
});
});
afterEach(() => {
cleanup();
window.localStorage.clear();
vi.restoreAllMocks();
});
}
type TimelineTestModuleOptions = Readonly<{
defaultDurationSeconds?: number;
mode: ToolcraftTimelineMode;
}>;
export function createTimelineSchema(
timeline: TimelineTestModuleOptions = { mode: "keyframes" },
) {
return defineToolcraft({
base: {
identity: { id: "runtime-test", title: "Toolcraft App" },
canvas: { enabled: true },
panels: {},
},
modules: [timelineModule(timeline)],
});
}
function TimelineStateProbe() {
const { state } = useToolcraft();
return (
<>
{String(state.timeline.isPlaying)}
{String(state.timeline.isLooping)}
{String(state.timeline.currentTimeSeconds)}
{String(state.timeline.expanded)}
>
);
}
export function renderTimelinePanel(
props: Partial> = {},
initialState?: ToolcraftInitialState,
timeline?: TimelineTestModuleOptions,
) {
return render(
,
);
}
export function renderUploadDependentTimelinePanel(
initialState?: ToolcraftInitialState,
) {
const schema = defineToolcraft({
base: {
identity: { id: "runtime-test", title: "Toolcraft App" },
canvas: {
enabled: true,
sizing: { mode: "intrinsic-media" },
upload: true,
},
panels: {},
},
modules: [
mediaSourceModule(),
timelineModule({
mode: "playback",
}),
],
});
return render(
,
);
}