| 1 | import assert from "node:assert/strict"; |
| 2 | import { JSDOM } from "jsdom"; |
| 3 | import * as memory from "../lib/workspaceViewMemory"; |
| 4 | import * as legacy from "../lib/workspaceTreeMemory"; |
| 5 | |
| 6 | const dom = new JSDOM("", { url: "http://localhost/" }); |
| 7 | Object.assign(globalThis, { window: dom.window, localStorage: dom.window.localStorage }); |
| 8 | legacy.resetWorkspaceTreeMemoryForTests(); |
| 9 | legacy.rememberWorkspaceTreeState("A", { selectedFilePath: "legacy.ts", openDirs: new Set(["", "src"]), recentPaths: ["legacy.ts"], dockTreeWidth: 440 }); |
| 10 | const a = memory.workspaceViewMemoryKey("A", "first", true); |
| 11 | const b = memory.workspaceViewMemoryKey("A", "second"); |
| 12 | const c = memory.workspaceViewMemoryKey("B", "first", true); |
| 13 | assert.equal(memory.readWorkspaceTreeMemory(a)?.selectedFilePath, "legacy.ts"); |
| 14 | assert.equal(memory.readWorkspaceTreeMemory(b)?.selectedFilePath, null); |
| 15 | assert.equal(memory.readWorkspaceTreeMemory(c)?.selectedFilePath, null); |
| 16 | memory.rememberWorkspaceTreeState(a, { selectedFilePath: "a.ts", openTabs: ["a.ts", "a2.ts"], filter: "src", openDirs: new Set(["", "src/a"]), recentPaths: ["a.ts"] }); |
| 17 | memory.rememberWorkspaceTreeScroll(a, 320); |
| 18 | memory.rememberWorkspaceTreeState(b, { selectedFilePath: "b.ts", openTabs: ["b.ts"], filter: "docs", openDirs: new Set(["", "docs"]), dockTreeWidth: 480 }); |
| 19 | memory.rememberWorkspaceTreeScroll(b, 170); |
| 20 | memory.flushWorkspaceTreeMemory(); |
| 21 | memory.reloadWorkspaceViewMemoryForTests(); |
| 22 | assert.equal(memory.readWorkspaceTreeMemory(a)?.selectedFilePath, "a.ts"); |
| 23 | assert.deepEqual(memory.readWorkspaceTreeMemory(a)?.openTabs, ["a.ts", "a2.ts"]); |
| 24 | assert.equal(memory.readWorkspaceTreeMemory(a)?.filter, "src"); |
| 25 | assert.equal(memory.readWorkspaceTreeMemory(a)?.scrollTop, 320); |
| 26 | assert.equal(memory.readWorkspaceTreeMemory(b)?.selectedFilePath, "b.ts"); |
| 27 | assert.equal(memory.readWorkspaceTreeMemory(b)?.filter, "docs"); |
| 28 | assert.equal(memory.readWorkspaceTreeMemory(b)?.scrollTop, 170); |
| 29 | assert.deepEqual(memory.readWorkspaceTreeMemory(b)?.recentPaths, ["a.ts"]); |
| 30 | assert.equal(memory.readWorkspaceTreeMemory(a)?.dockTreeWidth, 480); |
| 31 | assert.equal(memory.readWorkspaceTreeMemory(c)?.selectedFilePath, null); |
| 32 | assert.equal(memory.readWorkspaceTreeMemory(memory.workspaceViewMemoryKey("A", "new-first", true))?.selectedFilePath, null, "legacy seeds only once"); |
| 33 | assert.equal(legacy.readWorkspaceTreeMemory("A")?.selectedFilePath, "legacy.ts", "view writes preserve legacy browsing state for downgrade"); |
| 34 | const persisted = JSON.parse(localStorage.getItem("reasonix.workspaceViews.v1")!); |
| 35 | assert(!("recentPaths" in persisted.projects.A.views.first)); |
| 36 | assert(!("dockTreeWidth" in persisted.projects.A.views.first)); |
| 37 | const future = JSON.stringify({ version: 9, data: "future-writer-owned" }); |
| 38 | localStorage.setItem("reasonix.workspaceViews.v1", future); |
| 39 | memory.reloadWorkspaceViewMemoryForTests(); |
| 40 | memory.rememberWorkspaceTreeState(a, { selectedFilePath: "temporary.ts" }); |
| 41 | assert.equal(localStorage.getItem("reasonix.workspaceViews.v1"), future, "unknown versions remain untouched"); |
| 42 | dom.window.close(); |
| 43 | console.log("PASS per-view navigation, project history/geometry, restart and legacy/future compatibility"); |
| 44 |