From 5ca38bfc34b42da3947264d6fc5e6c8bbbdfbec0 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Tue, 14 May 2019 15:50:32 -0400 Subject: [PATCH] efl_test_clickable: introduce new tests Summary: the new test checks if the events are correctly emitted Depends on D8821 Reviewers: zmike, segfaultxavi, cedric Reviewed By: zmike Subscribers: #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D8822 --- .../elementary/spec/efl_test_clickable.c | 233 ++++++++++++++++++ src/tests/elementary/spec/efl_ui_spec_suite.h | 1 + src/tests/elementary/spec/meson.build | 3 +- 3 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 src/tests/elementary/spec/efl_test_clickable.c diff --git a/src/tests/elementary/spec/efl_test_clickable.c b/src/tests/elementary/spec/efl_test_clickable.c new file mode 100644 index 0000000000..f241deb68b --- /dev/null +++ b/src/tests/elementary/spec/efl_test_clickable.c @@ -0,0 +1,233 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include +#include "efl_ui_spec_suite.h" +#include "suite_helpers.h" + +/* spec-meta-start + {"test-interface":"Efl.Ui.Clickable", + "test-widgets": ["Efl.Ui.Button"] + } + spec-meta-end + */ + +/* + * Here follows a fixture that ensures that the window is correctly rendered, and the mouse is moved into the middle of the window. + */ + +static void +emit_mouse_events(void *data) +{ + Eina_Position2D *pos = data; + Evas *e = evas_object_evas_get(win); + evas_event_feed_mouse_in(e, 0, NULL); + evas_event_feed_mouse_move(e, pos->x, pos->y, 0, NULL); + efl_task_end(efl_app_main_get()); + free(pos); +} + +static void +prepare_window_norendered(void *data, Evas *e, void *event_info EINA_UNUSED) +{ + ecore_job_add(emit_mouse_events, data); + evas_event_callback_del(e, EVAS_CALLBACK_RENDER_POST, prepare_window_norendered); +} + +static void +prepare_window(void) +{ + Eina_Position2D *pos = calloc(1, sizeof(Eina_Position2D)); + ck_assert_ptr_ne(win, NULL); + ck_assert_ptr_ne(widget, NULL); + efl_gfx_entity_geometry_set(win, EINA_RECT(0, 0, 60, 60)); + pos->x = 30; + pos->y = 30; + + evas_smart_objects_calculate(evas_object_evas_get(win)); + evas_event_callback_add(evas_object_evas_get(win), EVAS_CALLBACK_RENDER_POST, prepare_window_norendered, pos); + efl_loop_begin(efl_app_main_get()); +} + +/* + * General helpers for emitting and checking mouse events. + */ + +typedef struct { + Efl_Ui_Clickable_Clicked clicked_params; + unsigned int clicked; + Efl_Ui_Clickable_Clicked clicked_all_params; + unsigned int clicked_all; + unsigned int pressed; + unsigned int unpressed; + unsigned int long_pressed; + unsigned int repeated; +} Clickable_Event_Register; + +Clickable_Event_Register event_caller = { 0 }; + +static void +_event_register(void *data EINA_UNUSED, const Efl_Event *ev) +{ +#define EVENT_CHECK(e,f) if (ev->desc == EFL_UI_EVENT_ ##e ) event_caller.f ++ + EVENT_CHECK(CLICKED, clicked); + EVENT_CHECK(CLICKED_ANY, clicked_all); + EVENT_CHECK(PRESSED, pressed); + EVENT_CHECK(UNPRESSED, unpressed); + EVENT_CHECK(LONGPRESSED, long_pressed); + + if (ev->desc == EFL_UI_EVENT_CLICKED) + { + Efl_Ui_Clickable_Clicked *clicked = ev->info; + + event_caller.clicked_params.repeated = clicked->repeated; + event_caller.clicked_params.button = clicked->button; + } + if (ev->desc == EFL_UI_EVENT_CLICKED_ANY) + { + Efl_Ui_Clickable_Clicked *clicked = ev->info; + + event_caller.clicked_all_params.repeated = clicked->repeated; + event_caller.clicked_all_params.button = clicked->button; + } +} + +EFL_CALLBACKS_ARRAY_DEFINE(clickable, + {EFL_UI_EVENT_CLICKED, _event_register}, + {EFL_UI_EVENT_CLICKED_ANY, _event_register}, + {EFL_UI_EVENT_PRESSED, _event_register}, + {EFL_UI_EVENT_UNPRESSED, _event_register}, + {EFL_UI_EVENT_LONGPRESSED, _event_register}, +) + +static void +assert_event_empty(void) +{ + ck_assert_int_eq(event_caller.clicked, 0); + ck_assert_int_eq(event_caller.clicked_all, 0); + ck_assert_int_eq(event_caller.pressed, 0); + ck_assert_int_eq(event_caller.unpressed, 0); + ck_assert_int_eq(event_caller.long_pressed, 0); + ck_assert_int_eq(event_caller.repeated, 0); +} + +static void +_timer_expired(void *data EINA_UNUSED, const Efl_Event *ev) +{ + efl_del(ev->object); + efl_task_end(efl_app_main_get()); +} + +static void +iterate_mainloop(double interval) +{ + efl_add(EFL_LOOP_TIMER_CLASS, efl_app_main_get(), + efl_loop_timer_interval_set(efl_added, interval), + efl_event_callback_add(efl_added, EFL_LOOP_TIMER_EVENT_TIMER_TICK, _timer_expired, NULL)); + efl_loop_begin(efl_app_main_get()); +} + +static void +down(int btn) +{ + Evas *e = evas_object_evas_get(win); + evas_event_feed_mouse_down(e, btn, 0, 0, NULL); +} + +static void +up(int btn) +{ + Evas *e = evas_object_evas_get(win); + evas_event_feed_mouse_up(e, btn, 0, 0, NULL); +} + +EFL_START_TEST(simple_left_down_up) +{ + efl_event_callback_array_add(widget, clickable(), NULL); + down(1); + iterate_mainloop(0.1); + ck_assert_int_eq(event_caller.pressed, 1); + event_caller.pressed = 0; + assert_event_empty(); + + up(1); + iterate_mainloop(0.1); + ck_assert_int_eq(event_caller.clicked, 1); + event_caller.clicked = 0; + ck_assert_int_eq(event_caller.clicked_params.repeated, 0); + ck_assert_int_eq(event_caller.clicked_params.button, 1); + ck_assert_int_eq(event_caller.clicked_all, 1); + event_caller.clicked_all = 0; + ck_assert_int_eq(event_caller.clicked_all_params.repeated, 0); + ck_assert_int_eq(event_caller.clicked_all_params.button, 1); + ck_assert_int_eq(event_caller.unpressed, 1); + event_caller.unpressed = 0; + assert_event_empty(); +} +EFL_END_TEST + +EFL_START_TEST(long_press_event) +{ + efl_event_callback_array_add(widget, clickable(), NULL); + down(1); + iterate_mainloop(0.1); + ck_assert_int_eq(event_caller.pressed, 1); + event_caller.pressed = 0; + assert_event_empty(); + iterate_mainloop(2.0); + ck_assert_int_eq(event_caller.long_pressed, 1); + event_caller.long_pressed = 0; + assert_event_empty(); + up(1); + iterate_mainloop(0.1); + ck_assert_int_eq(event_caller.clicked, 1); + event_caller.clicked = 0; + ck_assert_int_eq(event_caller.clicked_params.repeated, 0); + ck_assert_int_eq(event_caller.clicked_params.button, 1); + ck_assert_int_eq(event_caller.clicked_all, 1); + event_caller.clicked_all = 0; + ck_assert_int_eq(event_caller.clicked_all_params.repeated, 0); + ck_assert_int_eq(event_caller.clicked_all_params.button, 1); + ck_assert_int_eq(event_caller.unpressed, 1); + event_caller.unpressed = 0; + assert_event_empty(); +} +EFL_END_TEST + +EFL_START_TEST(repeated_event) +{ + efl_event_callback_array_add(widget, clickable(), NULL); + + for (int i = 0; i < 20; ++i) + { + down(1); + iterate_mainloop(0.01); + ck_assert_int_eq(event_caller.pressed, 1); + event_caller.pressed = 0; + assert_event_empty(); + + up(1); + iterate_mainloop(0.01); + ck_assert_int_eq(event_caller.clicked, 1); + event_caller.clicked = 0; + ck_assert_int_eq(event_caller.clicked_params.repeated, i); + ck_assert_int_eq(event_caller.clicked_params.button, 1); + ck_assert_int_eq(event_caller.clicked_all, 1); + event_caller.clicked_all = 0; + ck_assert_int_eq(event_caller.clicked_all_params.repeated, i); + ck_assert_int_eq(event_caller.clicked_all_params.button, 1); + ck_assert_int_eq(event_caller.unpressed, 1); + event_caller.unpressed = 0; + } +} +EFL_END_TEST + +void +efl_ui_clickable_behavior_test(TCase *tc) +{ + tcase_add_checked_fixture(tc, prepare_window, NULL); + tcase_add_test(tc, simple_left_down_up); + tcase_add_test(tc, long_press_event); + tcase_add_test(tc, repeated_event); +} diff --git a/src/tests/elementary/spec/efl_ui_spec_suite.h b/src/tests/elementary/spec/efl_ui_spec_suite.h index 582aeda48c..8389d819ef 100644 --- a/src/tests/elementary/spec/efl_ui_spec_suite.h +++ b/src/tests/elementary/spec/efl_ui_spec_suite.h @@ -14,6 +14,7 @@ void efl_pack_behavior_test(TCase *tc); void efl_pack_linear_behavior_test(TCase *tc); void efl_content_behavior_test(TCase *tc); void efl_gfx_arrangement_behavior_test(TCase *tc); +void efl_ui_clickable_behavior_test(TCase *tc); void efl_test_container_content_equal(Efl_Ui_Widget **wid, unsigned int len); void efl_test_container_expect_evt_content_added(Efl_Ui_Widget *widget, const Efl_Event_Description *ev, Eina_Bool *flag, void *event_data); diff --git a/src/tests/elementary/spec/meson.build b/src/tests/elementary/spec/meson.build index 55c6e068d5..0f72b54fad 100644 --- a/src/tests/elementary/spec/meson.build +++ b/src/tests/elementary/spec/meson.build @@ -3,7 +3,8 @@ efl_ui_suite_behavior_test_files = files([ 'efl_test_pack.c', 'efl_test_pack_linear.c', 'efl_test_content.c', - 'efl_test_gfx_arrangement.c' + 'efl_test_gfx_arrangement.c', + 'efl_test_clickable.c', ]) efl_ui_suite_behavior_src = files([