FxLibcTest/src/main.c

143 lines
4.1 KiB
C

#include <gint/display.h>
#include <gint/keyboard.h>
#include <ft/widgets/gscreen.h>
#include <ft/widgets/flist.h>
#include <ft/widgets/fbrowser.h>
#include <ft/test.h>
#include <ft/all-tests.h>
/* We don't initialize the test result fields below */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
ft_list headers_libc[] = {
{ "<ctype.h>", (ft_test*[]){
&ft_ctype_trivial_success,
&ft_ctype_trivial_failure,
&ft_ctype_trivial_empty,
NULL,
}},
{ "<locale.h>", NULL },
{ "<setjmp.h>", NULL },
{ "<signal.h>", NULL },
{ "<stdio.h>", NULL },/*(ft_test[]){
{ "Formatted printing basics", NULL, NULL },
{ "Format types and options", NULL, NULL },
{ NULL },
}}, */
{ "<stdlib.h>", NULL },
{ "<string.h>", (ft_test*[]){
&ft_string_memset,
&ft_string_memcpy,
&ft_string_memmove,
NULL,
}},
{ "<time.h>", NULL },
{ "<uchar.h>", NULL },
{ "<wchar.h>", NULL },
{ "<wctype.h>", NULL },
{ NULL }
};
ft_list headers_posix[] = {
{ "<unistd.h>", NULL },
{ NULL }
};
#pragma GCC diagnostic pop
int main(void)
{
// Initialize test results
for(int i = 0; headers_libc[i].name; i++)
ft_list_init(&headers_libc[i]);
for(int i = 0; headers_posix[i].name; i++)
ft_list_init(&headers_posix[i]);
// Create GUI
gscreen *scr = gscreen_create2("FxLibc tests", NULL,
"FxLibc regression and performance tests", "/LIBC;/POSIX;;;;#RUN");
fbrowser *browser = fbrowser_create(NULL);
int selected_set = 0;
gscreen_add_tab(scr, browser, NULL);
fbrowser_set_headers(browser, headers_libc, false);
jwidget *results = jwidget_create(NULL);
gscreen_add_tab(scr, results, NULL);
gscreen_set_tab_fkeys_visible(scr, 1, false);
// Event handling
while(1) {
jevent e = jscene_run(scr->scene);
int tab = gscreen_current_tab(scr);
int key = 0;
if(e.type == JSCENE_KEY || e.key.type == KEYEV_DOWN) key = e.key.key;
if(e.type == JSCENE_PAINT) {
dclear(C_WHITE);
jscene_render(scr->scene);
dupdate();
}
// Switch lists on F1/F2
if(tab == 0 && key == KEY_F1 && selected_set != 0) {
fbrowser_set_headers(browser, headers_libc, false);
selected_set = 0;
}
if(tab == 0 && key == KEY_F2 && selected_set != 1) {
fbrowser_set_headers(browser, headers_posix, false);
selected_set = 1;
}
// Run tests
if(tab == 0 && key == KEY_F6) {
ft_list *header = fbrowser_current_header(browser);
ft_test *test = fbrowser_current_test(browser);
if(test) {
ft_test_run(test);
ft_list_aggregate(header);
browser->widget.update = 1;
}
else if(header) {
ft_list_run(header);
browser->widget.update = 1;
}
else {
for(int i = 0; headers_libc[i].name; i++)
ft_list_run(&headers_libc[i]);
for(int i = 0; headers_posix[i].name; i++)
ft_list_run(&headers_posix[i]);
browser->widget.update = 1;
}
}
// Browse test results
if(tab == 0 && e.type == FBROWSER_VALIDATED && e.source == browser) {
ft_test *test = fbrowser_current_test(browser);
if(ft_test_done(test) && test->widget) {
jwidget *w = test->widget(test);
if(w) {
jwidget_add_child(results, w);
gscreen_show_tab(scr, 1);
jscene_set_focused_widget(scr->scene, w);
}
}
}
// Close test results
if(tab == 1 && key == KEY_EXIT) {
jscene_set_focused_widget(scr->scene, browser->tests);
gscreen_show_tab(scr, 0);
while(results->child_count > 0) {
jwidget_destroy(results->children[0]);
}
}
}
gscreen_destroy(scr);
return 1;
}