返回 DeepSeek-Reasonix
wails-resize-fix.test.tsx
根目录 / desktop / frontend / src / __tests__ / wails-resize-fix.test.tsx
1 // Run: tsx src/__tests__/wails-resize-fix.test.tsx
2
3 import { JSDOM } from "jsdom";
4 import React from "react";
5 import { act } from "react";
6 import { createRoot, type Root } from "react-dom/client";
7 import { useWailsResizeFix } from "../lib/useWailsResizeFix";
8
9 let passed = 0;
10 let failed = 0;
11
12 function ok(value: boolean, label: string) {
13 if (value) {
14 process.stdout.write(` PASS ${label}\n`);
15 passed += 1;
16 } else {
17 process.stdout.write(` FAIL ${label}\n`);
18 failed += 1;
19 }
20 }
21
22 function eq(actual: unknown, expected: unknown, label: string) {
23 if (actual === expected) {
24 ok(true, label);
25 } else {
26 ok(false, `${label}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
27 }
28 }
29
30 function installDom(): JSDOM {
31 const dom = new JSDOM("<!doctype html><html><body><div id=\"root\"></div></body></html>", {
32 pretendToBeVisual: true,
33 url: "http://localhost/",
34 });
35 (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
36 globalThis.window = dom.window as unknown as Window & typeof globalThis;
37 globalThis.document = dom.window.document;
38 Object.defineProperty(globalThis, "navigator", { configurable: true, value: dom.window.navigator });
39 globalThis.HTMLElement = dom.window.HTMLElement;
40 globalThis.MouseEvent = dom.window.MouseEvent;
41 Object.defineProperty(window, "innerWidth", { configurable: true, value: 100 });
42 Object.defineProperty(window, "innerHeight", { configurable: true, value: 80 });
43 return dom;
44 }
45
46 function installWailsFlags(flags?: Partial<NonNullable<Window["wails"]>["flags"]>) {
47 window.wails = {
48 Callback: () => undefined,
49 EventsNotify: () => undefined,
50 flags: {
51 enableResize: true,
52 resizeEdge: undefined,
53 borderThickness: 6,
54 defaultCursor: null,
55 cssDragProperty: "--wails-draggable",
56 cssDragValue: "drag",
57 cssDropProperty: "--wails-drop-target",
58 cssDropValue: "drop",
59 shouldDrag: false,
60 deferDragToMouseMove: false,
61 disableScrollbarDrag: false,
62 disableDefaultContextMenu: false,
63 enableWailsDragAndDrop: false,
64 ...flags,
65 },
66 };
67 }
68
69 function Harness({ enabled, maximised }: { enabled: boolean; maximised: boolean }) {
70 useWailsResizeFix(enabled, maximised);
71 return null;
72 }
73
74 async function renderHarness(root: Root, enabled: boolean, maximised = false) {
75 await act(async () => {
76 root.render(<Harness enabled={enabled} maximised={maximised} />);
77 });
78 }
79
80 async function unmount(root: Root) {
81 await act(async () => {
82 root.unmount();
83 });
84 }
85
86 console.log("\nwails resize fix");
87
88 {
89 const dom = installDom();
90 installWailsFlags({ enableResize: true, resizeEdge: "n-resize" });
91 const root = createRoot(document.getElementById("root")!);
92
93 await renderHarness(root, false, true);
94 window.dispatchEvent(new MouseEvent("mousemove", { clientX: 97, clientY: 40 }));
95 eq(window.wails?.flags.enableResize, true, "disabled hook leaves Wails resize enabled");
96 eq(window.wails?.flags.resizeEdge, "n-resize", "disabled hook leaves resize edge unchanged");
97
98 await unmount(root);
99 dom.window.close();
100 }
101
102 {
103 const dom = installDom();
104 document.documentElement.style.cursor = "grab";
105 installWailsFlags({ enableResize: true, resizeEdge: "n-resize" });
106 const root = createRoot(document.getElementById("root")!);
107
108 await renderHarness(root, true);
109 eq(window.wails?.flags.enableResize, false, "enabled hook disables Wails built-in mousemove resize");
110
111 window.dispatchEvent(new MouseEvent("mousemove", { clientX: 97, clientY: 40 }));
112 eq(window.wails?.flags.resizeEdge, "e-resize", "enabled hook detects right edge using innerWidth CSS pixels");
113 eq(document.documentElement.style.cursor, "e-resize", "enabled hook mirrors detected edge cursor");
114
115 await unmount(root);
116 eq(window.wails?.flags.enableResize, true, "cleanup restores previous enableResize");
117 eq(window.wails?.flags.resizeEdge, "n-resize", "cleanup restores previous resizeEdge");
118 eq(document.documentElement.style.cursor, "grab", "cleanup restores previous cursor");
119
120 dom.window.close();
121 }
122
123 {
124 const dom = installDom();
125 document.documentElement.style.cursor = "n-resize";
126 installWailsFlags({ enableResize: true, resizeEdge: undefined, defaultCursor: null });
127 const root = createRoot(document.getElementById("root")!);
128
129 await renderHarness(root, true, true);
130 eq(window.wails?.flags.resizeEdge, undefined, "maximised startup clears an absent resize edge safely");
131 eq(document.documentElement.style.cursor, "default", "maximised startup replaces a stale resize cursor");
132
133 await unmount(root);
134 dom.window.close();
135 }
136
137 {
138 const dom = installDom();
139 document.documentElement.style.cursor = "e-resize";
140 installWailsFlags({ enableResize: true, resizeEdge: "e-resize", defaultCursor: "grab" });
141 const root = createRoot(document.getElementById("root")!);
142
143 await renderHarness(root, true, true);
144 eq(window.wails?.flags.resizeEdge, undefined, "maximised startup clears a stale resize edge");
145 eq(document.documentElement.style.cursor, "grab", "maximised startup restores Wails' remembered cursor");
146
147 await unmount(root);
148 dom.window.close();
149 }
150
151 {
152 const dom = installDom();
153 Object.defineProperty(window, "outerWidth", { configurable: true, value: 104 });
154 Object.defineProperty(window, "outerHeight", { configurable: true, value: 84 });
155 Object.defineProperty(window.screen, "availWidth", { configurable: true, value: 100 });
156 Object.defineProperty(window.screen, "availHeight", { configurable: true, value: 80 });
157 installWailsFlags({ enableResize: true, resizeEdge: undefined });
158 const root = createRoot(document.getElementById("root")!);
159
160 await renderHarness(root, true, false);
161 window.dispatchEvent(new MouseEvent("mousemove", { clientX: 97, clientY: 40 }));
162 eq(window.wails?.flags.resizeEdge, "e-resize", "near-full-size normal window keeps edge resizing");
163
164 await unmount(root);
165 dom.window.close();
166 }
167
168 {
169 const dom = installDom();
170 installWailsFlags({ enableResize: true, resizeEdge: undefined });
171 const root = createRoot(document.getElementById("root")!);
172
173 await renderHarness(root, true, false);
174 window.dispatchEvent(new MouseEvent("mousemove", { clientX: 97, clientY: 40 }));
175 eq(window.wails?.flags.resizeEdge, "e-resize", "normal window detects the resize edge");
176
177 await renderHarness(root, true, true);
178 eq(window.wails?.flags.resizeEdge, undefined, "maximise transition clears the resize edge immediately");
179 eq(document.documentElement.style.cursor, "default", "maximise transition restores the cursor");
180
181 await renderHarness(root, true, false);
182 window.dispatchEvent(new MouseEvent("mousemove", { clientX: 97, clientY: 40 }));
183 eq(window.wails?.flags.resizeEdge, "e-resize", "restore transition re-enables edge resizing");
184
185 await unmount(root);
186 dom.window.close();
187 }
188
189 console.log(`\n${passed} passed, ${failed} failed, ${passed + failed} total`);
190 if (failed > 0) process.exit(1);
191
191 lines Plain Text