返回 DeepSeek-Reasonix
project-tree-organization.test.ts
根目录 / desktop / frontend / src / __tests__ / project-tree-organization.test.ts
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
41 lines TYPESCRIPT