Changeset 59768c7 in mainline for uspace/lib/ui/test/menu.c


Ignore:
Timestamp:
2022-01-10T19:29:00Z (2 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5de852c
Parents:
9754ed2
git-author:
Jiri Svoboda <jiri@…> (2022-01-10 19:27:55)
git-committer:
Jiri Svoboda <jiri@…> (2022-01-10 19:29:00)
Message:

Menu control using F10, cursor keys, Enter, Escape

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/test/menu.c

    r9754ed2 r59768c7  
    3636#include <ui/menu.h>
    3737#include <ui/menubar.h>
     38#include <ui/menuentry.h>
    3839#include <ui/ui.h>
    3940#include <ui/window.h>
     
    122123}
    123124
     125/** ui_menu_last() / ui_menu_prev() iterate over menus in reverse */
     126PCUT_TEST(last_prev)
     127{
     128        ui_t *ui = NULL;
     129        ui_window_t *window = NULL;
     130        ui_wnd_params_t params;
     131        ui_menu_bar_t *mbar = NULL;
     132        ui_menu_t *menu1 = NULL;
     133        ui_menu_t *menu2 = NULL;
     134        ui_menu_t *m;
     135        errno_t rc;
     136
     137        rc = ui_create_disp(NULL, &ui);
     138        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     139
     140        ui_wnd_params_init(&params);
     141        params.caption = "Hello";
     142
     143        rc = ui_window_create(ui, &params, &window);
     144        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     145        PCUT_ASSERT_NOT_NULL(window);
     146
     147        rc = ui_menu_bar_create(ui, window, &mbar);
     148        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     149        PCUT_ASSERT_NOT_NULL(mbar);
     150
     151        rc = ui_menu_create(mbar, "Test 1", &menu1);
     152        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     153        PCUT_ASSERT_NOT_NULL(menu1);
     154
     155        rc = ui_menu_create(mbar, "Test 1", &menu2);
     156        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     157        PCUT_ASSERT_NOT_NULL(menu2);
     158
     159        m = ui_menu_last(mbar);
     160        PCUT_ASSERT_EQUALS(menu2, m);
     161
     162        m = ui_menu_prev(m);
     163        PCUT_ASSERT_EQUALS(menu1, m);
     164
     165        m = ui_menu_prev(m);
     166        PCUT_ASSERT_NULL(m);
     167
     168        ui_menu_bar_destroy(mbar);
     169        ui_window_destroy(window);
     170        ui_destroy(ui);
     171}
     172
    124173/** ui_menu_caption() returns the menu's caption */
    125174PCUT_TEST(caption)
     
    209258}
    210259
    211 /** Paint background in graphics mode */
    212 PCUT_TEST(paint_bg_gfx)
     260/** Open and close menu with ui_menu_open() / ui_menu_close() */
     261PCUT_TEST(open_close)
    213262{
    214263        ui_t *ui = NULL;
     
    218267        ui_menu_t *menu = NULL;
    219268        gfx_rect_t prect;
    220         gfx_coord2_t pos;
    221269        errno_t rc;
    222270
     
    244292        prect.p1.y = 0;
    245293
    246         /* Menu needs to be open to be able to paint it */
     294        /* Open and close */
    247295        rc = ui_menu_open(menu, &prect);
    248296        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    249297
    250         pos.x = 0;
    251         pos.y = 0;
    252         rc = ui_menu_paint_bg_gfx(menu, &pos);
    253         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    254 
    255         ui_menu_bar_destroy(mbar);
    256         ui_window_destroy(window);
    257         ui_destroy(ui);
    258 }
    259 
    260 /** Paint background in text mode */
    261 PCUT_TEST(paint_bg_text)
     298        ui_menu_close(menu);
     299
     300        ui_menu_bar_destroy(mbar);
     301        ui_window_destroy(window);
     302        ui_destroy(ui);
     303}
     304
     305/** ui_menu_is_open() correctly returns menu state */
     306PCUT_TEST(is_open)
    262307{
    263308        ui_t *ui = NULL;
     
    267312        ui_menu_t *menu = NULL;
    268313        gfx_rect_t prect;
    269         gfx_coord2_t pos;
     314        bool open;
    270315        errno_t rc;
    271316
     
    293338        prect.p1.y = 0;
    294339
    295         /* Menu needs to be open to be able to paint it */
     340        open = ui_menu_is_open(menu);
     341        PCUT_ASSERT_FALSE(open);
     342
    296343        rc = ui_menu_open(menu, &prect);
    297344        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    298345
    299         pos.x = 0;
    300         pos.y = 0;
    301         rc = ui_menu_paint_bg_text(menu, &pos);
    302         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    303 
    304         ui_menu_bar_destroy(mbar);
    305         ui_window_destroy(window);
    306         ui_destroy(ui);
    307 }
    308 
    309 /** Paint menu */
    310 PCUT_TEST(paint)
     346        open = ui_menu_is_open(menu);
     347        PCUT_ASSERT_TRUE(open);
     348
     349        ui_menu_close(menu);
     350
     351        open = ui_menu_is_open(menu);
     352        PCUT_ASSERT_FALSE(open);
     353
     354        ui_menu_bar_destroy(mbar);
     355        ui_window_destroy(window);
     356        ui_destroy(ui);
     357}
     358
     359/** Paint background in graphics mode */
     360PCUT_TEST(paint_bg_gfx)
    311361{
    312362        ui_t *ui = NULL;
     
    348398        pos.x = 0;
    349399        pos.y = 0;
     400        rc = ui_menu_paint_bg_gfx(menu, &pos);
     401        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     402
     403        ui_menu_bar_destroy(mbar);
     404        ui_window_destroy(window);
     405        ui_destroy(ui);
     406}
     407
     408/** Paint background in text mode */
     409PCUT_TEST(paint_bg_text)
     410{
     411        ui_t *ui = NULL;
     412        ui_window_t *window = NULL;
     413        ui_wnd_params_t params;
     414        ui_menu_bar_t *mbar = NULL;
     415        ui_menu_t *menu = NULL;
     416        gfx_rect_t prect;
     417        gfx_coord2_t pos;
     418        errno_t rc;
     419
     420        rc = ui_create_disp(NULL, &ui);
     421        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     422
     423        ui_wnd_params_init(&params);
     424        params.caption = "Hello";
     425
     426        rc = ui_window_create(ui, &params, &window);
     427        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     428        PCUT_ASSERT_NOT_NULL(window);
     429
     430        rc = ui_menu_bar_create(ui, window, &mbar);
     431        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     432        PCUT_ASSERT_NOT_NULL(mbar);
     433
     434        rc = ui_menu_create(mbar, "Test", &menu);
     435        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     436        PCUT_ASSERT_NOT_NULL(menu);
     437
     438        prect.p0.x = 0;
     439        prect.p0.y = 0;
     440        prect.p1.x = 0;
     441        prect.p1.y = 0;
     442
     443        /* Menu needs to be open to be able to paint it */
     444        rc = ui_menu_open(menu, &prect);
     445        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     446
     447        pos.x = 0;
     448        pos.y = 0;
     449        rc = ui_menu_paint_bg_text(menu, &pos);
     450        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     451
     452        ui_menu_bar_destroy(mbar);
     453        ui_window_destroy(window);
     454        ui_destroy(ui);
     455}
     456
     457/** Paint menu */
     458PCUT_TEST(paint)
     459{
     460        ui_t *ui = NULL;
     461        ui_window_t *window = NULL;
     462        ui_wnd_params_t params;
     463        ui_menu_bar_t *mbar = NULL;
     464        ui_menu_t *menu = NULL;
     465        gfx_rect_t prect;
     466        gfx_coord2_t pos;
     467        errno_t rc;
     468
     469        rc = ui_create_disp(NULL, &ui);
     470        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     471
     472        ui_wnd_params_init(&params);
     473        params.caption = "Hello";
     474
     475        rc = ui_window_create(ui, &params, &window);
     476        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     477        PCUT_ASSERT_NOT_NULL(window);
     478
     479        rc = ui_menu_bar_create(ui, window, &mbar);
     480        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     481        PCUT_ASSERT_NOT_NULL(mbar);
     482
     483        rc = ui_menu_create(mbar, "Test", &menu);
     484        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     485        PCUT_ASSERT_NOT_NULL(menu);
     486
     487        prect.p0.x = 0;
     488        prect.p0.y = 0;
     489        prect.p1.x = 0;
     490        prect.p1.y = 0;
     491
     492        /* Menu needs to be open to be able to paint it */
     493        rc = ui_menu_open(menu, &prect);
     494        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     495
     496        pos.x = 0;
     497        pos.y = 0;
    350498        rc = ui_menu_paint(menu, &pos);
    351499        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     500
     501        ui_menu_bar_destroy(mbar);
     502        ui_window_destroy(window);
     503        ui_destroy(ui);
     504}
     505
     506/** ui_menu_up() with empty menu does nothing */
     507PCUT_TEST(up_empty)
     508{
     509        ui_t *ui = NULL;
     510        ui_window_t *window = NULL;
     511        ui_wnd_params_t params;
     512        ui_menu_bar_t *mbar = NULL;
     513        ui_menu_t *menu = NULL;
     514        gfx_rect_t prect;
     515        errno_t rc;
     516
     517        rc = ui_create_disp(NULL, &ui);
     518        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     519
     520        ui_wnd_params_init(&params);
     521        params.caption = "Hello";
     522
     523        rc = ui_window_create(ui, &params, &window);
     524        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     525        PCUT_ASSERT_NOT_NULL(window);
     526
     527        rc = ui_menu_bar_create(ui, window, &mbar);
     528        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     529        PCUT_ASSERT_NOT_NULL(mbar);
     530
     531        rc = ui_menu_create(mbar, "Test", &menu);
     532        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     533        PCUT_ASSERT_NOT_NULL(menu);
     534
     535        prect.p0.x = 0;
     536        prect.p0.y = 0;
     537        prect.p1.x = 0;
     538        prect.p1.y = 0;
     539
     540        /* Menu needs to be open to be able to move around it */
     541        rc = ui_menu_open(menu, &prect);
     542        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     543
     544        ui_menu_up(menu);
     545
     546        ui_menu_bar_destroy(mbar);
     547        ui_window_destroy(window);
     548        ui_destroy(ui);
     549}
     550
     551/** ui_menu_up() moves one entry up, skips separators, wraps around */
     552PCUT_TEST(up)
     553{
     554        ui_t *ui = NULL;
     555        ui_window_t *window = NULL;
     556        ui_wnd_params_t params;
     557        ui_menu_bar_t *mbar = NULL;
     558        ui_menu_t *menu = NULL;
     559        ui_menu_entry_t *mentry1 = NULL;
     560        ui_menu_entry_t *mentry2 = NULL;
     561        ui_menu_entry_t *mentry3 = NULL;
     562        gfx_rect_t prect;
     563        errno_t rc;
     564
     565        rc = ui_create_disp(NULL, &ui);
     566        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     567
     568        ui_wnd_params_init(&params);
     569        params.caption = "Hello";
     570
     571        rc = ui_window_create(ui, &params, &window);
     572        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     573        PCUT_ASSERT_NOT_NULL(window);
     574
     575        rc = ui_menu_bar_create(ui, window, &mbar);
     576        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     577        PCUT_ASSERT_NOT_NULL(mbar);
     578
     579        rc = ui_menu_create(mbar, "Test", &menu);
     580        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     581        PCUT_ASSERT_NOT_NULL(menu);
     582
     583        rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry1);
     584        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     585        PCUT_ASSERT_NOT_NULL(mentry1);
     586
     587        rc = ui_menu_entry_sep_create(menu, &mentry2);
     588        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     589        PCUT_ASSERT_NOT_NULL(mentry2);
     590
     591        rc = ui_menu_entry_create(menu, "Bar", "F2", &mentry3);
     592        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     593        PCUT_ASSERT_NOT_NULL(mentry3);
     594
     595        prect.p0.x = 0;
     596        prect.p0.y = 0;
     597        prect.p1.x = 0;
     598        prect.p1.y = 0;
     599
     600        /* Menu needs to be open to be able to move around it */
     601        rc = ui_menu_open(menu, &prect);
     602        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     603
     604        /* When menu is open, the first entry is selected */
     605        PCUT_ASSERT_EQUALS(mentry1, menu->selected);
     606
     607        ui_menu_up(menu);
     608
     609        /* Now we've wrapped around to the last entry */
     610        PCUT_ASSERT_EQUALS(mentry3, menu->selected);
     611
     612        ui_menu_up(menu);
     613
     614        /* mentry2 is a separator and was skipped */
     615        PCUT_ASSERT_EQUALS(mentry1, menu->selected);
     616
     617        ui_menu_bar_destroy(mbar);
     618        ui_window_destroy(window);
     619        ui_destroy(ui);
     620}
     621
     622/** ui_menu_down() with empty menu does nothing */
     623PCUT_TEST(down_empty)
     624{
     625        ui_t *ui = NULL;
     626        ui_window_t *window = NULL;
     627        ui_wnd_params_t params;
     628        ui_menu_bar_t *mbar = NULL;
     629        ui_menu_t *menu = NULL;
     630        gfx_rect_t prect;
     631        errno_t rc;
     632
     633        rc = ui_create_disp(NULL, &ui);
     634        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     635
     636        ui_wnd_params_init(&params);
     637        params.caption = "Hello";
     638
     639        rc = ui_window_create(ui, &params, &window);
     640        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     641        PCUT_ASSERT_NOT_NULL(window);
     642
     643        rc = ui_menu_bar_create(ui, window, &mbar);
     644        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     645        PCUT_ASSERT_NOT_NULL(mbar);
     646
     647        rc = ui_menu_create(mbar, "Test", &menu);
     648        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     649        PCUT_ASSERT_NOT_NULL(menu);
     650
     651        prect.p0.x = 0;
     652        prect.p0.y = 0;
     653        prect.p1.x = 0;
     654        prect.p1.y = 0;
     655
     656        /* Menu needs to be open to be able to move around it */
     657        rc = ui_menu_open(menu, &prect);
     658        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     659
     660        ui_menu_down(menu);
     661
     662        ui_menu_bar_destroy(mbar);
     663        ui_window_destroy(window);
     664        ui_destroy(ui);
     665}
     666
     667/** ui_menu_down() moves one entry down, skips separators, wraps around */
     668PCUT_TEST(down)
     669{
     670        ui_t *ui = NULL;
     671        ui_window_t *window = NULL;
     672        ui_wnd_params_t params;
     673        ui_menu_bar_t *mbar = NULL;
     674        ui_menu_t *menu = NULL;
     675        ui_menu_entry_t *mentry1 = NULL;
     676        ui_menu_entry_t *mentry2 = NULL;
     677        ui_menu_entry_t *mentry3 = NULL;
     678        gfx_rect_t prect;
     679        errno_t rc;
     680
     681        rc = ui_create_disp(NULL, &ui);
     682        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     683
     684        ui_wnd_params_init(&params);
     685        params.caption = "Hello";
     686
     687        rc = ui_window_create(ui, &params, &window);
     688        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     689        PCUT_ASSERT_NOT_NULL(window);
     690
     691        rc = ui_menu_bar_create(ui, window, &mbar);
     692        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     693        PCUT_ASSERT_NOT_NULL(mbar);
     694
     695        rc = ui_menu_create(mbar, "Test", &menu);
     696        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     697        PCUT_ASSERT_NOT_NULL(menu);
     698
     699        rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry1);
     700        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     701        PCUT_ASSERT_NOT_NULL(mentry1);
     702
     703        rc = ui_menu_entry_sep_create(menu, &mentry2);
     704        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     705        PCUT_ASSERT_NOT_NULL(mentry2);
     706
     707        rc = ui_menu_entry_create(menu, "Bar", "F2", &mentry3);
     708        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     709        PCUT_ASSERT_NOT_NULL(mentry3);
     710
     711        prect.p0.x = 0;
     712        prect.p0.y = 0;
     713        prect.p1.x = 0;
     714        prect.p1.y = 0;
     715
     716        /* Menu needs to be open to be able to move around it */
     717        rc = ui_menu_open(menu, &prect);
     718        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     719
     720        /* When menu is open, the first entry is selected */
     721        PCUT_ASSERT_EQUALS(mentry1, menu->selected);
     722
     723        ui_menu_down(menu);
     724
     725        /* mentry2 is a separator and was skipped */
     726        PCUT_ASSERT_EQUALS(mentry3, menu->selected);
     727
     728        ui_menu_up(menu);
     729
     730        /* Now we've wrapped around to the first entry */
     731        PCUT_ASSERT_EQUALS(mentry1, menu->selected);
    352732
    353733        ui_menu_bar_destroy(mbar);
Note: See TracChangeset for help on using the changeset viewer.