| 1 | import assert from "node:assert/strict"; |
| 2 | import { manualTopicOrder, projectTreeFolderHasActiveRuntime, projectTreeGroupContainsNode, reorderedSessionKeys, reorderedTopicIDs } from "../components/ProjectTreeOrganization"; |
| 3 | import type { ProjectNode } from "../lib/types"; |
| 4 | |
| 5 | const tree: ProjectNode[] = [ |
| 6 | { key: "a", kind: "project", label: "A", root: "/a", children: [ |
| 7 | { key: "a-1", kind: "topic", label: "A1", root: "/a", topicId: "same", children: [] }, |
| 8 | { key: "a-2", kind: "topic", label: "A2", root: "/a", topicId: "a2", children: [] }, |
| 9 | ] }, |
| 10 | { key: "b", kind: "project", label: "B", root: "/b", children: [ |
| 11 | { key: "b-1", kind: "topic", label: "B1", root: "/b", topicId: "same", children: [] }, |
| 12 | { key: "b-2", kind: "topic", label: "B2", root: "/b", topicId: "b2", children: [] }, |
| 13 | ] }, |
| 14 | ]; |
| 15 | |
| 16 | assert.deepEqual(reorderedTopicIDs(tree, "project", "/b", "b2", "same", "before"), ["b2", "same"]); |
| 17 | assert.equal(reorderedTopicIDs(tree, "project", "/a", "b2", "same", "before"), null, "duplicate ids cannot cross project scope"); |
| 18 | assert.equal(reorderedTopicIDs([{ ...tree[0]!, children: [...tree[0]!.children!, { |
| 19 | key: "runtime", kind: "topic", label: "Runtime", root: "/a", topicId: "runtime", runtimeOnly: true, children: [], |
| 20 | }] }], "project", "/a", "runtime", "same", "before"), null, "runtime-only topics are not persisted into manual order"); |
| 21 | |
| 22 | const sharedSessions: ProjectNode[] = [{ key: "p", kind: "project", label: "P", root: "/p", children: [ |
| 23 | { key: "a", kind: "topic", label: "A", root: "/p", topicId: "shared", sessionPath: "/s/a", children: [] }, |
| 24 | { key: "b", kind: "topic", label: "B", root: "/p", topicId: "shared", sessionPath: "/s/b", children: [] }, |
| 25 | ] }]; |
| 26 | assert.deepEqual(reorderedSessionKeys(sharedSessions, "project", "/p", "path\u0000/s/b", "path\u0000/s/a", "before"), ["path\u0000/s/b", "path\u0000/s/a"]); |
| 27 | const splitGroup = { id: "g", title: "G", topicIds: ["shared"], excludedSessionKeys: ["path\u0000/s/b"] }; |
| 28 | assert.equal(projectTreeGroupContainsNode(splitGroup, sharedSessions[0]!.children![0]!), true); |
| 29 | assert.equal(projectTreeGroupContainsNode(splitGroup, sharedSessions[0]!.children![1]!), false); |
| 30 | |
| 31 | assert.equal(manualTopicOrder({ key: "a", kind: "topic", label: "A", sortOrder: -1 }, { key: "b", kind: "topic", label: "B" }), 0); |
| 32 | assert.ok(manualTopicOrder({ key: "a", kind: "topic", label: "A", sortOrder: 1 }, { key: "b", kind: "topic", label: "B", sortOrder: 2 }) < 0); |
| 33 | assert.equal(projectTreeFolderHasActiveRuntime({ key: "folder", kind: "project", label: "Folder", children: [ |
| 34 | { key: "active", kind: "topic", label: "Active", status: "thinking" }, |
| 35 | ]}), true); |
| 36 | assert.equal(projectTreeFolderHasActiveRuntime({ key: "folder", kind: "project", label: "Folder", children: [ |
| 37 | { key: "idle", kind: "topic", label: "Idle", status: "paused" }, |
| 38 | ]}), false); |
| 39 | |
| 40 | console.log(" PASS project tree organization"); |
| 41 |