| 1 | // Run: pnpm test:window-state |
| 2 | |
| 3 | import { createWindowStateSaver, type WindowStateSnapshot } from "../lib/windowState"; |
| 4 | |
| 5 | let failed = 0; |
| 6 | |
| 7 | function ok(value: boolean, label: string) { |
| 8 | process.stdout.write(` ${value ? "PASS" : "FAIL"} ${label}\n`); |
| 9 | if (!value) failed += 1; |
| 10 | } |
| 11 | |
| 12 | function deferred() { |
| 13 | let resolve!: () => void; |
| 14 | const promise = new Promise<void>((done) => { resolve = done; }); |
| 15 | return { promise, resolve }; |
| 16 | } |
| 17 | |
| 18 | let nativeState = { width: 900, height: 600, x: 10, y: 20, maximised: false }; |
| 19 | let sizeReads = 0; |
| 20 | const firstPersist = deferred(); |
| 21 | const persisted: WindowStateSnapshot[] = []; |
| 22 | const save = createWindowStateSaver( |
| 23 | { |
| 24 | async WindowGetSize() { |
| 25 | sizeReads += 1; |
| 26 | return { w: nativeState.width, h: nativeState.height }; |
| 27 | }, |
| 28 | async WindowGetPosition() { |
| 29 | return { x: nativeState.x, y: nativeState.y }; |
| 30 | }, |
| 31 | async WindowIsMaximised() { |
| 32 | return nativeState.maximised; |
| 33 | }, |
| 34 | }, |
| 35 | async (state) => { |
| 36 | persisted.push(state); |
| 37 | if (persisted.length === 1) await firstPersist.promise; |
| 38 | }, |
| 39 | ); |
| 40 | |
| 41 | const oldSave = save(); |
| 42 | while (persisted.length === 0) await Promise.resolve(); |
| 43 | |
| 44 | nativeState = { width: 1280, height: 800, x: 40, y: 50, maximised: true }; |
| 45 | const newSave = save(); |
| 46 | await Promise.resolve(); |
| 47 | ok(sizeReads === 1, "a newer request waits for the in-flight capture and persistence"); |
| 48 | |
| 49 | firstPersist.resolve(); |
| 50 | await Promise.all([oldSave, newSave]); |
| 51 | ok(persisted.length === 2, "both distinct observations are persisted"); |
| 52 | ok(persisted[0].width === 900 && persisted[1].width === 1280, "the newest observation is written last"); |
| 53 | ok(persisted[1].maximised, "the newest maximised state is preserved"); |
| 54 | |
| 55 | await save(); |
| 56 | ok(persisted.length === 2, "an unchanged observation is deduplicated after persistence succeeds"); |
| 57 | |
| 58 | if (failed > 0) process.exit(1); |
| 59 |