refactoring, linting, formatting
This commit is contained in:
105
src/workspace/workspaceCommands.test.ts
Normal file
105
src/workspace/workspaceCommands.test.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user