1package tui
2
3import "testing"
4
5func TestReaderParsesCSIUShiftEnter(t *testing.T) {
6 k := readKey(t, "\x1b[13;2u")
7 if k.Kind != KeyEnter || !k.Shift || k.Alt {
8 t.Fatalf("Read kind=%v shift=%v alt=%v, want shift+enter", k.Kind, k.Shift, k.Alt)
9 }
10}
11
12func TestReaderParsesModifyOtherKeysShiftEnter(t *testing.T) {
13 k := readKey(t, "\x1b[27;2;13~")
14 if k.Kind != KeyEnter || !k.Shift || k.Alt {
15 t.Fatalf("Read kind=%v shift=%v alt=%v, want shift+enter", k.Kind, k.Shift, k.Alt)
16 }
17}
18
19func TestReaderParsesCSIUCtrlC(t *testing.T) {
20 k := readKey(t, "\x1b[99;5u")
21 if k.Kind != KeyCtrlC || !k.Ctrl {
22 t.Fatalf("Read kind=%v ctrl=%v, want ctrl+c", k.Kind, k.Ctrl)
23 }
24}
25
26func TestReaderParsesModifyOtherKeysCtrlC(t *testing.T) {
27 k := readKey(t, "\x1b[27;5;99~")
28 if k.Kind != KeyCtrlC || !k.Ctrl {
29 t.Fatalf("Read kind=%v ctrl=%v, want ctrl+c", k.Kind, k.Ctrl)
30 }
31}
32
33func TestReaderParsesSGRMouseWheel(t *testing.T) {
34 cases := []struct {
35 seq string
36 want KeyKind
37 }{
38 {"\x1b[<64;10;20M", KeyMouseWheelUp},
39 {"\x1b[<65;10;20M", KeyMouseWheelDown},
40 }
41 for _, tc := range cases {
42 k := readKey(t, tc.seq)
43 if k.Kind != tc.want {
44 t.Fatalf("Read(%q) kind=%v, want %v", tc.seq, k.Kind, tc.want)
45 }
46 }
47}
48
49func readKey(t *testing.T, seq string) Key {
50 t.Helper()
51 idx := 0
52 r := NewReader(func() (byte, error) {
53 b := seq[idx]
54 idx++
55 return b, nil
56 })
57 k, err := r.Read()
58 if err != nil {
59 t.Fatalf("Read(%q): %v", seq, err)
60 }
61 return k
62}