focus_tests: fix the test suite

this brings back the working testsuite and fixes a bug in the
submanager.
This commit is contained in:
Marcel Hollerbach 2016-12-23 20:11:12 +01:00
parent 3dfc546a2f
commit 800390bcb0
6 changed files with 65 additions and 38 deletions

View File

@ -1346,7 +1346,7 @@ tests_elementary_elm_suite_SOURCES = \
tests/elementary/tests_elementary_elm_suite-elm_test_focus.$(OBJEXT): tests/elementary/focus_test.eo.c tests/elementary/focus_test.eo.h tests/elementary/tests_elementary_elm_suite-elm_test_focus.$(OBJEXT): tests/elementary/focus_test.eo.c tests/elementary/focus_test.eo.h
tests/elementary/tests_elementary_elm_suite-elm_test_focus_sub.$(OBJEXT): tests/elementary/focus_test_sub.eo.c tests/elementary/focus_test_sub.eo.h tests/elementary/tests_elementary_elm_suite-elm_test_focus_sub.$(OBJEXT): tests/elementary/focus_test_sub_main.eo.c tests/elementary/focus_test_sub_main.eo.h
tests_elementary_elm_suite_CPPFLAGS = \ tests_elementary_elm_suite_CPPFLAGS = \
-DTESTS_BUILD_DIR=\"${top_builddir}/src/tests/elementary\" \ -DTESTS_BUILD_DIR=\"${top_builddir}/src/tests/elementary\" \

View File

@ -175,33 +175,41 @@ _logical_manager_change(void *data EINA_UNUSED, const Efl_Event *ev)
} }
static void static void
_manager_change(void *data, const Efl_Event *ev) _flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
{ {
MY_DATA(data, pd);
Efl_Ui_Focus_Manager *manager; Efl_Ui_Focus_Manager *manager;
Efl_Ui_Focus_Object *logical; Efl_Ui_Focus_Object *logical, *real_object;
Efl_Ui_Focus_User *b; Efl_Ui_Focus_User *b;
Eina_List *n; Eina_List *n;
logical = efl_ui_focus_user_parent_get(ev->object); real_object = efl_parent_get(obj);
manager = efl_ui_focus_user_manager_get(ev->object);
logical = efl_ui_focus_user_parent_get(real_object);
manager = efl_ui_focus_user_manager_get(real_object);
//unregister from the old //unregister from the old
efl_event_callback_array_del(pd->manager, parent_manager(), data); efl_event_callback_array_del(pd->manager, parent_manager(), obj);
efl_event_callback_array_add(manager, parent_manager(), data); efl_event_callback_array_add(manager, parent_manager(), obj);
EINA_LIST_FOREACH(pd->current_border , n, b) EINA_LIST_FOREACH(pd->current_border , n, b)
{ {
if (b == ev->object) continue; if (b == real_object) continue;
_unregister(data, manager, b); _unregister(obj, manager, b);
_register(data, manager, b, logical); _register(obj, manager, b, logical);
} }
//unregister the old manager, use the new //unregister the old manager, use the new
pd->manager = manager; pd->manager = manager;
} }
static void
_manager_change(void *data, const Efl_Event *ev EINA_UNUSED)
{
MY_DATA(data, pd);
_flush_manager(data, pd);
}
EFL_CALLBACKS_ARRAY_DEFINE(self_manager, EFL_CALLBACKS_ARRAY_DEFINE(self_manager,
{EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, _self_manager_dirty}, {EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, _self_manager_dirty},
{EFL_UI_FOCUS_USER_EVENT_LOGICAL_CHANGED, _logical_manager_change}, {EFL_UI_FOCUS_USER_EVENT_LOGICAL_CHANGED, _logical_manager_change},
@ -223,6 +231,8 @@ _efl_ui_focus_manager_sub_efl_object_parent_set(Eo *obj, Efl_Ui_Focus_Manager_Su
new_parent = efl_parent_get(obj); new_parent = efl_parent_get(obj);
_efl_ui_focus_manager_redirect_events_add(obj, new_parent); _efl_ui_focus_manager_redirect_events_add(obj, new_parent);
efl_event_callback_array_add(new_parent, self_manager(), obj); efl_event_callback_array_add(new_parent, self_manager(), obj);
_flush_manager(obj, pd);
} }
EOLIAN static Efl_Object* EOLIAN static Efl_Object*

View File

@ -93,6 +93,7 @@ START_TEST(redirect)
elm_init(1, NULL); elm_init(1, NULL);
TEST_OBJ_NEW(root, 0, 0, 20, 20); TEST_OBJ_NEW(root, 0, 0, 20, 20);
TEST_OBJ_NEW(root2, 0, 0, 20, 20);
TEST_OBJ_NEW(one, 0, 0, 20, 20); TEST_OBJ_NEW(one, 0, 0, 20, 20);
TEST_OBJ_NEW(two, 20, 0, 20, 20); TEST_OBJ_NEW(two, 20, 0, 20, 20);
@ -101,10 +102,11 @@ START_TEST(redirect)
); );
Efl_Ui_Focus_Manager *m2 = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, Efl_Ui_Focus_Manager *m2 = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL,
efl_ui_focus_manager_root_set(efl_added, one) efl_ui_focus_manager_root_set(efl_added, root2)
); );
efl_ui_focus_manager_register(m2, two, one, NULL); efl_ui_focus_manager_register(m2, one, root2, NULL);
efl_ui_focus_manager_register(m2, two, root2, NULL);
efl_ui_focus_manager_redirect_set(m, m2); efl_ui_focus_manager_redirect_set(m, m2);
efl_ui_focus_manager_focus(m2, one); efl_ui_focus_manager_focus(m2, one);
@ -205,7 +207,7 @@ START_TEST(logical_chain)
Efl_Object *logical_chain[] = { Efl_Object *logical_chain[] = {
child1, subchild11, subchild12, subchild13, child1, subchild11, subchild12, subchild13,
child2, subchild21, subchild22, subchild23, root, NULL child2, subchild21, subchild22, subchild23, NULL
}; };
for (i = 0; logical_chain[i]; ++i) for (i = 0; logical_chain[i]; ++i)
{ {
@ -319,7 +321,6 @@ START_TEST(order_check)
order = eina_list_append(order, child1); order = eina_list_append(order, child1);
ck_assert_int_eq(efl_ui_focus_manager_update_children(m, root, order), 1); ck_assert_int_eq(efl_ui_focus_manager_update_children(m, root, order), 1);
eina_list_free(order);
order = NULL; order = NULL;
//negativ check //negativ check

View File

@ -1,23 +1,30 @@
#include "elm_test_focus_common.h" #include "elm_test_focus_common.h"
#include "focus_test_sub.eo.h" #include "focus_test_sub_main.eo.h"
typedef struct { typedef struct {
} Focus_Test_Sub_Data; } Focus_Test_Sub_Main_Data;
EOLIAN static void EOLIAN static void
_focus_test_sub_efl_ui_focus_object_geometry_get(Eo *obj EINA_UNUSED, Focus_Test_Sub_Data *pd EINA_UNUSED, Eina_Rectangle *rect EINA_UNUSED) _focus_test_sub_main_efl_ui_focus_object_geometry_get(Eo *obj EINA_UNUSED, Focus_Test_Sub_Main_Data *pd EINA_UNUSED, Eina_Rectangle *rect)
{ {
rect->y = rect->x = 0; EINA_RECTANGLE_SET(rect, 0, 0, 20, 20);
rect->w = rect->h = 20;
} }
EOLIAN static Eina_Bool EOLIAN static Efl_Ui_Focus_Manager*
_focus_test_sub_efl_ui_focus_object_focus_get(Eo *obj EINA_UNUSED, Focus_Test_Sub_Data *pd EINA_UNUSED) _focus_test_sub_main_efl_ui_focus_user_manager_get(Eo *obj, Focus_Test_Sub_Main_Data *pd EINA_UNUSED)
{ {
return EINA_FALSE; return efl_key_data_get(obj, "__user_manager");
} }
EOLIAN static Efl_Ui_Focus_Object*
_focus_test_sub_main_efl_ui_focus_user_parent_get(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 *registered;
static Eina_List *unregistered; static Eina_List *unregistered;
@ -54,7 +61,7 @@ _set_equal(Eina_List *a, Eina_List *b)
return EINA_TRUE; return EINA_TRUE;
} }
#include "focus_test_sub.eo.c" #include "focus_test_sub_main.eo.c"
static void static void
_setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Object **r) _setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Object **r)
@ -78,13 +85,19 @@ _setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Ob
efl_object_override(manager, &manager_tracker); efl_object_override(manager, &manager_tracker);
Efl_Ui_Focus_Manager_Sub *subm = efl_add(FOCUS_TEST_SUB_CLASS, manager, Focus_Test_Sub_Main *main = efl_add(FOCUS_TEST_SUB_MAIN_CLASS, NULL);
efl_key_data_set(main, "__user_manager", manager);
efl_key_data_set(main, "__user_parent", root_manager);
Efl_Ui_Focus_Manager_Sub *subm = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, main,
efl_ui_focus_manager_root_set(efl_added, root) efl_ui_focus_manager_root_set(efl_added, root)
); );
efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_PRE_FLUSH, NULL); efl_composite_attach(main, subm);
efl_ui_focus_manager_register_logical(manager, main, root_manager, subm);
*sub = subm; *sub = main;
*m = manager; *m = manager;
*r = root; *r = root;
} }
@ -102,7 +115,7 @@ START_TEST(correct_register)
TEST_OBJ_NEW(child2, 10, 0, 10, 10); TEST_OBJ_NEW(child2, 10, 0, 10, 10);
TEST_OBJ_NEW(child3, 0, 10, 10, 10); TEST_OBJ_NEW(child3, 0, 10, 10, 10);
set1 = eina_list_append(set1, sub); //set1 = eina_list_append(set1, sub);
//set1 = eina_list_append(set1, root); //set1 = eina_list_append(set1, root);
set1 = eina_list_append(set1, child1); set1 = eina_list_append(set1, child1);
set1 = eina_list_append(set1, child2); set1 = eina_list_append(set1, child2);
@ -117,12 +130,14 @@ START_TEST(correct_register)
ck_assert_ptr_eq(unregistered, NULL); ck_assert_ptr_eq(unregistered, NULL);
fail_if(!_set_equal(registered, set1)); fail_if(!_set_equal(registered, set1));
efl_del(sub); efl_ui_focus_manager_unregister(sub, child1);
efl_del(manager); efl_ui_focus_manager_unregister(sub, child2);
efl_del(root); efl_ui_focus_manager_unregister(sub, child3);
efl_del(child1); efl_del(child1);
efl_del(child2); efl_del(child2);
efl_del(child3); efl_del(child3);
efl_del(sub);
efl_del(manager);
elm_shutdown(); elm_shutdown();
} }
END_TEST END_TEST

View File

@ -1,6 +0,0 @@
class Focus.Test.Sub(Efl.Ui.Focus.Manager.Sub) {
implements {
Efl.Ui.Focus.Object.geometry_get;
Efl.Ui.Focus.Object.focus.get;
}
}

View File

@ -0,0 +1,7 @@
class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.User, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager) {
implements {
Efl.Ui.Focus.User.manager.get;
Efl.Ui.Focus.User.parent.get;
Efl.Ui.Focus.Object.geometry_get;
}
}