==> tests/input.c <==1/* Byte sequences terminals send, decoded as crossterm decodes them. */
2#include "mesh/check.h"
3#include "tui/input.h"
4
5#include <string.h>
6
7static tui_key one(const char *s, bool quiet, size_t *used) {
8 tui_key k;
9 *used = tui_input_parse(s, strlen(s), quiet, &k);
10 return k;
11}
12
13int main(void) {
14 size_t n;
15 tui_key k = one("q", false, &n);
16 CHECK(k.code == TUI_KEY_CHAR && k.ch == 'q' && n == 1);
17 k = one("L", false, &n);
18 CHECK(k.code == TUI_KEY_CHAR && k.ch == 'L' && k.mods == TUI_MOD_SHIFT);
19 k = one("\x03", false, &n);
20 CHECK(k.code == TUI_KEY_CHAR && k.ch == 'c' && k.mods == TUI_MOD_CONTROL);
21 CHECK(one("\x1b[A", false, &n).code == TUI_KEY_UP && n == 3);
22 CHECK(one("\x1bOB", false, &n).code == TUI_KEY_DOWN && n == 3);
23 CHECK(one("\x1b[5~", false, &n).code == TUI_KEY_PAGE_UP && n == 4);
24 CHECK(one("\x1b[6~", false, &n).code == TUI_KEY_PAGE_DOWN);
25 CHECK(one("\x1b[Z", false, &n).code == TUI_KEY_BACKTAB);
26 k = one("\x1bOP", false, &n);
27 CHECK(k.code == TUI_KEY_F && k.f == 1);
28 k = one("\x1b[12~", false, &n);
29 CHECK(k.code == TUI_KEY_F && k.f == 2);
30 k = one("\x1b[1;5C", false, &n);
31 CHECK(k.code == TUI_KEY_RIGHT && k.mods == TUI_MOD_CONTROL && n == 6);
32 CHECK(one("\x7f", false, &n).code == TUI_KEY_BACKSPACE);
33 CHECK(one("\r", false, &n).code == TUI_KEY_ENTER);
34 CHECK(one("\t", false, &n).code == TUI_KEY_TAB);
35 /* A lone ESC waits for quiet. */
36 one("\x1b", false, &n);
37 CHECK_U(n, 0);
38 CHECK(one("\x1b", true, &n).code == TUI_KEY_ESC && n == 1);
39 /* An incomplete CSI waits. */
40 one("\x1b[1;", false, &n);
41 CHECK_U(n, 0);
42 /* UTF-8. */
43 k = one("\xC3\xA9x", false, &n);
44 CHECK(k.code == TUI_KEY_CHAR && k.ch == 0xE9 && n == 2);
45 one("\xE2\x86", false, &n);
46 CHECK_U(n, 0);
47 /* Alt+x. */
48 k = one("\x1bx", false, &n);
49 CHECK(k.code == TUI_KEY_CHAR && k.ch == 'x' && (k.mods & TUI_MOD_ALT) && n == 2);
50 /* Mouse reports are consumed and ignored. */
51 k = one("\x1b[<0;10;5M", false, &n);
52 CHECK(k.code == TUI_KEY_NONE && n == strlen("\x1b[<0;10;5M"));
53 return mesh_check_done();
54}