Files

83 lines
2.3 KiB
C++

// SPDX-License-Identifier: GPL-3.0-or-later
// Copyright (C) 2026 steredbits and Pelagia contributors
// Tests of the focus logic (list, grid, rows) and scrolling.
#include "test_framework.h"
#include "ui/focus.h"
using ui::Dir;
static void test_list() {
ui::ListFocus l;
CHECK(!l.move(Dir::Down)); // liste vide
l.set_count(3);
CHECK(!l.move(Dir::Up)); // no wrapping
CHECK(l.move(Dir::Down) && l.move(Dir::Down));
CHECK(!l.move(Dir::Down));
CHECK_EQ(l.index(), 2);
CHECK(!l.move(Dir::Left));
l.set_count(1); // shortened list: focus brought back
CHECK_EQ(l.index(), 0);
l.set_count(10);
l.set_index(7);
CHECK_EQ(l.scroll_top(4), 4); // 7 visible at the bottom of the window
l.set_index(5);
CHECK_EQ(l.scroll_top(4), 4); // already visible: no jump
l.set_index(1);
CHECK_EQ(l.scroll_top(4), 1);
}
static void test_grid() {
ui::GridFocus g(7);
g.set_count(16); // rows of 7, 7, 2
CHECK_EQ(g.rows(), 3);
CHECK(!g.move(Dir::Left) && !g.move(Dir::Up));
g.set_index(6);
CHECK(!g.move(Dir::Right)); // bord droit
CHECK(g.move(Dir::Down));
CHECK_EQ(g.index(), 13);
CHECK(g.move(Dir::Down)); // incomplete last row: last element
CHECK_EQ(g.index(), 15);
CHECK(!g.move(Dir::Down));
CHECK(!g.move(Dir::Right)); // no element to the right
CHECK(g.move(Dir::Up));
CHECK_EQ(g.index(), 8);
CHECK_EQ(g.scroll_row(2), 0);
g.set_index(15);
CHECK_EQ(g.scroll_row(2), 1);
g.set_index(0);
CHECK_EQ(g.scroll_row(2), 0);
g.set_count(3);
CHECK(!g.move(Dir::Down)); // a single row
}
static void test_rows() {
ui::RowsFocus r;
r.set_rows({3, 0, 5});
CHECK_EQ(r.row(), 0);
CHECK(r.move(Dir::Down)); // empty row skipped
CHECK_EQ(r.row(), 2);
CHECK(r.move(Dir::Right) && r.move(Dir::Right));
CHECK(r.move(Dir::Up));
CHECK_EQ(r.index(), 0);
CHECK(r.move(Dir::Down));
CHECK_EQ(r.index(), 2); // remembered position
CHECK(!r.move(Dir::Down));
r.set_rows({0, 0, 5}); // current row kept
CHECK_EQ(r.row(), 2);
r.set_rows({0, 4}); // row disappeared: first non-empty one
CHECK_EQ(r.row(), 1);
r.set_rows({20});
r.set_position(0, 12);
CHECK_EQ(r.scroll_in(0, 7), 6);
r.set_rows({});
CHECK(!r.move(Dir::Down));
}
int main() {
test_list();
test_grid();
test_rows();
return testfw::test_failures();
}