feat: add occurrence-aware appointment search
This commit is contained in:
@@ -36,6 +36,11 @@ void test_full_month_render()
|
||||
.focused_event_id = std::nullopt,
|
||||
.show_event_details = false,
|
||||
.confirm_delete = false,
|
||||
.search_prompt = false,
|
||||
.show_search_results = false,
|
||||
.search_query = {},
|
||||
.search_results = {},
|
||||
.search_result_index = 0,
|
||||
.notification = {},
|
||||
.notification_is_error = false,
|
||||
};
|
||||
@@ -79,6 +84,11 @@ void test_compact_and_input()
|
||||
.focused_event_id = std::nullopt,
|
||||
.show_event_details = false,
|
||||
.confirm_delete = false,
|
||||
.search_prompt = false,
|
||||
.show_search_results = false,
|
||||
.search_query = {},
|
||||
.search_results = {},
|
||||
.search_result_index = 0,
|
||||
.notification = {},
|
||||
.notification_is_error = false,
|
||||
};
|
||||
@@ -103,6 +113,49 @@ void test_navigation()
|
||||
"down moves by one week");
|
||||
}
|
||||
|
||||
void test_search_frames()
|
||||
{
|
||||
using namespace std::chrono;
|
||||
auto state = nocal::tui::ScreenState{};
|
||||
state.visible_month = year{2026} / July;
|
||||
state.selected_day = year{2026} / July / day{17};
|
||||
state.today = state.selected_day;
|
||||
state.width = 72;
|
||||
state.height = 12;
|
||||
state.ansi = false;
|
||||
state.search_prompt = true;
|
||||
state.search_query = "team";
|
||||
auto frame = nocal::tui::render_month(
|
||||
std::span<const nocal::tui::CalendarItem>{}, state);
|
||||
check(frame.find("SEARCH APPOINTMENTS") != std::string::npos &&
|
||||
frame.find("/ team_") != std::string::npos,
|
||||
"search prompt renders its query and context");
|
||||
check(std::count(frame.begin(), frame.end(), '\n') == 11,
|
||||
"search prompt fills the requested height");
|
||||
|
||||
state.search_prompt = false;
|
||||
state.show_search_results = true;
|
||||
state.search_results = {
|
||||
{.focus_id = "one", .title = "Team planning",
|
||||
.day = year{2026} / July / day{18}, .time_of_day = hours{9},
|
||||
.all_day = false, .location = "Studio", .recurring = false},
|
||||
{.focus_id = "two", .title = "Team holiday",
|
||||
.day = year{2026} / July / day{19}, .time_of_day = std::nullopt,
|
||||
.all_day = true, .location = {}, .recurring = true},
|
||||
};
|
||||
state.search_result_index = 1;
|
||||
frame = nocal::tui::render_month(
|
||||
std::span<const nocal::tui::CalendarItem>{}, state);
|
||||
check(frame.find("2 matches") != std::string::npos &&
|
||||
frame.find("2026-07-18 09:00") != std::string::npos &&
|
||||
frame.find("Team holiday") != std::string::npos,
|
||||
"search results render counts, dates, times, and titles");
|
||||
check(frame.find("\x1b[") == std::string::npos,
|
||||
"search remains readable with ANSI disabled");
|
||||
check(nocal::tui::decode_key("/") == nocal::tui::Action::search,
|
||||
"slash opens appointment search");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
int main()
|
||||
@@ -110,6 +163,7 @@ int main()
|
||||
test_full_month_render();
|
||||
test_compact_and_input();
|
||||
test_navigation();
|
||||
test_search_frames();
|
||||
if (failures != 0) {
|
||||
std::cerr << failures << " TUI test(s) failed\n";
|
||||
return EXIT_FAILURE;
|
||||
|
||||
Reference in New Issue
Block a user