efl/src/tests/elementary/efl_ui_test_focus_sub.c

239 lines
7.4 KiB
C

#include "efl_ui_test_focus_common.h"
#include "focus_test_sub_main.eo.h"
typedef struct {
} Focus_Test_Sub_Main_Data;
EOLIAN static Eina_Rect
_focus_test_sub_main_efl_gfx_entity_geometry_get(const Eo *obj EINA_UNUSED, Focus_Test_Sub_Main_Data *pd EINA_UNUSED)
{
return EINA_RECT(-10, -10, 40, 40);
}
EOLIAN static Eina_Rect
_focus_test_sub_main_efl_ui_focus_object_focus_geometry_get(const Eo *obj EINA_UNUSED, Focus_Test_Sub_Main_Data *pd EINA_UNUSED)
{
return EINA_RECT(0, 0, 20, 20);
}
EOLIAN static Efl_Ui_Focus_Manager*
_focus_test_sub_main_efl_ui_focus_object_focus_manager_get(const Eo *obj, Focus_Test_Sub_Main_Data *pd EINA_UNUSED)
{
return efl_key_data_get(obj, "__user_manager");
}
EOLIAN static Efl_Ui_Focus_Object*
_focus_test_sub_main_efl_ui_focus_object_focus_parent_get(const Eo *obj, Focus_Test_Sub_Main_Data *pd EINA_UNUSED)
{
return efl_key_data_get(obj, "__user_parent");
}
static Eina_List *registered;
static Eina_List *unregistered;
static Eina_Bool
_register(Eo *eo, void* data EINA_UNUSED, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *manager)
{
registered = eina_list_append(registered, child);
printf("REGISTERED %p %s\n", child, efl_name_get(child));
return efl_ui_focus_manager_calc_register(efl_super(eo, EFL_OBJECT_OVERRIDE_CLASS) , child, parent, manager);
}
static void
_unregister(Eo *eo, void* data EINA_UNUSED, Efl_Ui_Focus_Object *child)
{
unregistered = eina_list_append(unregistered, child);
efl_ui_focus_manager_calc_unregister(efl_super(eo, EFL_OBJECT_OVERRIDE_CLASS) , child);
}
static Eina_Bool
_set_equal(Eina_List *a, Eina_List *b)
{
Eina_List *n;
void *d;
ck_assert_int_eq(eina_list_count(a), eina_list_count(b));
EINA_LIST_FOREACH(a, n, d)
{
ck_assert_ptr_ne(eina_list_data_find(b, d), NULL);
}
return EINA_TRUE;
}
#include "focus_test_sub_main.eo.c"
static void
_setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Object **r)
{
TEST_OBJ_NEW(root, 10, 10, 10, 10);
TEST_OBJ_NEW(root_manager, 0, 20, 20, 20);
EFL_OPS_DEFINE(manager_tracker,
EFL_OBJECT_OP_FUNC(efl_ui_focus_manager_calc_register, _register),
EFL_OBJECT_OP_FUNC(efl_ui_focus_manager_calc_unregister, _unregister),
);
Efl_Ui_Focus_Manager *manager = efl_add_ref(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL,
efl_ui_focus_manager_root_set(efl_added, root_manager)
);
//flush now all changes
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, NULL);
registered = NULL;
unregistered = NULL;
efl_object_override(manager, &manager_tracker);
Focus_Test_Sub_Main *focus_main = efl_add_ref(FOCUS_TEST_SUB_MAIN_CLASS, NULL);
efl_key_data_set(focus_main, "__user_manager", manager);
efl_key_data_set(focus_main, "__user_parent", root_manager);
Efl_Ui_Focus_Manager_Calc *subm = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, focus_main,
efl_ui_focus_manager_root_set(efl_added, root)
);
efl_event_callback_forwarder_add(subm, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, focus_main);
efl_event_callback_forwarder_add(subm, EFL_UI_FOCUS_MANAGER_EVENT_REDIRECT_CHANGED, focus_main);
efl_event_callback_forwarder_add(subm, EFL_UI_FOCUS_MANAGER_EVENT_MANAGER_FOCUS_CHANGED , focus_main);
efl_event_callback_forwarder_add(subm, EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, focus_main);
efl_event_callback_forwarder_add(subm, EFL_UI_FOCUS_MANAGER_EVENT_DIRTY_LOGIC_FREEZE_CHANGED, focus_main);
efl_composite_attach(focus_main, subm);
efl_event_callback_call(focus_main, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_MANAGER_CHANGED, NULL);
efl_ui_focus_manager_calc_register_logical(manager, focus_main, root_manager, subm);
*sub = focus_main;
*m = manager;
*r = root;
}
EFL_START_TEST(correct_register)
{
Eina_List *set1 = NULL;
Efl_Ui_Focus_Object *root;
Efl_Ui_Focus_Manager *manager, *sub;
_setup(&manager, &sub, &root);
TEST_OBJ_NEW(child1, 0, 0, 10, 10);
TEST_OBJ_NEW(child2, 10, 0, 10, 10);
TEST_OBJ_NEW(child3, 0, 10, 10, 10);
//set1 = eina_list_append(set1, sub);
//set1 = eina_list_append(set1, root);
set1 = eina_list_append(set1, child1);
set1 = eina_list_append(set1, child2);
set1 = eina_list_append(set1, child3);
//test register stuff
efl_ui_focus_manager_calc_register(sub, child1, root, NULL);
efl_ui_focus_manager_calc_register(sub, child2, root, NULL);
efl_ui_focus_manager_calc_register(sub, child3, root, NULL);
//now force submanager to flush things
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, NULL);
ck_assert_ptr_eq(unregistered, NULL);
fail_if(!_set_equal(registered, set1));
efl_ui_focus_manager_calc_unregister(sub, child1);
efl_ui_focus_manager_calc_unregister(sub, child2);
efl_ui_focus_manager_calc_unregister(sub, child3);
efl_unref(child1);
efl_unref(child2);
efl_unref(child3);
efl_unref(sub);
efl_unref(manager);
}
EFL_END_TEST
EFL_START_TEST(correct_unregister)
{
Eina_List *set = NULL;
Efl_Ui_Focus_Object *root;
Efl_Ui_Focus_Manager *manager, *sub;
_setup(&manager, &sub, &root);
TEST_OBJ_NEW(child1, 0, 0, 10, 10);
TEST_OBJ_NEW(child2, 10, 0, 10, 10);
TEST_OBJ_NEW(child3, 0, 10, 10, 10);
set = eina_list_append(set, child3);
//test register stuff
efl_ui_focus_manager_calc_register(sub, child1, root, NULL);
efl_ui_focus_manager_calc_register(sub, child2, root, NULL);
efl_ui_focus_manager_calc_register(sub, child3, root, NULL);
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, NULL);
eina_list_free(unregistered);
unregistered = NULL;
eina_list_free(registered);
registered = NULL;
//test unregister stuff
efl_ui_focus_manager_calc_unregister(sub, child3);
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, NULL);
ck_assert_ptr_eq(registered, NULL);
fail_if(!_set_equal(unregistered, set));
eina_list_free(unregistered);
unregistered = NULL;
efl_unref(sub);
efl_unref(manager);
efl_unref(root);
efl_unref(child1);
efl_unref(child2);
efl_unref(child3);
}
EFL_END_TEST
EFL_START_TEST(correct_un_register)
{
Eina_List *set_add = NULL, *set_del = NULL;
Efl_Ui_Focus_Object *root;
Efl_Ui_Focus_Manager *manager, *sub;
_setup(&manager, &sub, &root);
TEST_OBJ_NEW(child1, 0, 0, 10, 10);
TEST_OBJ_NEW(child2, 10, 0, 10, 10);
TEST_OBJ_NEW(child3, 0, 10, 10, 10);
set_add = eina_list_append(set_add, child2);
set_del = eina_list_append(set_del, child3);
//test register stuff
efl_ui_focus_manager_calc_register(sub, child1, root, NULL);
efl_ui_focus_manager_calc_register(sub, child3, root, NULL);
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, NULL);
eina_list_free(unregistered);
unregistered = NULL;
eina_list_free(registered);
registered = NULL;
//test unregister stuff
efl_ui_focus_manager_calc_unregister(sub, child3);
efl_ui_focus_manager_calc_register(sub, child2, root, NULL);
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_FLUSH_PRE, NULL);
fail_if(!_set_equal(registered, set_add));
fail_if(!_set_equal(unregistered, set_del));
efl_unref(sub);
efl_unref(manager);
efl_unref(root);
efl_unref(child1);
efl_unref(child2);
efl_unref(child3);
}
EFL_END_TEST
void efl_ui_test_focus_sub(TCase *tc)
{
tcase_add_test(tc, correct_register);
tcase_add_test(tc, correct_unregister);
tcase_add_test(tc, correct_un_register);
}