forked from enlightenment/efl
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
This commit is contained in:
parent
bb1388798b
commit
5ca38bfc34
|
@ -0,0 +1,233 @@
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "elementary_config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <Efl_Ui.h>
|
||||||
|
#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);
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ void efl_pack_behavior_test(TCase *tc);
|
||||||
void efl_pack_linear_behavior_test(TCase *tc);
|
void efl_pack_linear_behavior_test(TCase *tc);
|
||||||
void efl_content_behavior_test(TCase *tc);
|
void efl_content_behavior_test(TCase *tc);
|
||||||
void efl_gfx_arrangement_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_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);
|
void efl_test_container_expect_evt_content_added(Efl_Ui_Widget *widget, const Efl_Event_Description *ev, Eina_Bool *flag, void *event_data);
|
||||||
|
|
|
@ -3,7 +3,8 @@ efl_ui_suite_behavior_test_files = files([
|
||||||
'efl_test_pack.c',
|
'efl_test_pack.c',
|
||||||
'efl_test_pack_linear.c',
|
'efl_test_pack_linear.c',
|
||||||
'efl_test_content.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([
|
efl_ui_suite_behavior_src = files([
|
||||||
|
|
Loading…
Reference in New Issue