anvilsign in

collin/strudel-claude

pre-demo / node-tui / mouse.test.ts
1// `node --test node-tui/mouse.test.ts`
2import { test } from 'node:test';
3import assert from 'node:assert/strict';
4import { parseMouse, isMouseSequence } from './mouse.ts';
5
6test('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
11test('distinguishes press from release', () => {
12 assert.equal(parseMouse('\x1b[<0;1;1m')[0]?.pressed, false);
13});
14
15test('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
20test('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
25test('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
31test('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
35test('is not confused by ordinary typing', () => {
36 assert.deepEqual(parseMouse('hello'), []);
37 assert.equal(isMouseSequence('hello'), false);
38});
39
40test('recognises a mouse chunk so the keymap can skip it', () => {
41 assert.equal(isMouseSequence('\x1b[<0;35;12M'), true);
42});
43
44test('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});