notcurses/tests/menu.cpp

149 lines
5.4 KiB
C++
Raw Normal View History

2020-02-01 22:36:42 +00:00
#include "main.h"
#include <cstring>
#include <iostream>
TEST_CASE("MenuTest") {
2020-02-09 03:58:46 +00:00
if(!enforce_utf8()){
return;
}
2020-02-01 22:36:42 +00:00
if(getenv("TERM") == nullptr){
return;
}
notcurses_options nopts{};
nopts.inhibit_alternate_screen = true;
nopts.suppress_banner = true;
FILE* outfp_ = fopen("/dev/tty", "wb");
REQUIRE(outfp_);
struct notcurses* nc_ = notcurses_init(&nopts, outfp_);
REQUIRE(nc_);
struct ncplane* n_ = notcurses_stdplane(nc_);
REQUIRE(n_);
REQUIRE(0 == ncplane_cursor_move_yx(n_, 0, 0));
2020-02-03 18:08:45 +00:00
// an empty menu ought be rejected
SUBCASE("EmptyMenuTopReject") {
struct ncmenu_options opts{};
2020-02-01 22:36:42 +00:00
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
2020-02-03 18:08:45 +00:00
REQUIRE(nullptr == ncm);
2020-02-01 22:36:42 +00:00
CHECK(0 == notcurses_render(nc_));
2020-02-04 05:08:03 +00:00
ncmenu_destroy(nc_, ncm);
2020-02-01 22:36:42 +00:00
}
2020-02-03 18:08:45 +00:00
SUBCASE("EmptyMenuBottomReject") {
struct ncmenu_options opts{};
2020-02-01 22:36:42 +00:00
opts.bottom = true;
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
2020-02-03 18:08:45 +00:00
REQUIRE(nullptr == ncm);
CHECK(0 == notcurses_render(nc_));
2020-02-04 05:08:03 +00:00
ncmenu_destroy(nc_, ncm);
2020-02-03 18:08:45 +00:00
}
// an empty section ought be rejected
SUBCASE("EmptySectionReject") {
struct ncmenu_options opts{};
struct ncmenu_section sections[] = {
2020-02-09 03:24:31 +00:00
{ .name = strdup("Empty"), .itemcount = 0, .items = nullptr, .shortcut = ncinput(), },
2020-02-03 18:08:45 +00:00
};
opts.sections = sections;
opts.sectioncount = sizeof(sections) / sizeof(*sections);
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
REQUIRE(nullptr == ncm);
CHECK(0 == notcurses_render(nc_));
2020-02-04 05:08:03 +00:00
ncmenu_destroy(nc_, ncm);
2020-02-03 18:08:45 +00:00
}
// a section with only separators ought be rejected
SUBCASE("SeparatorSectionReject") {
struct ncmenu_item empty_items[] = {
2020-02-09 03:24:31 +00:00
{ .desc = nullptr, .shortcut = ncinput(), },
2020-02-03 18:08:45 +00:00
};
struct ncmenu_section sections[] = {
2020-02-09 03:24:31 +00:00
{ .name = strdup("Empty"), .itemcount = 1, .items = empty_items, .shortcut = ncinput(), },
2020-02-03 18:08:45 +00:00
};
struct ncmenu_options opts{};
opts.sections = sections;
opts.sectioncount = sizeof(sections) / sizeof(*sections);
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
REQUIRE(nullptr == ncm);
2020-02-01 22:36:42 +00:00
CHECK(0 == notcurses_render(nc_));
2020-02-04 05:08:03 +00:00
ncmenu_destroy(nc_, ncm);
2020-02-01 22:36:42 +00:00
}
2020-02-03 17:46:40 +00:00
SUBCASE("MenuOneSection") {
struct ncmenu_item file_items[] = {
2020-02-09 03:24:31 +00:00
{ .desc = strdup("I would like a new file"), .shortcut = ncinput(), },
2020-02-03 17:46:40 +00:00
};
struct ncmenu_section sections[] = {
2020-02-09 03:24:31 +00:00
{ .name = strdup("File"), .itemcount = sizeof(file_items) / sizeof(*file_items), .items = file_items, .shortcut = ncinput(), },
2020-02-03 17:46:40 +00:00
};
struct ncmenu_options opts{};
opts.sections = sections;
opts.sectioncount = sizeof(sections) / sizeof(*sections);
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
REQUIRE(nullptr != ncm);
CHECK(0 == notcurses_render(nc_));
2020-02-04 05:08:03 +00:00
ncmenu_destroy(nc_, ncm);
}
2020-02-04 05:17:51 +00:00
// only one menu at a time per notcurses object
SUBCASE("RejectDoubleMenu") {
2020-02-04 05:08:03 +00:00
struct ncmenu_item file_items[] = {
2020-02-09 03:24:31 +00:00
{ .desc = strdup("I would like a new file"), .shortcut = ncinput(), },
2020-02-04 05:08:03 +00:00
};
struct ncmenu_section sections[] = {
2020-02-09 03:24:31 +00:00
{ .name = strdup("File"), .itemcount = sizeof(file_items) / sizeof(*file_items), .items = file_items, .shortcut = ncinput(), },
2020-02-04 05:08:03 +00:00
};
struct ncmenu_options opts{};
opts.sections = sections;
opts.sectioncount = sizeof(sections) / sizeof(*sections);
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
REQUIRE(nullptr != ncm);
struct ncmenu* ncmdup = ncmenu_create(nc_, &opts);
REQUIRE(nullptr == ncmdup);
opts.bottom = true;
2020-02-04 05:17:51 +00:00
ncmdup = ncmenu_create(nc_, &opts);
2020-02-04 05:08:03 +00:00
REQUIRE(nullptr == ncmdup);
CHECK(0 == notcurses_render(nc_));
ncmenu_destroy(nc_, ncm);
}
// don't call ncmenu_destroy(), invoking destruction in notcurses_stop()
SUBCASE("MenuNoFree") {
struct ncmenu_item file_items[] = {
2020-02-09 03:24:31 +00:00
{ .desc = strdup("I would like a new file"), .shortcut = ncinput(), },
2020-02-04 05:08:03 +00:00
};
struct ncmenu_section sections[] = {
2020-02-09 03:24:31 +00:00
{ .name = strdup("File"), .itemcount = sizeof(file_items) / sizeof(*file_items), .items = file_items, .shortcut = ncinput(), },
2020-02-04 05:08:03 +00:00
};
struct ncmenu_options opts{};
opts.sections = sections;
opts.sectioncount = sizeof(sections) / sizeof(*sections);
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
REQUIRE(nullptr != ncm);
CHECK(0 == notcurses_render(nc_));
2020-02-03 17:46:40 +00:00
}
2020-02-03 20:20:40 +00:00
SUBCASE("VeryLongMenu") {
struct ncmenu_item items[] = {
2020-02-09 03:24:31 +00:00
{ .desc = strdup("Generic menu entry"), .shortcut = ncinput(), },
2020-02-03 20:20:40 +00:00
};
struct ncmenu_section sections[] = {
2020-02-09 03:24:31 +00:00
{ .name = strdup("antidisestablishmentarianism"), .itemcount = sizeof(items) / sizeof(*items), .items = items, .shortcut = ncinput(), },
{ .name = strdup("floccinaucinihilipilification"), .itemcount = sizeof(items) / sizeof(*items), .items = items, .shortcut = ncinput(), },
{ .name = strdup("pneumonoultramicroscopicsilicovolcanoconiosis"), .itemcount = sizeof(items) / sizeof(*items), .items = items, .shortcut = ncinput(), },
{ .name = strdup("supercalifragilisticexpialidocious"), .itemcount = sizeof(items) / sizeof(*items), .items = items, .shortcut = ncinput(), },
{ .name = strdup("Incomprehensibilities"), .itemcount = sizeof(items) / sizeof(*items), .items = items, .shortcut = ncinput(), },
2020-02-03 20:20:40 +00:00
};
struct ncmenu_options opts{};
opts.sections = sections;
opts.sectioncount = sizeof(sections) / sizeof(*sections);
struct ncmenu* ncm = ncmenu_create(nc_, &opts);
REQUIRE(nullptr != ncm);
CHECK(0 == notcurses_render(nc_));
2020-02-04 05:08:03 +00:00
ncmenu_destroy(nc_, ncm);
2020-02-03 20:20:40 +00:00
}
2020-02-01 22:36:42 +00:00
CHECK(0 == notcurses_stop(nc_));
CHECK(0 == fclose(outfp_));
}