aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAnders Betts <anders.betts@gmail.com>2026-09-20 00:05:51 +0200
committerAnders Betts <anders.betts@gmail.com>2026-09-20 00:05:51 +0200
commita61cfeefb0599e74fc9189b189b16dd0b6d36f0f (patch)
tree83e0934e190744605e91e69cd032e91c85eecf57 /tests
parent1f2d7a8190876e3d1c541251e079a11a2cc637f2 (diff)
downloadbokf-0.1.44.tar.gz
bokf-0.1.44.zip
tui: remember the focused row in forms and the bokslut hubv0.1.44
Diffstat (limited to 'tests')
-rw-r--r--tests/test_tui.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/test_tui.c b/tests/test_tui.c
index 15a44c7..a024e27 100644
--- a/tests/test_tui.c
+++ b/tests/test_tui.c
@@ -433,6 +433,67 @@ static void test_form_actions(void)
CHECK(tui_form_act_step(1, 0, ACTS, 6, -1) == 5);
}
+static void test_form_focus(void)
+{
+ const int nf = 3;
+
+ /* start focus: a remembered row is kept, out of range clamps to the
+ nearest end, fields are always selectable */
+ CHECK(tui_form_focus_clamp(0, nf, ACTS, 6) == 0);
+ CHECK(tui_form_focus_clamp(2, nf, ACTS, 6) == 2);
+ CHECK(tui_form_focus_clamp(4, nf, ACTS, 6) == 4);
+ CHECK(tui_form_focus_clamp(6, nf, ACTS, 6) == 6); /* dimmed, selectable */
+ CHECK(tui_form_focus_clamp(8, nf, ACTS, 6) == 8);
+ CHECK(tui_form_focus_clamp(-1, nf, ACTS, 6) == 0);
+ CHECK(tui_form_focus_clamp(99, nf, ACTS, 6) == 8);
+
+ /* a heading row snaps forward (and wraps) to a selectable one */
+ CHECK(tui_form_focus_clamp(3, nf, ACTS, 6) == 4); /* action 0 is head */
+ CHECK(tui_form_focus_clamp(7, nf, ACTS, 6) == 8); /* action 4 is head */
+ CHECK(tui_form_focus_clamp(0, 0, ACTS, 6) == 1); /* fields gone */
+ static const struct tui_form_action WRAP[2] = {
+ { "Ã…rsredovisning (K2)", 1, NULL },
+ { "rubrik", -1, NULL },
+ };
+ CHECK(tui_form_focus_clamp(1, 0, WRAP, 2) == 0); /* wraps to the top */
+ static const struct tui_form_action HEADS[2] = {
+ { "rubrik", -1, NULL },
+ { "rubrik", -1, NULL },
+ };
+ CHECK(tui_form_focus_clamp(0, 0, HEADS, 2) == -1);
+ CHECK(tui_form_focus_clamp(-1, 0, HEADS, 2) == -1);
+
+ /* every return writes the current row back; NULL stores nothing */
+ int focus = 0;
+ CHECK(tui_form_focus_store(&focus, 4, TUI_FORM_BACK) == TUI_FORM_BACK);
+ CHECK(focus == 4);
+ CHECK(tui_form_focus_store(&focus, 5, TUI_FORM_REFRESH) ==
+ TUI_FORM_REFRESH);
+ CHECK(focus == 5);
+ CHECK(tui_form_focus_store(&focus, 6, TUI_FORM_SUBMIT) == TUI_FORM_SUBMIT);
+ CHECK(focus == 6);
+ CHECK(tui_form_focus_store(&focus, 8, TUI_FORM_ACTION + 1) ==
+ TUI_FORM_ACTION + 1);
+ CHECK(focus == 8);
+ CHECK(tui_form_focus_store(&focus, 1, 1) == 1 && focus == 1);
+ CHECK(tui_form_focus_store(&focus, -1, TUI_FORM_BACK) == TUI_FORM_BACK);
+ CHECK(focus == -1);
+ CHECK(tui_form_focus_store(NULL, 4, TUI_FORM_BACK) == TUI_FORM_BACK);
+
+ /* two runs in a row, like the hub: walk to an action and choose it, the
+ next run starts on the same row */
+ focus = tui_form_focus_clamp(0, nf, ACTS, 6);
+ CHECK(focus == 0);
+ focus = tui_form_act_key(focus, nf, ACTS, 6, '\t');
+ focus = tui_form_act_key(focus, nf, ACTS, 6, '\t');
+ focus = tui_form_act_key(focus, nf, ACTS, 6, '\t');
+ CHECK(focus == 4); /* Ã…rsredovisning (K2) */
+ CHECK(tui_form_focus_store(&focus, focus, TUI_FORM_ACTION + 1) ==
+ TUI_FORM_ACTION + 1);
+ CHECK(tui_form_focus_clamp(focus, nf, ACTS, 6) == 4);
+ CHECK(tui_form_focus_store(&focus, focus, TUI_FORM_BACK) == TUI_FORM_BACK);
+ CHECK(tui_form_focus_clamp(focus, nf, ACTS, 6) == 4);
+}
static char rt_cells[8][3][64];
static void rt_cb(void *ud, int row, int col, char **buf, size_t *cap)
@@ -617,6 +678,7 @@ int main(void)
test_nav_sections();
test_form_nav();
test_form_actions();
+ test_form_focus();
test_rowtable();
test_rt_fields();
test_rt_focus();