--- /dev/null
+#include "e_test_runner.h"
+
+struct _E_TC_Data
+{
+ E_TC_Win *tw_red;
+ E_TC_Win *tw_green;
+ E_TC_Win *tw_blue;
+ E_TC_Win *tw_register;
+};
+
+static Eina_Bool _tc_win_register(E_TC *tc, E_TC_Win *win);
+static void _tc_win_unregister(E_TC *tc);
+static Eina_Bool _tc_focus_pre_run(E_TC *tc, Eina_Bool show_win, Eina_Bool use_geom);
+static void _tc_focus_post_run(E_TC *tc);
+static void _tc_focus_shutdown(E_TC *tc);
+
+
+static Eina_Bool
+_tc_win_register(E_TC *tc, E_TC_Win *win)
+{
+ Eina_Bool res;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc, EINA_FALSE);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc->data, EINA_FALSE);
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
+
+ if (tc->data->tw_register)
+ {
+ e_test_runner_req_win_deregister(tc->runner, tc->data->tw_register);
+ tc->data->tw_register = NULL;
+ }
+
+ tc->data->tw_register = win;
+
+ res = e_test_runner_req_win_register(tc->runner, tc->data->tw_register);
+ EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+
+ return EINA_TRUE;
+}
+
+static void
+_tc_win_unregister(E_TC *tc)
+{
+ EINA_SAFETY_ON_NULL_RETURN(tc);
+ EINA_SAFETY_ON_NULL_RETURN(tc->data);
+ EINA_SAFETY_ON_NULL_RETURN(tc->data->tw_register);
+
+ e_test_runner_req_win_deregister(tc->runner, tc->data->tw_register);
+ tc->data->tw_register = NULL;
+}
+
+
+static Eina_Bool
+_tc_focus_pre_run(E_TC *tc, Eina_Bool show_win, Eina_Bool use_geom)
+{
+ tc->data = E_NEW(E_TC_Data, 1);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc->data, EINA_FALSE);
+
+ tc->data->tw_red = e_tc_win_add(NULL, ELM_WIN_BASIC,
+ EINA_FALSE, "red",
+ 0, 0, 400, 400, use_geom,
+ 200, E_TC_WIN_COLOR_RED);
+ EINA_SAFETY_ON_NULL_GOTO(tc->data->tw_red, cleanup);
+
+ if (show_win)
+ {
+ e_tc_win_geom_update(tc->data->tw_red);
+ e_tc_win_show(tc->data->tw_red);
+ }
+
+ tc->data->tw_green = e_tc_win_add(NULL, ELM_WIN_BASIC,
+ EINA_FALSE, "green",
+ 150, 150, 400, 400, use_geom,
+ 200, E_TC_WIN_COLOR_GREEN);
+ EINA_SAFETY_ON_NULL_GOTO(tc->data->tw_green, cleanup);
+
+ if (show_win)
+ {
+ e_tc_win_geom_update(tc->data->tw_green);
+ e_tc_win_show(tc->data->tw_green);
+ }
+
+ tc->data->tw_blue = e_tc_win_add(NULL, ELM_WIN_BASIC,
+ EINA_FALSE, "blue",
+ 20, 350, 400, 400, use_geom,
+ 200, E_TC_WIN_COLOR_BLUE);
+ EINA_SAFETY_ON_NULL_GOTO(tc->data->tw_blue, cleanup);
+
+ if (show_win)
+ {
+ _tc_win_register(tc, tc->data->tw_blue);
+
+ e_tc_win_geom_update(tc->data->tw_blue);
+ e_tc_win_show(tc->data->tw_blue);
+ }
+
+ e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_ON);
+ e_test_runner_work();
+
+ return EINA_TRUE;
+
+cleanup:
+ _tc_focus_shutdown(tc);
+ return EINA_FALSE;
+}
+
+static void
+_tc_focus_post_run(E_TC *tc)
+{
+ EINA_SAFETY_ON_NULL_RETURN(tc->data);
+
+ e_tc_win_hide(tc->data->tw_red);
+ e_tc_win_hide(tc->data->tw_green);
+ e_tc_win_hide(tc->data->tw_blue);
+}
+
+static void
+_tc_focus_shutdown(E_TC *tc)
+{
+ EINA_SAFETY_ON_NULL_RETURN(tc->data);
+
+ _tc_win_unregister(tc);
+ e_tc_win_del(tc->data->tw_red);
+ e_tc_win_del(tc->data->tw_green);
+ e_tc_win_del(tc->data->tw_blue);
+
+ E_FREE(tc->data);
+}
+
+Eina_Bool
+tc_0600_focus_basic(E_TC *tc)
+{
+ E_TC_Win *tw;
+ E_TC_Win *tw_red, *tw_green, *tw_blue;
+ Eina_Bool res = EINA_FALSE;
+ Eina_List *list = NULL, *l;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc, EINA_FALSE);
+
+ res = _tc_focus_pre_run(tc, EINA_TRUE, EINA_FALSE);
+ EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
+
+ tw_red = tc->data->tw_red;
+ tw_green = tc->data->tw_green;
+ tw_blue = tc->data->tw_blue;
+
+ // Expected focus result:
+ // [Top] Blue[focused] -> Green -> Red [Bottom]
+ list = e_test_runner_req_win_info_list_get(tc->runner);
+ EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
+
+ EINA_LIST_FOREACH(list, l, tw)
+ {
+ if (tw->native_win == tw_blue->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_TRUE), cleanup);
+ }
+ else if (tw->native_win == tw_green->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ else if (tw->native_win == tw_red->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ }
+
+ tc->passed = EINA_TRUE;
+
+cleanup:
+ _tc_focus_post_run(tc);
+ _tc_focus_shutdown(tc);
+ E_FREE_LIST(list, e_tc_win_del);
+
+ return tc->passed;
+}
+
+Eina_Bool
+tc_0601_focus_lower(E_TC *tc)
+{
+ E_TC_Win *tw;
+ E_TC_Win *tw_red, *tw_green, *tw_blue;
+ Eina_Bool res = EINA_FALSE;
+ Eina_List *list = NULL, *l;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc, EINA_FALSE);
+
+ res = _tc_focus_pre_run(tc, EINA_TRUE, EINA_FALSE);
+ EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
+
+ tw_red = tc->data->tw_red;
+ tw_green = tc->data->tw_green;
+ tw_blue = tc->data->tw_blue;
+
+ // make tw_blue stack lower
+ e_test_runner_req_win_stack_set(tc->runner, tw_blue, NULL, EINA_FALSE);
+ e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_LOWER);
+
+ // Expected focus result:
+ // [Top] Green[focused] -> Red -> ... -> Blue [Bottom]
+ list = e_test_runner_req_win_info_list_get(tc->runner);
+ EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
+
+ EINA_LIST_FOREACH(list, l, tw)
+ {
+ if (tw->native_win == tw_blue->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ else if (tw->native_win == tw_green->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_TRUE), cleanup);
+ }
+ else if (tw->native_win == tw_red->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ }
+
+ tc->passed = EINA_TRUE;
+
+cleanup:
+ _tc_focus_post_run(tc);
+ _tc_focus_shutdown(tc);
+ E_FREE_LIST(list, e_tc_win_del);
+
+ return tc->passed;
+}
+
+Eina_Bool
+tc_0602_focus_raise(E_TC *tc)
+{
+ E_TC_Win *tw;
+ E_TC_Win *tw_red, *tw_green, *tw_blue;
+ Eina_Bool res = EINA_FALSE;
+ Eina_List *list = NULL, *l;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc, EINA_FALSE);
+
+ res = _tc_focus_pre_run(tc, EINA_TRUE, EINA_FALSE);
+ EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
+
+ tw_red = tc->data->tw_red;
+ tw_green = tc->data->tw_green;
+ tw_blue = tc->data->tw_blue;
+
+ // make tw_red stack raise
+ e_test_runner_req_win_stack_set(tc->runner, tw_red, NULL, EINA_TRUE);
+ e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_ABOVE);
+
+ // Expected focus result:
+ // [Top] Red[focused] -> Blue -> Green [Bottom]
+ list = e_test_runner_req_win_info_list_get(tc->runner);
+ EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
+
+ EINA_LIST_FOREACH(list, l, tw)
+ {
+ if (tw->native_win == tw_blue->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ else if (tw->native_win == tw_green->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ else if (tw->native_win == tw_red->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_TRUE), cleanup);
+ }
+ }
+
+ tc->passed = EINA_TRUE;
+
+cleanup:
+ _tc_focus_post_run(tc);
+ _tc_focus_shutdown(tc);
+ E_FREE_LIST(list, e_tc_win_del);
+
+ return tc->passed;
+}
+
+Eina_Bool
+tc_0603_focus_destroy(E_TC *tc)
+{
+ E_TC_Win *tw;
+ E_TC_Win *tw_red, *tw_green;
+ Eina_Bool res = EINA_FALSE;
+ Eina_List *list = NULL, *l;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(tc, EINA_FALSE);
+
+ res = _tc_focus_pre_run(tc, EINA_TRUE, EINA_FALSE);
+ EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
+
+ tw_red = tc->data->tw_red;
+ tw_green = tc->data->tw_green;
+
+ // delete tw_blue
+ e_tc_win_hide(tc->data->tw_blue);
+ e_tc_win_del(tc->data->tw_blue);
+ tc->data->tw_blue = NULL; // for skipping delete of tw_blue in _tc_focus_shutdown
+
+ // wait for delete tw_blue
+ e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_OFF);
+
+ // Expected focus result:
+ // [Top] Green[focused] -> Red [Bottom]
+ list = e_test_runner_req_win_info_list_get(tc->runner);
+ EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
+
+ EINA_LIST_FOREACH(list, l, tw)
+ {
+ if (tw->native_win == tw_green->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_TRUE), cleanup);
+ }
+ else if (tw->native_win == tw_red->native_win)
+ {
+ EINA_SAFETY_ON_FALSE_GOTO((tw->focus.obj == EINA_FALSE), cleanup);
+ }
+ }
+
+ tc->passed = EINA_TRUE;
+
+cleanup:
+ _tc_focus_post_run(tc);
+ _tc_focus_shutdown(tc);
+ E_FREE_LIST(list, e_tc_win_del);
+
+ return tc->passed;
+}