skip to content
==> 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}