// @vitest-environment happy-dom import { describe, expect, it } from 'vitest'; import { createScreenView } from './screenview'; function mount(withInlineStyle = false) { document.body.innerHTML = withInlineStyle ? '' : ''; const source = document.getElementById('screen') as HTMLCanvasElement; const view = createScreenView(source); document.body.append(view.el); return { view, source }; } const click = (el: Element) => el.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true })); describe('THE SCREEN click-to-enlarge', () => { it('starts closed and leaves THE SCREEN alone', () => { const { view, source } = mount(); expect(view.isOpen()).toBe(false); expect(source.getAttribute('style')).toBeNull(); }); it('enlarges THE SCREEN and dims the backdrop when clicked', () => { const { view, source } = mount(); click(source); expect(view.isOpen()).toBe(true); expect(view.el.classList.contains('is-open')).toBe(true); const style = source.getAttribute('style')!; expect(style).toContain('position:fixed'); expect(style).toContain('z-index:41'); // above the backdrop }); it('restores THE SCREEN exactly as it found it', () => { // Another lane owns this element; we must hand it back untouched. const { view, source } = mount(); click(source); view.close(); expect(source.getAttribute('style')).toBeNull(); expect(view.isOpen()).toBe(false); }); it('preserves inline styles LANE-SCREEN may add later', () => { const { view, source } = mount(true); const before = source.getAttribute('style'); click(source); expect(source.getAttribute('style')).toContain('top:10px'); // ours appended, not replacing view.close(); expect(source.getAttribute('style')).toBe(before); }); it('closes when the enlarged SCREEN is clicked again', () => { const { view, source } = mount(); click(source); click(source); expect(view.isOpen()).toBe(false); expect(source.getAttribute('style')).toBeNull(); }); it('closes on a click on the dimmed backdrop', () => { const { view, source } = mount(); click(source); click(view.el); expect(view.isOpen()).toBe(false); }); it('close() is idempotent and does not clobber the style on a second call', () => { const { view, source } = mount(true); const before = source.getAttribute('style'); view.close(); view.close(); expect(source.getAttribute('style')).toBe(before); }); it('survives having no SCREEN to enlarge', () => { document.body.innerHTML = ''; const view = createScreenView(null); expect(() => { view.toggle(); view.close(); }).not.toThrow(); }); });