| 1 | // `node --test node-tui/mouse.test.ts` |
| 2 | import { test } from 'node:test'; |
| 3 | import assert from 'node:assert/strict'; |
| 4 | import { parseMouse, isMouseSequence } from './mouse.ts'; |
| 5 | |
| 6 | test('parses a left click and converts to zero-based coordinates', () => { |
| 7 | const [event] = parseMouse('\x1b[<0;35;12M'); |
| 8 | assert.deepEqual(event, { button: 'left', column: 34, row: 11, pressed: true }); |
| 9 | }); |
| 10 | |
| 11 | test('distinguishes press from release', () => { |
| 12 | assert.equal(parseMouse('\x1b[<0;1;1m')[0]?.pressed, false); |
| 13 | }); |
| 14 | |
| 15 | test('decodes the wheel', () => { |
| 16 | assert.equal(parseMouse('\x1b[<64;1;1M')[0]?.button, 'wheel-up'); |
| 17 | assert.equal(parseMouse('\x1b[<65;1;1M')[0]?.button, 'wheel-down'); |
| 18 | }); |
| 19 | |
| 20 | test('ignores modifier bits when decoding the button', () => { |
| 21 | // 16 is ctrl held; the button is still left. |
| 22 | assert.equal(parseMouse('\x1b[<16;1;1M')[0]?.button, 'left'); |
| 23 | }); |
| 24 | |
| 25 | test('handles coordinates beyond the old 223-column limit', () => { |
| 26 | const [event] = parseMouse('\x1b[<0;500;300M'); |
| 27 | assert.equal(event?.column, 499); |
| 28 | assert.equal(event?.row, 299); |
| 29 | }); |
| 30 | |
| 31 | test('parses several reports from one chunk', () => { |
| 32 | assert.equal(parseMouse('\x1b[<0;1;1M\x1b[<0;1;1m\x1b[<65;2;2M').length, 3); |
| 33 | }); |
| 34 | |
| 35 | test('is not confused by ordinary typing', () => { |
| 36 | assert.deepEqual(parseMouse('hello'), []); |
| 37 | assert.equal(isMouseSequence('hello'), false); |
| 38 | }); |
| 39 | |
| 40 | test('recognises a mouse chunk so the keymap can skip it', () => { |
| 41 | assert.equal(isMouseSequence('\x1b[<0;35;12M'), true); |
| 42 | }); |
| 43 | |
| 44 | test('recognises a report whose ESC Ink already consumed', () => { |
| 45 | // This is what useInput actually receives — without it, clicking types |
| 46 | // "[<0;9;6M" into the pattern. |
| 47 | assert.equal(isMouseSequence('[<0;9;6M'), true); |
| 48 | assert.equal(parseMouse('[<0;9;6M')[0]?.button, 'left'); |
| 49 | }); |