diff --git a/apps/web/src/draftThreadTerminalState.test.ts b/apps/web/src/draftThreadTerminalState.test.ts deleted file mode 100644 index 2b84282f514e0707311b470f34522dbd9c15e415..0000000000000000000000000000000000000000 --- a/apps/web/src/draftThreadTerminalState.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { - createDefaultDraftThreadTerminalState, - reduceDraftThreadTerminalState, -} from "./draftThreadTerminalState"; - -describe("draftThreadTerminalState", () => { - it("creates a closed default terminal state", () => { - expect(createDefaultDraftThreadTerminalState()).toEqual({ - terminalOpen: false, - terminalHeight: 280, - terminalIds: ["default"], - runningTerminalIds: [], - activeTerminalId: "default", - terminalGroups: [{ id: "group-default", terminalIds: ["default"] }], - activeTerminalGroupId: "group-default", - }); - }); - - it("opens and splits terminal tabs into the active group", () => { - const opened = reduceDraftThreadTerminalState(createDefaultDraftThreadTerminalState(), { - type: "set-open", - open: true, - }); - const split = reduceDraftThreadTerminalState(opened, { - type: "split", - terminalId: "terminal-2", - }); - - expect(split.terminalOpen).toBe(true); - expect(split.terminalIds).toEqual(["default", "terminal-2"]); - expect(split.activeTerminalId).toBe("terminal-2"); - expect(split.terminalGroups).toEqual([ - { - id: "group-default", - terminalIds: ["default", "terminal-2"], - }, - ]); - }); - - it("creates new terminals in a new group", () => { - const next = reduceDraftThreadTerminalState(createDefaultDraftThreadTerminalState(), { - type: "new", - terminalId: "terminal-2", - }); - - expect(next.terminalIds).toEqual(["default", "terminal-2"]); - expect(next.activeTerminalId).toBe("terminal-2"); - expect(next.activeTerminalGroupId).toBe("group-terminal-2"); - expect(next.terminalGroups).toEqual([ - { id: "group-default", terminalIds: ["default"] }, - { id: "group-terminal-2", terminalIds: ["terminal-2"] }, - ]); - }); - - it("resets to default when closing the last terminal", () => { - const closed = reduceDraftThreadTerminalState(createDefaultDraftThreadTerminalState(), { - type: "close", - terminalId: "default", - }); - - expect(closed).toEqual(createDefaultDraftThreadTerminalState()); - }); - - it("keeps a valid active terminal after closing an active split terminal", () => { - const splitOnce = reduceDraftThreadTerminalState(createDefaultDraftThreadTerminalState(), { - type: "split", - terminalId: "terminal-2", - }); - const splitTwice = reduceDraftThreadTerminalState(splitOnce, { - type: "split", - terminalId: "terminal-3", - }); - - const closed = reduceDraftThreadTerminalState(splitTwice, { - type: "close", - terminalId: "terminal-3", - }); - - expect(closed.activeTerminalId).toBe("terminal-2"); - expect(closed.terminalIds).toEqual(["default", "terminal-2"]); - expect(closed.terminalGroups).toEqual([ - { id: "group-default", terminalIds: ["default", "terminal-2"] }, - ]); - }); -}); diff --git a/apps/web/src/draftThreadTerminalState.ts b/apps/web/src/draftThreadTerminalState.ts deleted file mode 100644 index e7e9fa3f61821761a898c69fd35c406d69c619fb..0000000000000000000000000000000000000000 --- a/apps/web/src/draftThreadTerminalState.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Re-exports shared thread terminal state and reducer so draft and persisted - * flows use the same shape and logic. See threadTerminalState.ts. - */ - -import { - createDefaultThreadTerminalState, - normalizeThreadTerminalState, - reduceThreadTerminalState, - type ThreadTerminalAction, - type ThreadTerminalState, -} from "./threadTerminalState"; - -export type DraftThreadTerminalState = ThreadTerminalState; -export type DraftThreadTerminalAction = ThreadTerminalAction; - -export const createDefaultDraftThreadTerminalState = createDefaultThreadTerminalState; -export const reduceDraftThreadTerminalState = reduceThreadTerminalState; - -export { normalizeThreadTerminalState }; diff --git a/apps/web/src/threadTerminalState.test.ts b/apps/web/src/threadTerminalState.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..f5a18ffa9807e9bb62ac8938f1ba3d25363a3141 --- /dev/null +++ b/apps/web/src/threadTerminalState.test.ts @@ -0,0 +1,87 @@ +import { describe, expect, it } from "vitest"; + +import { + createDefaultThreadTerminalState, + reduceThreadTerminalState, +} from "./threadTerminalState"; + +describe("threadTerminalState", () => { + it("creates a closed default terminal state", () => { + expect(createDefaultThreadTerminalState()).toEqual({ + terminalOpen: false, + terminalHeight: 280, + terminalIds: ["default"], + runningTerminalIds: [], + activeTerminalId: "default", + terminalGroups: [{ id: "group-default", terminalIds: ["default"] }], + activeTerminalGroupId: "group-default", + }); + }); + + it("opens and splits terminal tabs into the active group", () => { + const opened = reduceThreadTerminalState(createDefaultThreadTerminalState(), { + type: "set-open", + open: true, + }); + const split = reduceThreadTerminalState(opened, { + type: "split", + terminalId: "terminal-2", + }); + + expect(split.terminalOpen).toBe(true); + expect(split.terminalIds).toEqual(["default", "terminal-2"]); + expect(split.activeTerminalId).toBe("terminal-2"); + expect(split.terminalGroups).toEqual([ + { + id: "group-default", + terminalIds: ["default", "terminal-2"], + }, + ]); + }); + + it("creates new terminals in a new group", () => { + const next = reduceThreadTerminalState(createDefaultThreadTerminalState(), { + type: "new", + terminalId: "terminal-2", + }); + + expect(next.terminalIds).toEqual(["default", "terminal-2"]); + expect(next.activeTerminalId).toBe("terminal-2"); + expect(next.activeTerminalGroupId).toBe("group-terminal-2"); + expect(next.terminalGroups).toEqual([ + { id: "group-default", terminalIds: ["default"] }, + { id: "group-terminal-2", terminalIds: ["terminal-2"] }, + ]); + }); + + it("resets to default when closing the last terminal", () => { + const closed = reduceThreadTerminalState(createDefaultThreadTerminalState(), { + type: "close", + terminalId: "default", + }); + + expect(closed).toEqual(createDefaultThreadTerminalState()); + }); + + it("keeps a valid active terminal after closing an active split terminal", () => { + const splitOnce = reduceThreadTerminalState(createDefaultThreadTerminalState(), { + type: "split", + terminalId: "terminal-2", + }); + const splitTwice = reduceThreadTerminalState(splitOnce, { + type: "split", + terminalId: "terminal-3", + }); + + const closed = reduceThreadTerminalState(splitTwice, { + type: "close", + terminalId: "terminal-3", + }); + + expect(closed.activeTerminalId).toBe("terminal-2"); + expect(closed.terminalIds).toEqual(["default", "terminal-2"]); + expect(closed.terminalGroups).toEqual([ + { id: "group-default", terminalIds: ["default", "terminal-2"] }, + ]); + }); +});