返回 DeepSeek-Reasonix
responsive-dock.test.ts
根目录 / desktop / frontend / src / __tests__ / responsive-dock.test.ts
1 import assert from "node:assert/strict";
2 import { JSDOM } from "jsdom";
3 import { resolveWorkspacePanelPlacement } from "../lib/workspaceLayout";
4
5 const dom = new JSDOM("", { url: "http://localhost" });
6 globalThis.window = dom.window as unknown as Window & typeof globalThis;
7 const { useLayoutStore, saveRightDockTreeWidth } = await import("../store/layout");
8 const { setViewportSize, useWindowChromeStore } = await import("../store/windowChrome");
9 const { loadOptionalLayoutSize } = await import("../lib/layoutPreferences");
10 const layout = useLayoutStore.getState;
11 setViewportSize(1600, 900);
12 layout().setWorkspacePanelOpen(true);
13 assert.equal(layout().rightDockTreeWidth, 720, "first opening uses the current viewport, not startup width");
14 assert.equal(loadOptionalLayoutSize("rightDockTreeWidth"), null, "automatic sizing does not persist a manual preference");
15 layout().setRightDockTreeWidth(810);
16 saveRightDockTreeWidth(810);
17 layout().setWorkspacePanelOpen(false);
18 setViewportSize(800, 900);
19 layout().setWorkspacePanelOpen(true);
20 assert.equal(layout().rightDockTreeWidth, 810, "reopening in a narrow window retains the preferred width");
21
22 const placement = (viewportWidth: number, preferredWidth = layout().rightDockTreeWidth) => resolveWorkspacePanelPlacement({
23 viewportWidth, sidebarCollapsed: viewportWidth < 1024, sidebarWidth: 264,
24 chatMinWidth: 400, resizerWidth: 8, open: true, maximized: false,
25 preferredWidth, minWidth: 300, minRenderWidth: 300,
26 });
27 assert.equal(placement(800).renderWidth, 392);
28 assert.equal(placement(800).gridOpen, true);
29 assert.equal(placement(767).renderWidth, 767);
30 assert.equal(placement(767).overlay, true);
31 assert.equal(placement(767).gridOpen, false);
32 assert.equal(placement(360).renderWidth, 360, "fullscreen does not impose a desktop minimum");
33 assert.equal(placement(768).gridOpen, true, "the breakpoint is exclusive");
34 assert.equal(placement(1600).renderWidth, 810, "rewidening restores the preference");
35 assert.equal(placement(2400, 2000).renderWidth, 1680, "right dock is capped at 70 percent");
36 assert.equal(loadOptionalLayoutSize("rightDockTreeWidth"), 810, "responsive concessions never persist");
37 useWindowChromeStore.setState({ narrowSidebarExpanded: true });
38 setViewportSize(900, 900);
39 assert.equal(useWindowChromeStore.getState().narrowSidebarExpanded, true);
40 setViewportSize(1100, 900);
41 setViewportSize(900, 900);
42 assert.equal(useWindowChromeStore.getState().narrowSidebarExpanded, false, "crossing a breakpoint resets the narrow override");
43 useWindowChromeStore.setState({ narrowSidebarExpanded: true });
44 layout().setWorkspacePanelOpen(false);
45 layout().setWorkspacePanelOpen(true);
46 assert.equal(useWindowChromeStore.getState().narrowSidebarExpanded, false, "opening the dock frees narrow sidebar space");
47 dom.window.close();
48 console.log("responsive dock: first open, retained preferences, breakpoints and width bounds passed");
49
49 lines TYPESCRIPT