import { describe, expect, it } from "vitest"; import type { WorkspaceCommandState } from "./workspaceCommands"; import { cloneCommandState, createSnapshotCommand, reviveWorkspaceCommand, toWorkspaceCommandRecord, } from "./workspaceCommands"; function makeState(pageIds: string[]): WorkspaceCommandState { return { pages: pageIds.map((id, index) => ({ id, sourcePageIndex: index, rotation: index * 90, })), selectedPageIds: pageIds.slice(0, 1), lastSelectedVisualIndex: pageIds.length > 0 ? 0 : null, }; } describe("workspaceCommands", () => { it("clones command state deeply enough for page and selection changes", () => { const original = makeState(["a", "b"]); const cloned = cloneCommandState(original); original.pages[0].rotation = 270; original.selectedPageIds.push("b"); original.lastSelectedVisualIndex = 1; expect(cloned).toEqual({ pages: [ { id: "a", sourcePageIndex: 0, rotation: 0 }, { id: "b", sourcePageIndex: 1, rotation: 90 }, ], selectedPageIds: ["a"], lastSelectedVisualIndex: 0, }); }); it("creates snapshot commands that are stable after source states mutate", () => { const before = makeState(["a", "b"]); const after = makeState(["b", "a"]); after.selectedPageIds = ["b"]; after.lastSelectedVisualIndex = 0; const command = createSnapshotCommand({ id: "cmd-1", type: "reorder-pages", label: "Move page", timestamp: "2026-05-17T10:00:00.000Z", before, after, details: { moved: 1 }, }); before.pages.length = 0; after.pages[0].rotation = 180; after.selectedPageIds.push("a"); expect(command.undo(makeState(["ignored"]))).toEqual({ pages: [ { id: "a", sourcePageIndex: 0, rotation: 0 }, { id: "b", sourcePageIndex: 1, rotation: 90 }, ], selectedPageIds: ["a"], lastSelectedVisualIndex: 0, }); expect(command.do(makeState(["ignored"]))).toEqual({ pages: [ { id: "b", sourcePageIndex: 0, rotation: 0 }, { id: "a", sourcePageIndex: 1, rotation: 90 }, ], selectedPageIds: ["b"], lastSelectedVisualIndex: 0, }); }); it("round-trips commands through serializable records", () => { const before = makeState(["a", "b", "c"]); const after: WorkspaceCommandState = { pages: [before.pages[2], before.pages[0], before.pages[1]], selectedPageIds: ["c"], lastSelectedVisualIndex: 0, }; const command = createSnapshotCommand({ id: "cmd-2", type: "copy-pages", label: "Copy pages", timestamp: "2026-05-17T10:05:00.000Z", before, after, }); const record = toWorkspaceCommandRecord(command); const revived = reviveWorkspaceCommand(record); expect(record).not.toHaveProperty("do"); expect(record).not.toHaveProperty("undo"); expect(revived.do(before)).toEqual(after); expect(revived.undo(after)).toEqual(before); }); });