/** The sizes the dividers were dragged to, kept in the browser: what is written, read back and refused. */ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { keepPanelSize, panelSize, resetPanelSizes } from '../../src/editor/panelSizes'; const STORAGE_KEY = 'feuerwerk.panel-sizes'; function memoryStore(initial: Record = {}) { const items = new Map(Object.entries(initial)); return { items, getItem: (key: string) => items.get(key) ?? null, setItem: (key: string, value: string) => void items.set(key, value), }; } describe('the memory of panel sizes', () => { beforeEach(() => resetPanelSizes()); afterEach(() => { vi.unstubAllGlobals(); resetPanelSizes(); }); it('starts a panel at its own size where nothing was kept', () => { vi.stubGlobal('window', { localStorage: memoryStore() }); expect(panelSize('left', 250, 160, 500)).toBe(250); }); it('writes a size to the browser and reads it back on a new page', () => { const store = memoryStore(); vi.stubGlobal('window', { localStorage: store }); keepPanelSize('left', 320); expect(panelSize('left', 250, 160, 500)).toBe(320); resetPanelSizes(); expect(panelSize('left', 250, 160, 500)).toBe(320); expect(JSON.parse(store.items.get(STORAGE_KEY) ?? '')).toEqual({ left: 320 }); }); it('keeps every panel under its own name', () => { const store = memoryStore(); vi.stubGlobal('window', { localStorage: store }); keepPanelSize('right', 410); keepPanelSize('console', 120); keepPanelSize('right', 430); resetPanelSizes(); expect(panelSize('right', 350, 200, 600)).toBe(430); expect(panelSize('console', 300, 28, 600)).toBe(120); expect(panelSize('left', 250, 160, 500)).toBe(250); expect(JSON.parse(store.items.get(STORAGE_KEY) ?? '')).toEqual({ console: 120, right: 430 }); }); it('holds a kept size to the bounds the divider keeps today', () => { vi.stubGlobal('window', { localStorage: memoryStore({ [STORAGE_KEY]: JSON.stringify({ left: 9000, right: 3, share: 0.5 }) }), }); expect(panelSize('left', 250, 160, 500)).toBe(500); expect(panelSize('right', 350, 200, 600)).toBe(200); expect(panelSize('share', 0.6, 0.15, 0.85)).toBe(0.5); }); it('reads rubbish as nothing', () => { for (const rubbish of ['{broken', '[300]', '"wide"', 'null', '{"left":"300","right":null}']) { resetPanelSizes(); vi.stubGlobal('window', { localStorage: memoryStore({ [STORAGE_KEY]: rubbish }) }); expect(panelSize('left', 250, 160, 500), rubbish).toBe(250); expect(panelSize('right', 350, 200, 600), rubbish).toBe(350); } }); it('remembers for the page where the browser gives no storage', () => { keepPanelSize('left', 300); expect(panelSize('left', 250, 160, 500)).toBe(300); resetPanelSizes(); expect(panelSize('left', 250, 160, 500)).toBe(250); }); it('remembers for the page where the browser refuses to write', () => { vi.stubGlobal('window', { localStorage: { getItem: () => null, setItem: () => { throw new Error('quota'); }, }, }); expect(() => keepPanelSize('left', 300)).not.toThrow(); expect(panelSize('left', 250, 160, 500)).toBe(300); }); });