import { describe, expect, test } from 'bun:test'; import { paneAt, parseMouseEvent } from './mouse'; describe('parseMouseEvent', () => { test('parses raw SGR press event', () => { expect(parseMouseEvent('\x1b[<0;5;3M')).toEqual({ button: 0, col: 4, row: 2, pressed: true, }); }); test('parses Ink-relayed form (no leading ESC+CSI)', () => { expect(parseMouseEvent('[<2;15;7M')).toEqual({ button: 2, col: 14, row: 6, pressed: true, }); }); test('press vs release', () => { expect(parseMouseEvent('[<0;1;1M')?.pressed).toBe(true); expect(parseMouseEvent('[<0;1;1m')?.pressed).toBe(false); }); test('returns null for non-mouse input', () => { expect(parseMouseEvent('q')).toBeNull(); expect(parseMouseEvent('\x1b[A')).toBeNull(); // arrow key, not mouse expect(parseMouseEvent('')).toBeNull(); }); }); const REGIONS = { bodyHeight: 30, leftColWidth: 40, summaryHeight: 6, categoriesHeight: 8, detailHeight: 15, }; describe('paneAt', () => { test('top-left of left column → summary', () => { expect(paneAt(0, 0, REGIONS)).toEqual({ pane: 'summary', rowInPane: 0 }); }); test('mid-left below summary → categories with row offset', () => { expect(paneAt(10, 8, REGIONS)).toEqual({ pane: 'categories', rowInPane: 2 }); }); test('bottom of left column → findings with row offset', () => { expect(paneAt(20, 25, REGIONS)).toEqual({ pane: 'findings', rowInPane: 25 - REGIONS.summaryHeight - REGIONS.categoriesHeight, }); }); test('right column top → detail', () => { expect(paneAt(50, 5, REGIONS)).toEqual({ pane: 'detail', rowInPane: 5 }); }); test('right column bottom → log with offset', () => { expect(paneAt(60, 20, REGIONS)).toEqual({ pane: 'log', rowInPane: 20 - REGIONS.detailHeight, }); }); test('keybar row (out of body) → null', () => { expect(paneAt(10, 30, REGIONS)).toBeNull(); expect(paneAt(10, 50, REGIONS)).toBeNull(); }); test('negative col returns null', () => { expect(paneAt(-1, 5, REGIONS)).toBeNull(); }); });