clone

a deno framework for local-first web apps that open instantly, work offline and sync when users choose

feat/141-demo-review-fixes
lofi / package / recipes / window-controls-overlay_test.ts
window-controls-overlay_test.ts 2.4K
1import {2 observeWindowControlsOverlay,3 type WindowControlsOverlayClient,4 type WindowControlsOverlayGeometry,5} from "./window-controls-overlay.ts";67function assert(condition: unknown, message: string): asserts condition {8 if (!condition) throw new Error(message);9}1011Deno.test("window controls observer reports initial and changed geometry", () => {12 let listener: EventListener | undefined;13 let visible = false;14 let rect = { x: 0, y: 0, width: 640, height: 32 };15 const client: WindowControlsOverlayClient = {16 get visible() {17 return visible;18 },19 getTitlebarAreaRect: () => rect,20 addEventListener: (_type, next) => listener = next,21 removeEventListener: (_type, next) => {22 if (listener === next) listener = undefined;23 },24 };25 const values: WindowControlsOverlayGeometry[] = [];26 const observer = observeWindowControlsOverlay({27 client,28 onGeometry: (value) => values.push(value),29 });30 assert(observer.supported, "valid API was reported unsupported");31 assert(values[0]?.titlebarArea.width === 640, "initial geometry was not delivered");32 visible = true;33 rect = { x: 72, y: 0, width: 480, height: 40 };34 listener?.(new Event("geometrychange"));35 assert(36 values[1]?.visible && values[1].titlebarArea.x === 72,37 "changed geometry was not delivered",38 );39 observer.dispose();40 listener?.(new Event("geometrychange"));41 assert(values.length === 2, "disposed observer received geometry");42});4344Deno.test("window controls observer preserves unsupported standalone fallback", () => {45 let called = false;46 const observer = observeWindowControlsOverlay({ onGeometry: () => called = true });47 assert(!observer.supported, "missing API was reported supported");48 assert(!called, "unsupported API invented geometry");49});5051Deno.test("window controls observer bounds malformed browser geometry", () => {52 const values: WindowControlsOverlayGeometry[] = [];53 const client: WindowControlsOverlayClient = {54 visible: true,55 getTitlebarAreaRect: () => ({56 x: -1,57 y: Number.NaN,58 width: Number.POSITIVE_INFINITY,59 height: 30,60 }),61 addEventListener() {},62 removeEventListener() {},63 };64 observeWindowControlsOverlay({ client, onGeometry: (value) => values.push(value) });65 assert(66 JSON.stringify(values[0]?.titlebarArea) ===67 JSON.stringify({ x: 0, y: 0, width: 0, height: 30 }),68 "malformed geometry escaped",69 );70});