Rename program to e_test_runner 69/37469/1
authorGwanglim Lee <gl77.lee@samsung.com>
Fri, 27 Mar 2015 07:08:22 +0000 (16:08 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Fri, 27 Mar 2015 08:04:14 +0000 (17:04 +0900)
Change-Id: I376f7818bce8ace14e0ecfd068e21c1b83d92cb0

configure.ac
packaging/e-tizen-testcase.spec
src/0000_easy.c
src/0100_base_operation.c
src/0200_transient_for.c
src/0300_notification.c
src/Makefile.am
src/e_tc_main.c [deleted file]
src/e_tc_main.h [deleted file]
src/e_test_runner.c [new file with mode: 0644]
src/e_test_runner.h [new file with mode: 0644]

index 859f7ee215c93dc2acbc3e0096b009bf2c3e53fa..74928e24b3ee383eee7d7b8b57795dbdbda995d2 100644 (file)
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
 # get rid of that stupid cache mechanism
 rm -f config.cache
 
-AC_INIT([e_test_case], [0.1.0], [enlightenment-devel@lists.sourceforge.net])
+AC_INIT([e_test_runner], [0.1.0], [enlightenment-devel@lists.sourceforge.net])
 AC_PREREQ([2.52])
 AC_CONFIG_SRCDIR([configure.ac])
 
@@ -12,7 +12,7 @@ AM_CONFIG_HEADER([config.h])
 
 AM_INIT_AUTOMAKE([1.11])
 
-GETTEXT_PACKAGE="e_test_case"
+GETTEXT_PACKAGE="e_test_runner"
 AC_SUBST([GETTEXT_PACKAGE])
 AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], "$GETTEXT_PACKAGE", [Gettext package])
 
@@ -27,7 +27,7 @@ requirements="\
    capi-ui-efl-util \
    "
 
-PKG_CHECK_MODULES(E_TEST_CASE, [${requirements}])
+PKG_CHECK_MODULES(E_TEST_RUNNER, [${requirements}])
 
 AC_CONFIG_FILES([
 Makefile
index f77ad5b14f3523e31d389c44704f7e415e49da8d..5f7691315f133ca27a71b5a23cd691af67e578c1 100644 (file)
@@ -3,7 +3,7 @@
 Name: e-tizen-testcase
 Version: 0.0.1
 Release: 1
-Summary: The test case module for enlightenment
+Summary: The test case runner for enlightenment
 URL: http://www.enlightenment.org
 Group: Graphics & UI Framework/Other
 Source0: %{name}-%{version}.tar.gz
@@ -18,7 +18,7 @@ ExclusiveArch:
 %endif
 
 %description
-This package is a test case module for enlightenment.
+This package is a test case runner for enlightenment.
 
 %prep
 %setup -q
@@ -46,4 +46,4 @@ make install DESTDIR=%{buildroot}
 %files
 %defattr(-,root,root,-)
 /usr/share/license/%{name}
-%{_bindir}/e_test_case
+%{_bindir}/e_test_runner
index 8192bd32de9197fbafb63ed8133c9e4c2a028886..1885017be0a5d90afff98cbb46bc17a501ee0c51 100644 (file)
@@ -1,4 +1,4 @@
-#include "e_tc_main.h"
+#include "e_test_runner.h"
 
 static void
 _cb_introspect(void *data,
@@ -15,14 +15,15 @@ _cb_introspect(void *data,
    res = eldbus_message_arguments_get(msg, "s", &arg);
    EINA_SAFETY_ON_FALSE_GOTO(res, finish);
 
-   if ((!strstr(arg, "method name=\"RegisterWindow\""  )) ||
-       (!strstr(arg, "method name=\"DeregisterWindow\"")) ||
-       (!strstr(arg, "method name=\"GetClients\""      )) ||
-       (!strstr(arg, "method name=\"ChangeStack\""     )) ||
-       (!strstr(arg, "signal name=\"ChangeVisibility\"")) ||
-       (!strstr(arg, "signal name=\"Restack\""         )) ||
-       (!strstr(arg, "property name=\"Registrant\""    )))
+   if ((!strstr(arg, "method name=\"RegisterWindow\""   )) ||
+       (!strstr(arg, "method name=\"DeregisterWindow\"" )) ||
+       (!strstr(arg, "method name=\"SetWindowStack\""   )) ||
+       (!strstr(arg, "method name=\"GetWindowInfo\""    )) ||
+       (!strstr(arg, "signal name=\"VisibilityChanged\"")) ||
+       (!strstr(arg, "signal name=\"StackChanged\""     )) ||
+       (!strstr(arg, "property name=\"Registrant\""     )))
      {
+        ERR("missing mehod, signal or property:%s\n", arg);
         goto finish;
      }
 
@@ -125,7 +126,7 @@ tc_0011_win_register(E_TC *tc)
    EINA_SAFETY_ON_NULL_GOTO(tw, finish);
 
    /* check RegisterWindow method */
-   res = e_tc_runner_req_win_register(tc->runner, tw);
+   res = e_test_runner_req_win_register(tc->runner, tw);
    EINA_SAFETY_ON_FALSE_GOTO(res, finish);
 
    /* check whether registered window id is same */
@@ -139,7 +140,7 @@ tc_0011_win_register(E_TC *tc)
    EINA_SAFETY_ON_FALSE_RETURN_VAL(tc->passed, EINA_FALSE);
 
    /* check DeregisterWindow method */
-   res = e_tc_runner_req_win_deregister(tc->runner, tw);
+   res = e_test_runner_req_win_deregister(tc->runner, tw);
    EINA_SAFETY_ON_FALSE_GOTO(res, finish);
 
    tc->passed = EINA_TRUE;
index 937fdad4dfe763455a6da8f56520fe649b2fadbb..41240972982d823c38ff369dc72373316bbbdcae 100644 (file)
@@ -1,4 +1,4 @@
-#include "e_tc_main.h"
+#include "e_test_runner.h"
 
 struct _E_TC_Data
 {
@@ -23,13 +23,13 @@ _tc_pre_run(E_TC *tc, Eina_Bool alpha)
                                200);
    EINA_SAFETY_ON_NULL_GOTO(tc->data->tw, cleanup);
 
-   res = e_tc_runner_req_win_register(tc->runner, tc->data->tw);
+   res = e_test_runner_req_win_register(tc->runner, tc->data->tw);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
    e_tc_win_geom_update(tc->data->tw);
    e_tc_win_show(tc->data->tw);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_ON);
+   res = e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_ON);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
    return EINA_TRUE;
@@ -46,9 +46,6 @@ _tc_post_run(E_TC *tc)
 
    e_tc_win_hide(tc->data->tw);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_OFF);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
-
    return EINA_TRUE;
 }
 
@@ -57,7 +54,7 @@ _tc_shutdown(E_TC *tc)
 {
    EINA_SAFETY_ON_NULL_RETURN(tc->data);
 
-   e_tc_runner_req_win_deregister(tc->runner, tc->data->tw);
+   e_test_runner_req_win_deregister(tc->runner, tc->data->tw);
    e_tc_win_del(tc->data->tw);
 
    E_FREE(tc->data);
@@ -98,7 +95,7 @@ tc_0101_win_stack(E_TC *tc)
 
    tw = tc->data->tw;
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    EINA_LIST_FOREACH(list, l, tw2)
@@ -161,7 +158,7 @@ tc_0111_alpha_win_stack(E_TC *tc)
 
    tw = tc->data->tw;
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    EINA_LIST_FOREACH(list, l, tw2)
index d43387692ad0e62fa77118f4af2afbf691eb13ce..373268477a38b25c1b7d8a5a2b845b216b69920b 100644 (file)
@@ -1,4 +1,4 @@
-#include "e_tc_main.h"
+#include "e_test_runner.h"
 
 struct _E_TC_Data
 {
@@ -37,7 +37,7 @@ _tc_pre_run(E_TC *tc)
                                200);
    EINA_SAFETY_ON_NULL_GOTO(tc->data->tw, cleanup);
 
-   res = e_tc_runner_req_win_register(tc->runner, tc->data->tw);
+   res = e_test_runner_req_win_register(tc->runner, tc->data->tw);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
    e_tc_win_geom_update(tc->data->tw_parent);
@@ -49,7 +49,7 @@ _tc_pre_run(E_TC *tc)
    e_tc_win_geom_update(tc->data->tw_child);
    e_tc_win_show(tc->data->tw_child);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_ON);
+   res = e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_ON);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
    return EINA_TRUE;
@@ -68,9 +68,6 @@ _tc_post_run(E_TC *tc)
    e_tc_win_hide(tc->data->tw);
    e_tc_win_hide(tc->data->tw_parent);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_VIS_OFF);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
-
    return EINA_TRUE;
 }
 
@@ -79,7 +76,7 @@ _tc_shutdown(E_TC *tc)
 {
    EINA_SAFETY_ON_NULL_RETURN(tc->data);
 
-   e_tc_runner_req_win_deregister(tc->runner, tc->data->tw);
+   e_test_runner_req_win_deregister(tc->runner, tc->data->tw);
    e_tc_win_del(tc->data->tw_parent);
    e_tc_win_del(tc->data->tw);
    e_tc_win_del(tc->data->tw_child);
@@ -100,7 +97,7 @@ tc_0200_transient_for_basic(E_TC *tc)
    res = _tc_pre_run(tc);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    tw = tc->data->tw;
@@ -153,10 +150,10 @@ tc_0201_transient_for_raise(E_TC *tc)
 
    e_tc_win_stack_change(tw, NULL, EINA_TRUE);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_RAISE);
+   res = e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_RAISE);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    tw2 = eina_list_nth(list, 0);
@@ -191,10 +188,10 @@ tc_0202_transient_for_lower(E_TC *tc)
 
    e_tc_win_stack_change(tw, NULL, EINA_FALSE);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_LOWER);
+   res = e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_LOWER);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    tw2 = eina_list_last_data_get(list);
@@ -232,10 +229,10 @@ tc_0203_transient_for_stack_above(E_TC *tc)
 
    e_tc_win_stack_change(tw_parent, tw, EINA_TRUE);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_ABOVE);
+   res = e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_ABOVE);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    EINA_LIST_FOREACH(list, l, tw2)
@@ -285,10 +282,10 @@ tc_0204_transient_for_stack_below(E_TC *tc)
 
    e_tc_win_stack_change(tw_parent, tw, EINA_FALSE);
 
-   res = e_tc_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_BELOW);
+   res = e_test_runner_ev_wait(tc->runner, E_TC_EVENT_TYPE_STACK_BELOW);
    EINA_SAFETY_ON_FALSE_GOTO(res, cleanup);
 
-   list = e_tc_runner_req_win_info_list_get(tc->runner);
+   list = e_test_runner_req_win_info_list_get(tc->runner);
    EINA_SAFETY_ON_NULL_GOTO(list, cleanup);
 
    EINA_LIST_FOREACH(list, l, tw2)
index 1ec68bb25b1ea110b3d16562363075addb909da6..5dc42d3e826376f2d2c352149b56914250ca0123 100644 (file)
@@ -1,5 +1,5 @@
 #include <efl_util.h>
-#include "e_tc_main.h"
+#include "e_test_runner.h"
 
 #if 0
 #define TC_NWIN_W   400
index 37f17c3f7a1387978e1117a9421766f62bc3c221..6fba867ff43dbdab84d4ce2099f8ad217f1f183c 100644 (file)
@@ -1,15 +1,15 @@
-bin_PROGRAMS = e_test_case
+bin_PROGRAMS = e_test_runner
 
-e_test_case_CPPFLAGS = \
+e_test_runner_CPPFLAGS = \
 -I. \
-@E_TEST_CASE_CFLAGS@
+@E_TEST_RUNNER_CFLAGS@
 
-e_test_case_LDADD = \
-@E_TEST_CASE_LIBS@
+e_test_runner_LDADD = \
+@E_TEST_RUNNER_LIBS@
 
-e_test_case_SOURCES = \
-e_tc_main.c \
-e_tc_main.h \
+e_test_runner_SOURCES = \
+e_test_runner.c \
+e_test_runner.h \
 0000_easy.c \
 0100_base_operation.c \
 0200_transient_for.c \
diff --git a/src/e_tc_main.c b/src/e_tc_main.c
deleted file mode 100644 (file)
index 41ddfd2..0000000
+++ /dev/null
@@ -1,635 +0,0 @@
-#include "e_tc_main.h"
-
-int _log_dom = -1;
-
-static void
-_cb_method_win_info_list_get(void *data,
-                             const Eldbus_Message *msg,
-                             Eldbus_Pending *p EINA_UNUSED)
-{
-   const char *name = NULL, *text = NULL;
-   Eldbus_Message_Iter *array, *ec;
-   Ecore_Window target_win = 0;
-   Eina_List *list = data;
-   Eina_Bool res;
-
-   res = eldbus_message_error_get(msg, &name, &text);
-   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
-
-   res = eldbus_message_arguments_get(msg, "ua(usiiiiibb)", &target_win, &array);
-   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
-
-   list = eina_list_free(list);
-
-   while (eldbus_message_iter_get_and_next(array, 'r', &ec))
-     {
-        const char *win_name;
-        int x, y, w, h, layer;
-        Eina_Bool visible, alpha;
-        Ecore_Window native_win;
-        E_TC_Win *tw = NULL;
-
-        res = eldbus_message_iter_arguments_get(ec,
-                                                "usiiiiibb",
-                                                &native_win,
-                                                &win_name,
-                                                &x,
-                                                &y,
-                                                &w,
-                                                &h,
-                                                &layer,
-                                                &visible,
-                                                &alpha);
-        if (!res)
-          {
-             WRN("Failed to get win info\n");
-             continue;
-          }
-
-        tw = e_tc_win_info_add(native_win, alpha, win_name, x, y, w, h, layer);
-        list = eina_list_append(list, tw);
-     }
-
-finish:
-   if ((name) || (text))
-     {
-        ERR("errname:%s errmsg:%s\n", name, text);
-     }
-
-   elm_exit();
-}
-
-static void
-_cb_method_window_register(void *data,
-                           const Eldbus_Message *msg,
-                           Eldbus_Pending *p EINA_UNUSED)
-{
-   const char *name = NULL, *text = NULL;
-   Eina_Bool res;
-   Eina_Bool *accepted = data;
-
-   *accepted = EINA_FALSE;
-
-   res = eldbus_message_error_get(msg, &name, &text);
-   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
-
-   res = eldbus_message_arguments_get(msg, "b", accepted);
-   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
-   EINA_SAFETY_ON_FALSE_GOTO(*accepted, finish);
-
-finish:
-   if ((name) || (text))
-     {
-        ERR("errname:%s errmsg:%s\n", name, text);
-     }
-
-   elm_exit();
-}
-
-static void
-_cb_method_window_deregister(void *data,
-                             const Eldbus_Message *msg,
-                             Eldbus_Pending *p EINA_UNUSED)
-{
-   const char *name = NULL, *text = NULL;
-   Eina_Bool res;
-   Eina_Bool *allowed = data;
-
-   *allowed = EINA_FALSE;
-
-   res = eldbus_message_error_get(msg, &name, &text);
-   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
-
-   res = eldbus_message_arguments_get(msg, "b", allowed);
-   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
-   EINA_SAFETY_ON_FALSE_GOTO(*allowed, finish);
-
-finish:
-   if ((name) || (text))
-     {
-        ERR("errname:%s errmsg:%s\n", name, text);
-     }
-
-   elm_exit();
-}
-
-static void
-_cb_signal_vis_changed(void *data,
-                       const Eldbus_Message *msg)
-{
-   E_TC_Runner *runner = data;
-   const char *name = NULL, *text = NULL;
-   Eina_Bool res;
-   int vis = 0;
-   Ecore_Window id;
-
-   res = eldbus_message_error_get(msg, &name, &text);
-   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
-
-   res = eldbus_message_arguments_get(msg, "ub", &id, &vis);
-   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
-
-   /* TODO */
-   if (((E_TC_EVENT_TYPE_VIS_ON  == runner->ev.expect) && ( vis)) ||
-       ((E_TC_EVENT_TYPE_VIS_OFF == runner->ev.expect) && (!vis)))
-     {
-        runner->ev.response = runner->ev.expect;
-        elm_exit();
-     }
-
-finish:
-   if ((name) || (text))
-     {
-        ERR("errname:%s errmsg:%s\n", name, text);
-     }
-}
-
-static void
-_cb_signal_stack_changed(void *data,
-                         const Eldbus_Message *msg)
-{
-   E_TC_Runner *runner = data;
-   const char *name = NULL, *text = NULL;
-   Eina_Bool res;
-
-   res = eldbus_message_error_get(msg, &name, &text);
-   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
-
-   /* TODO */
-   if ((E_TC_EVENT_TYPE_STACK_RAISE <= runner->ev.expect) &&
-       (E_TC_EVENT_TYPE_STACK_BELOW >= runner->ev.expect))
-     {
-        runner->ev.response = runner->ev.expect;
-        elm_exit();
-     }
-
-finish:
-   if ((name) || (text))
-     {
-        ERR("errname:%s errmsg:%s\n", name, text);
-     }
-}
-
-static Eina_Bool
-_ev_wait_timeout(void *data)
-{
-   E_TC_Runner *runner = data;
-
-   runner->ev.expire_timer = NULL;
-   runner->ev.response = E_TC_EVENT_TYPE_TIMEOUT;
-
-   ERR("ev:%d\n", runner->ev.expect);
-
-   elm_exit();
-
-   return ECORE_CALLBACK_DONE;
-}
-
-Eina_Bool
-e_tc_runner_req_win_register(E_TC_Runner *runner,
-                             E_TC_Win *tw)
-{
-   Eldbus_Pending *p;
-   Eina_Bool accepted = EINA_FALSE;
-
-   p = eldbus_proxy_call(runner->dbus.proxy,
-                         "RegisterWindow",
-                         _cb_method_window_register,
-                         &accepted,
-                         -1,
-                         "u",
-                         tw->native_win);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
-
-   elm_run();
-
-   return accepted;
-}
-
-Eina_Bool
-e_tc_runner_req_win_deregister(E_TC_Runner *runner,
-                               E_TC_Win *tw)
-{
-   Eldbus_Pending *p;
-   Eina_Bool allowed = EINA_FALSE;
-
-   p = eldbus_proxy_call(runner->dbus.proxy,
-                         "DeregisterWindow",
-                         _cb_method_window_deregister,
-                         &allowed,
-                         -1,
-                         "u",
-                         tw->native_win);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
-
-   elm_run();
-
-   return allowed;
-}
-
-Eina_List *
-e_tc_runner_req_win_info_list_get(E_TC_Runner *runner)
-{
-   Eldbus_Pending *p;
-   Eina_List *list = NULL;
-
-   p = eldbus_proxy_call(runner->dbus.proxy,
-                         "GetClients",
-                         _cb_method_win_info_list_get,
-                         list,
-                         -1,
-                         "");
-   EINA_SAFETY_ON_NULL_RETURN_VAL(p, NULL);
-
-   elm_run();
-
-   return list;
-}
-
-Eina_Bool
-e_tc_runner_ev_wait(E_TC_Runner *runner,
-                    E_TC_Event_Type ev)
-{
-   Eldbus_Signal_Handler *sh;
-   Eina_Bool res = EINA_FALSE;
-
-   EINA_SAFETY_ON_FALSE_RETURN_VAL((E_TC_EVENT_TYPE_NONE < ev), res);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL((E_TC_EVENT_TYPE_MAX > ev), res);
-
-   switch (ev)
-     {
-      case E_TC_EVENT_TYPE_VIS_ON:
-      case E_TC_EVENT_TYPE_VIS_OFF:
-         sh = eldbus_proxy_signal_handler_add(runner->dbus.proxy,
-                                              "ChangeVisibility",
-                                              _cb_signal_vis_changed,
-                                              runner);
-         EINA_SAFETY_ON_NULL_GOTO(sh, finish);
-         break;
-
-      case E_TC_EVENT_TYPE_STACK_RAISE:
-      case E_TC_EVENT_TYPE_STACK_LOWER:
-      case E_TC_EVENT_TYPE_STACK_ABOVE:
-      case E_TC_EVENT_TYPE_STACK_BELOW:
-         sh = eldbus_proxy_signal_handler_add(runner->dbus.proxy,
-                                              "ChangeStack",
-                                              _cb_signal_stack_changed,
-                                              runner);
-         EINA_SAFETY_ON_NULL_GOTO(sh, finish);
-         break;
-
-      default:
-         goto finish;
-         break;
-     }
-
-   if (runner->ev.expire_timer)
-     ecore_timer_del(runner->ev.expire_timer);
-
-   runner->ev.expect = ev;
-   runner->ev.response = E_TC_EVENT_TYPE_NONE;
-   runner->ev.expire_timer = ecore_timer_add(2.0, _ev_wait_timeout, runner);
-
-   elm_run();
-
-   if (runner->ev.expire_timer)
-     {
-        ecore_timer_del(runner->ev.expire_timer);
-        runner->ev.expire_timer = NULL;
-     }
-
-   eldbus_signal_handler_del(sh);
-
-   res = (runner->ev.response == runner->ev.expect);
-   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
-
-finish:
-   runner->ev.expect = E_TC_EVENT_TYPE_NONE;
-   runner->ev.response = E_TC_EVENT_TYPE_NONE;
-
-   return res;
-}
-
-E_TC_Win *
-e_tc_win_add(E_TC_Win *parent,
-             Elm_Win_Type type,
-             Eina_Bool alpha,
-             const char *name,
-             int x, int y,
-             int w, int h,
-             int layer)
-{
-   E_TC_Win *tw = NULL;
-   Evas_Object *elm_win = NULL, *bg = NULL;
-   Evas_Object *p_elm_win = NULL;
-
-   if (parent) p_elm_win = parent->elm_win;
-
-   elm_win = elm_win_add(p_elm_win, name, ELM_WIN_BASIC);
-   EINA_SAFETY_ON_NULL_GOTO(elm_win, err);
-
-   if (alpha) elm_win_alpha_set(elm_win, EINA_TRUE);
-
-   elm_win_title_set(elm_win, name);
-   elm_win_autodel_set(elm_win, EINA_FALSE);
-
-   bg = elm_bg_add(elm_win);
-   evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   elm_win_resize_object_add(elm_win, bg);
-   elm_bg_color_set(bg, 0, 120, 100);
-   evas_object_show(bg);
-
-   tw = E_NEW(E_TC_Win, 1);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tw, NULL);
-
-   tw->elm_win = elm_win;
-   tw->native_win = elm_win_xwindow_get(elm_win); // TODO: wayland
-   tw->name = eina_stringshare_add(name);
-   tw->x = x;
-   tw->y = y;
-   tw->w = w;
-   tw->h = h;
-   tw->layer = layer;
-   tw->alpha = alpha;
-
-   return tw;
-
-err:
-   evas_object_del(elm_win);
-   E_FREE(tw);
-
-   return NULL;
-}
-
-E_TC_Win *
-e_tc_win_info_add(Ecore_Window native_win,
-                  Eina_Bool alpha,
-                  const char *name,
-                  int x, int y,
-                  int w, int h,
-                  int layer)
-{
-   E_TC_Win *tw = NULL;
-
-   tw = E_NEW(E_TC_Win, 1);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(tw, NULL);
-
-   tw->elm_win = NULL;
-   tw->native_win = native_win;
-   tw->name = eina_stringshare_add(name);
-   tw->x = x;
-   tw->y = y;
-   tw->w = w;
-   tw->h = h;
-   tw->layer = layer;
-   tw->alpha = alpha;
-
-   return tw;
-}
-
-void
-e_tc_win_del(E_TC_Win *tw)
-{
-   EINA_SAFETY_ON_NULL_RETURN(tw);
-
-   if (tw->elm_win)
-     evas_object_del(tw->elm_win);
-
-   if (tw->name)
-     eina_stringshare_del(tw->name);
-
-   E_FREE(tw);
-}
-
-void
-e_tc_win_geom_update(E_TC_Win *tw)
-{
-   evas_object_move(tw->elm_win, tw->x, tw->y);
-   evas_object_resize(tw->elm_win, tw->w, tw->h);
-}
-
-void
-e_tc_win_show(E_TC_Win *tw)
-{
-   evas_object_show(tw->elm_win);
-}
-
-void
-e_tc_win_hide(E_TC_Win *tw)
-{
-   evas_object_hide(tw->elm_win);
-}
-
-void
-e_tc_win_stack_change(E_TC_Win *tw, E_TC_Win *sibling, Eina_Bool above)
-{
-   /* TODO */
-   if (sibling)
-     {
-        if (above)
-          {
-             ; // stack above: window is placed above sibling window.
-          }
-        else
-          {
-             ; // stack below: window is placed below sibling window.
-          }
-     }
-   else
-     {
-        if (above)
-          {
-             ; // raise: window is placed at the top of stack.
-          }
-        else
-          {
-             ; // lower: window is placed at the bottom of stack.
-          }
-     }
-}
-
-static E_TC *
-_e_tc_add(unsigned int num,
-          const char *name,
-          Eina_Bool (*func)(E_TC*),
-          Eina_Bool expect,
-          E_TC_Runner *runner)
-{
-   E_TC *tc;
-
-   tc = E_NEW(E_TC, 1);
-
-   tc->num = num;
-   tc->name = name;
-   tc->func = func;
-   tc->expect = expect;
-   tc->runner = runner;
-
-   runner->tc_list = eina_list_append(runner->tc_list, tc);
-
-   return tc;
-}
-
-#undef TC_ADD
-#define TC_ADD(num, name, func, expect) _e_tc_add(num, name, func, expect, runner)
-
-static void
-_e_tc_runner_init(E_TC_Runner *runner)
-{
-#undef T_FUNC
-#define T_FUNC(num_, test_) tc_000##num_##_##test_
-   /* [0000 - 0099] test runner verification */
-   TC_ADD(   0, "Base: Pass",                 T_FUNC(   0, base_pass                ), 1);
-   TC_ADD(   1, "Base: Fail",                 T_FUNC(   1, base_fail                ), 0);
-#undef T_FUNC
-#define T_FUNC(num_, test_) tc_00##num_##_##test_
-   TC_ADD(  10, "DBus: Introspect",           T_FUNC(  10, introspect               ), 1);
-   TC_ADD(  11, "DBus: Window register",      T_FUNC(  11, win_register             ), 1);
-#undef T_FUNC
-#define T_FUNC(num_, test_) tc_0##num_##_##test_
-   /* [0100 - 0199] window base operation */
-   TC_ADD( 100, "Basic window: Show",         T_FUNC( 100, win_show                 ), 1);
-   TC_ADD( 101, "Basic window: Stack",        T_FUNC( 101, win_stack                ), 1);
-   TC_ADD( 110, "Alpha window: Show",         T_FUNC( 110, alpha_win_show           ), 1);
-   TC_ADD( 111, "Alpha window: Stack",        T_FUNC( 111, alpha_win_stack          ), 1);
-   /* [0200 - 0299] transient for */
-   TC_ADD( 200, "Transient for: Basic",       T_FUNC( 200, transient_for_basic      ), 1);
-   TC_ADD( 201, "Transient for: Raise",       T_FUNC( 201, transient_for_raise      ), 1);
-   TC_ADD( 202, "Transient for: Lower",       T_FUNC( 202, transient_for_lower      ), 1);
-   TC_ADD( 203, "Transient for: Stack above", T_FUNC( 203, transient_for_stack_above), 1);
-   TC_ADD( 204, "Transient for: Stack below", T_FUNC( 204, transient_for_stack_below), 1);
-   /* [0300 - 0399] notification */
-   /* TODO */
-#undef T_FUNC
-}
-
-static void
-_e_tc_runner_shutdown(E_TC_Runner *runner)
-{
-   E_TC *tc;
-
-   EINA_LIST_FREE(runner->tc_list, tc)
-     {
-        E_FREE(tc);
-     }
-}
-
-static void
-_e_tc_runner_run(E_TC_Runner *runner)
-{
-   Eina_List *l;
-   E_TC *tc;
-   Eina_Bool pass;
-
-   EINA_LIST_FOREACH(runner->tc_list, l, tc)
-     {
-        pass = tc->func(tc);
-        tc->passed = (pass == tc->expect);
-
-        printf("TEST \"%s\" : %s\n",
-               tc->name,
-               tc->passed ? "PASS" : "FAIL");
-     }
-}
-
-static void
-_e_tc_runner_result(E_TC_Runner *runner)
-{
-   Eina_Strbuf *buf;
-   Eina_List *l;
-   E_TC *tc;
-   int pass_case = 0;
-   int fail_case = 0;
-   int total = 0;
-
-   if (!(buf = eina_strbuf_new())) return;
-
-   eina_strbuf_append(buf, "\n\n");
-   eina_strbuf_append(buf, "==============================================\n");
-   eina_strbuf_append(buf, "TEST CASE RESULT\n");
-   eina_strbuf_append(buf, "==============================================\n");
-
-   EINA_LIST_FOREACH(runner->tc_list, l, tc)
-     {
-        eina_strbuf_append_printf(buf,
-                                  "[%04d] TEST \"%-30.30s\" : %s\n",
-                                  tc->num,
-                                  tc->name,
-                                  tc->passed ? "PASS" : "FAIL");
-
-        total++;
-        tc->passed ? pass_case++ : fail_case++;
-     }
-
-   eina_strbuf_append(buf, "==============================================\n");
-   eina_strbuf_append_printf(buf, "TOTAL: %4d Cases\n", total);
-   eina_strbuf_append_printf(buf, "PASS : %4d Cases\n", pass_case);
-   eina_strbuf_append_printf(buf, "FAIL : %4d Cases\n", fail_case);
-   eina_strbuf_append(buf, "==============================================\n");
-
-   printf("%s", eina_strbuf_string_get(buf));
-}
-
-EAPI_MAIN int
-elm_main(int argc EINA_UNUSED,
-         char **argv EINA_UNUSED)
-{
-   E_TC_Runner *runner = NULL;
-   int res;
-
-   runner = E_NEW(E_TC_Runner, 1);
-   EINA_SAFETY_ON_NULL_GOTO(runner, err);
-
-   _log_dom = eina_log_domain_register("e-tc", EINA_COLOR_BLUE);
-   if (_log_dom < 0)
-     {
-        ERR("Can't register e-tc log domain.");
-        goto err;
-     }
-
-   res = eldbus_init();
-   EINA_SAFETY_ON_FALSE_GOTO((res > 0), err);
-
-   runner->dbus.conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
-   if (!runner->dbus.conn)
-     {
-        ERR("Can't get dbus connection.");
-        goto err;
-     }
-
-   runner->dbus.obj = eldbus_object_get(runner->dbus.conn,
-                                        "org.enlightenment.wm",
-                                        "/org/enlightenment/wm");
-   if (!runner->dbus.obj)
-     {
-        ERR("Can't get dbus object.");
-        goto err;
-     }
-
-   runner->dbus.proxy = eldbus_proxy_get(runner->dbus.obj,
-                                         "org.enlightenment.wm.Test");
-   if (!runner->dbus.proxy)
-     {
-        ERR("Can't get dbus proxy.");
-        goto err;
-     }
-
-   _e_tc_runner_init(runner);
-   _e_tc_runner_run(runner);
-   _e_tc_runner_result(runner);
-   _e_tc_runner_shutdown(runner);
-
-   eldbus_proxy_unref(runner->dbus.proxy);
-   eldbus_object_unref(runner->dbus.obj);
-   eldbus_connection_unref(runner->dbus.conn);
-   eldbus_shutdown();
-   eina_log_domain_unregister(_log_dom);
-
-   E_FREE(runner);
-   return 0;
-
-err:
-   E_FREE(runner);
-   return -1;
-}
-ELM_MAIN()
diff --git a/src/e_tc_main.h b/src/e_tc_main.h
deleted file mode 100644 (file)
index 158335b..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-#ifndef E_TC_MAIN_H
-#define E_TC_MAIN_H
-
-#include <Eldbus.h>
-#include <Elementary.h>
-
-extern int _log_dom;
-
-#ifdef ERR
-# undef ERR
-#endif
-#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
-
-#ifdef DBG
-# undef DBG
-#endif
-#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
-
-#ifdef INF
-# undef INF
-#endif
-#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
-
-#ifdef WRN
-# undef WRN
-#endif
-#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
-
-#ifdef CRI
-# undef CRI
-#endif
-#define CRI(...) EINA_LOG_DOM_CRIT(_log_dom, __VA_ARGS__)
-
-#ifdef E_NEW
-# undef E_NEW
-#endif
-# define E_NEW(s, n) (s *)calloc(n, sizeof(s))
-
-#ifdef E_FREE
-# undef E_FREE
-#endif
-# define E_FREE(p) do { free(p); p = NULL; } while (0)
-
-#ifdef E_FREE_LIST
-# undef E_FREE_LIST
-#endif
-# define E_FREE_LIST(list, free)   \
-  do                               \
-    {                              \
-       void *_tmp_;                \
-       EINA_LIST_FREE(list, _tmp_) \
-         {                         \
-            free(_tmp_);           \
-         }                         \
-    }                              \
-  while (0)
-
-typedef enum _E_TC_Event_Type
-{
-   E_TC_EVENT_TYPE_NONE = 0,
-   E_TC_EVENT_TYPE_TIMEOUT,
-   E_TC_EVENT_TYPE_VIS_ON,
-   E_TC_EVENT_TYPE_VIS_OFF,
-   E_TC_EVENT_TYPE_STACK_RAISE,
-   E_TC_EVENT_TYPE_STACK_LOWER,
-   E_TC_EVENT_TYPE_STACK_ABOVE,
-   E_TC_EVENT_TYPE_STACK_BELOW,
-   E_TC_EVENT_TYPE_MAX
-} E_TC_Event_Type;
-
-typedef struct _E_TC_Runner E_TC_Runner;
-typedef struct _E_TC_Win    E_TC_Win;
-typedef struct _E_TC        E_TC;
-typedef struct _E_TC_Data   E_TC_Data;
-
-struct _E_TC_Runner
-{
-   Eina_List   *tc_list; // test suite
-
-   struct
-   {
-      Ecore_Timer       *expire_timer;
-      E_TC_Event_Type    expect;
-      E_TC_Event_Type    response;
-   } ev;
-
-   struct
-   {
-      Eldbus_Connection *conn;
-      Eldbus_Proxy      *proxy;
-      Eldbus_Object     *obj;
-   } dbus;
-};
-
-struct _E_TC_Win
-{
-   Evas_Object *elm_win;    // elm_win evas object
-   Ecore_Window native_win; // native window id
-   const char  *name;       // name of client window
-   int          x, y, w, h; // geometry
-   int          layer;      // value of E_Layer
-   int          vis;        // visibility
-   int          alpha;      // alpha window
-};
-
-struct _E_TC
-{
-   const char  *name;
-   unsigned int num;
-   Eina_Bool    (*func) (E_TC *tc);
-   Eina_Bool    passed;
-   Eina_Bool    expect;
-   E_TC_Runner *runner;
-   E_TC_Data   *data;
-};
-
-Eina_Bool  e_tc_runner_req_win_register(E_TC_Runner *runner, E_TC_Win *tw);
-Eina_Bool  e_tc_runner_req_win_deregister(E_TC_Runner *runner, E_TC_Win *tw);
-Eina_List *e_tc_runner_req_win_info_list_get(E_TC_Runner *runner);
-Eina_Bool  e_tc_runner_ev_wait(E_TC_Runner *runner, E_TC_Event_Type ev);
-
-E_TC_Win  *e_tc_win_add(E_TC_Win *parent, Elm_Win_Type type, Eina_Bool alpha, const char *name, int x, int y, int w, int h, int layer);
-E_TC_Win  *e_tc_win_info_add(Ecore_Window native_win, Eina_Bool alpha, const char *name, int x, int y, int w, int h, int layer);
-void       e_tc_win_del(E_TC_Win *tw);
-void       e_tc_win_geom_update(E_TC_Win *tw);
-void       e_tc_win_show(E_TC_Win *tw);
-void       e_tc_win_hide(E_TC_Win *tw);
-void       e_tc_win_stack_change(E_TC_Win *tw, E_TC_Win *sibling, Eina_Bool above);
-
-/* test cases */
-Eina_Bool  tc_0000_base_pass(E_TC *tc);
-Eina_Bool  tc_0001_base_fail(E_TC *tc);
-Eina_Bool  tc_0010_introspect(E_TC *tc);
-Eina_Bool  tc_0011_win_register(E_TC *tc);
-
-Eina_Bool  tc_0100_win_show(E_TC *tc);
-Eina_Bool  tc_0101_win_stack(E_TC *tc);
-Eina_Bool  tc_0110_alpha_win_show(E_TC *tc);
-Eina_Bool  tc_0111_alpha_win_stack(E_TC *tc);
-
-Eina_Bool  tc_0200_transient_for_basic(E_TC *tc);
-Eina_Bool  tc_0201_transient_for_raise(E_TC *tc);
-Eina_Bool  tc_0202_transient_for_lower(E_TC *tc);
-Eina_Bool  tc_0203_transient_for_stack_above(E_TC *tc);
-Eina_Bool  tc_0204_transient_for_stack_below(E_TC *tc);
-
-#endif
diff --git a/src/e_test_runner.c b/src/e_test_runner.c
new file mode 100644 (file)
index 0000000..9b20b29
--- /dev/null
@@ -0,0 +1,635 @@
+#include "e_test_runner.h"
+
+int _log_dom = -1;
+
+static void
+_cb_method_win_info_list_get(void *data,
+                             const Eldbus_Message *msg,
+                             Eldbus_Pending *p EINA_UNUSED)
+{
+   const char *name = NULL, *text = NULL;
+   Eldbus_Message_Iter *array, *ec;
+   Ecore_Window target_win = 0;
+   Eina_List *list = data;
+   Eina_Bool res;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "ua(usiiiiibb)", &target_win, &array);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   list = eina_list_free(list);
+
+   while (eldbus_message_iter_get_and_next(array, 'r', &ec))
+     {
+        const char *win_name;
+        int x, y, w, h, layer;
+        Eina_Bool visible, alpha;
+        Ecore_Window native_win;
+        E_TC_Win *tw = NULL;
+
+        res = eldbus_message_iter_arguments_get(ec,
+                                                "usiiiiibb",
+                                                &native_win,
+                                                &win_name,
+                                                &x,
+                                                &y,
+                                                &w,
+                                                &h,
+                                                &layer,
+                                                &visible,
+                                                &alpha);
+        if (!res)
+          {
+             WRN("Failed to get win info\n");
+             continue;
+          }
+
+        tw = e_tc_win_info_add(native_win, alpha, win_name, x, y, w, h, layer);
+        list = eina_list_append(list, tw);
+     }
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+
+   elm_exit();
+}
+
+static void
+_cb_method_window_register(void *data,
+                           const Eldbus_Message *msg,
+                           Eldbus_Pending *p EINA_UNUSED)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   Eina_Bool *accepted = data;
+
+   *accepted = EINA_FALSE;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "b", accepted);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+   EINA_SAFETY_ON_FALSE_GOTO(*accepted, finish);
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+
+   elm_exit();
+}
+
+static void
+_cb_method_window_deregister(void *data,
+                             const Eldbus_Message *msg,
+                             Eldbus_Pending *p EINA_UNUSED)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   Eina_Bool *allowed = data;
+
+   *allowed = EINA_FALSE;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "b", allowed);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+   EINA_SAFETY_ON_FALSE_GOTO(*allowed, finish);
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+
+   elm_exit();
+}
+
+static void
+_cb_signal_vis_changed(void *data,
+                       const Eldbus_Message *msg)
+{
+   E_Test_Runner *runner = data;
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   int vis = 0;
+   Ecore_Window id;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "ub", &id, &vis);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   /* TODO */
+   if (((E_TC_EVENT_TYPE_VIS_ON  == runner->ev.expect) && ( vis)) ||
+       ((E_TC_EVENT_TYPE_VIS_OFF == runner->ev.expect) && (!vis)))
+     {
+        runner->ev.response = runner->ev.expect;
+        elm_exit();
+     }
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static void
+_cb_signal_stack_changed(void *data,
+                         const Eldbus_Message *msg)
+{
+   E_Test_Runner *runner = data;
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   /* TODO */
+   if ((E_TC_EVENT_TYPE_STACK_RAISE <= runner->ev.expect) &&
+       (E_TC_EVENT_TYPE_STACK_BELOW >= runner->ev.expect))
+     {
+        runner->ev.response = runner->ev.expect;
+        elm_exit();
+     }
+
+finish:
+   if ((name) || (text))
+     {
+        ERR("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static Eina_Bool
+_ev_wait_timeout(void *data)
+{
+   E_Test_Runner *runner = data;
+
+   runner->ev.expire_timer = NULL;
+   runner->ev.response = E_TC_EVENT_TYPE_TIMEOUT;
+
+   ERR("ev:%d\n", runner->ev.expect);
+
+   elm_exit();
+
+   return ECORE_CALLBACK_DONE;
+}
+
+Eina_Bool
+e_test_runner_req_win_register(E_Test_Runner *runner,
+                               E_TC_Win *tw)
+{
+   Eldbus_Pending *p;
+   Eina_Bool accepted = EINA_FALSE;
+
+   p = eldbus_proxy_call(runner->dbus.proxy,
+                         "RegisterWindow",
+                         _cb_method_window_register,
+                         &accepted,
+                         -1,
+                         "u",
+                         tw->native_win);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
+
+   elm_run();
+
+   return accepted;
+}
+
+Eina_Bool
+e_test_runner_req_win_deregister(E_Test_Runner *runner,
+                                 E_TC_Win *tw)
+{
+   Eldbus_Pending *p;
+   Eina_Bool allowed = EINA_FALSE;
+
+   p = eldbus_proxy_call(runner->dbus.proxy,
+                         "DeregisterWindow",
+                         _cb_method_window_deregister,
+                         &allowed,
+                         -1,
+                         "u",
+                         tw->native_win);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(p, EINA_FALSE);
+
+   elm_run();
+
+   return allowed;
+}
+
+Eina_List *
+e_test_runner_req_win_info_list_get(E_Test_Runner *runner)
+{
+   Eldbus_Pending *p;
+   Eina_List *list = NULL;
+
+   p = eldbus_proxy_call(runner->dbus.proxy,
+                         "GetClients",
+                         _cb_method_win_info_list_get,
+                         list,
+                         -1,
+                         "");
+   EINA_SAFETY_ON_NULL_RETURN_VAL(p, NULL);
+
+   elm_run();
+
+   return list;
+}
+
+Eina_Bool
+e_test_runner_ev_wait(E_Test_Runner *runner,
+                      E_TC_Event_Type ev)
+{
+   Eldbus_Signal_Handler *sh;
+   Eina_Bool res = EINA_FALSE;
+
+   EINA_SAFETY_ON_FALSE_RETURN_VAL((E_TC_EVENT_TYPE_NONE < ev), res);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL((E_TC_EVENT_TYPE_MAX > ev), res);
+
+   switch (ev)
+     {
+      case E_TC_EVENT_TYPE_VIS_ON:
+      case E_TC_EVENT_TYPE_VIS_OFF:
+         sh = eldbus_proxy_signal_handler_add(runner->dbus.proxy,
+                                              "VisibilityChanged",
+                                              _cb_signal_vis_changed,
+                                              runner);
+         EINA_SAFETY_ON_NULL_GOTO(sh, finish);
+         break;
+
+      case E_TC_EVENT_TYPE_STACK_RAISE:
+      case E_TC_EVENT_TYPE_STACK_LOWER:
+      case E_TC_EVENT_TYPE_STACK_ABOVE:
+      case E_TC_EVENT_TYPE_STACK_BELOW:
+         sh = eldbus_proxy_signal_handler_add(runner->dbus.proxy,
+                                              "StackChanged",
+                                              _cb_signal_stack_changed,
+                                              runner);
+         EINA_SAFETY_ON_NULL_GOTO(sh, finish);
+         break;
+
+      default:
+         goto finish;
+         break;
+     }
+
+   if (runner->ev.expire_timer)
+     ecore_timer_del(runner->ev.expire_timer);
+
+   runner->ev.expect = ev;
+   runner->ev.response = E_TC_EVENT_TYPE_NONE;
+   runner->ev.expire_timer = ecore_timer_add(5.0, _ev_wait_timeout, runner);
+
+   elm_run();
+
+   if (runner->ev.expire_timer)
+     {
+        ecore_timer_del(runner->ev.expire_timer);
+        runner->ev.expire_timer = NULL;
+     }
+
+   eldbus_signal_handler_del(sh);
+
+   res = (runner->ev.response == runner->ev.expect);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+finish:
+   runner->ev.expect = E_TC_EVENT_TYPE_NONE;
+   runner->ev.response = E_TC_EVENT_TYPE_NONE;
+
+   return res;
+}
+
+E_TC_Win *
+e_tc_win_add(E_TC_Win *parent,
+             Elm_Win_Type type,
+             Eina_Bool alpha,
+             const char *name,
+             int x, int y,
+             int w, int h,
+             int layer)
+{
+   E_TC_Win *tw = NULL;
+   Evas_Object *elm_win = NULL, *bg = NULL;
+   Evas_Object *p_elm_win = NULL;
+
+   if (parent) p_elm_win = parent->elm_win;
+
+   elm_win = elm_win_add(p_elm_win, name, ELM_WIN_BASIC);
+   EINA_SAFETY_ON_NULL_GOTO(elm_win, err);
+
+   if (alpha) elm_win_alpha_set(elm_win, EINA_TRUE);
+
+   elm_win_title_set(elm_win, name);
+   elm_win_autodel_set(elm_win, EINA_FALSE);
+
+   bg = elm_bg_add(elm_win);
+   evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(elm_win, bg);
+   elm_bg_color_set(bg, 0, 120, 100);
+   evas_object_show(bg);
+
+   tw = E_NEW(E_TC_Win, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tw, NULL);
+
+   tw->elm_win = elm_win;
+   tw->native_win = elm_win_xwindow_get(elm_win); // TODO: wayland
+   tw->name = eina_stringshare_add(name);
+   tw->x = x;
+   tw->y = y;
+   tw->w = w;
+   tw->h = h;
+   tw->layer = layer;
+   tw->alpha = alpha;
+
+   return tw;
+
+err:
+   evas_object_del(elm_win);
+   E_FREE(tw);
+
+   return NULL;
+}
+
+E_TC_Win *
+e_tc_win_info_add(Ecore_Window native_win,
+                  Eina_Bool alpha,
+                  const char *name,
+                  int x, int y,
+                  int w, int h,
+                  int layer)
+{
+   E_TC_Win *tw = NULL;
+
+   tw = E_NEW(E_TC_Win, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tw, NULL);
+
+   tw->elm_win = NULL;
+   tw->native_win = native_win;
+   tw->name = eina_stringshare_add(name);
+   tw->x = x;
+   tw->y = y;
+   tw->w = w;
+   tw->h = h;
+   tw->layer = layer;
+   tw->alpha = alpha;
+
+   return tw;
+}
+
+void
+e_tc_win_del(E_TC_Win *tw)
+{
+   EINA_SAFETY_ON_NULL_RETURN(tw);
+
+   if (tw->elm_win)
+     evas_object_del(tw->elm_win);
+
+   if (tw->name)
+     eina_stringshare_del(tw->name);
+
+   E_FREE(tw);
+}
+
+void
+e_tc_win_geom_update(E_TC_Win *tw)
+{
+   evas_object_move(tw->elm_win, tw->x, tw->y);
+   evas_object_resize(tw->elm_win, tw->w, tw->h);
+}
+
+void
+e_tc_win_show(E_TC_Win *tw)
+{
+   evas_object_show(tw->elm_win);
+}
+
+void
+e_tc_win_hide(E_TC_Win *tw)
+{
+   evas_object_hide(tw->elm_win);
+}
+
+void
+e_tc_win_stack_change(E_TC_Win *tw, E_TC_Win *sibling, Eina_Bool above)
+{
+   /* TODO */
+   if (sibling)
+     {
+        if (above)
+          {
+             ; // stack above: window is placed above sibling window.
+          }
+        else
+          {
+             ; // stack below: window is placed below sibling window.
+          }
+     }
+   else
+     {
+        if (above)
+          {
+             ; // raise: window is placed at the top of stack.
+          }
+        else
+          {
+             ; // lower: window is placed at the bottom of stack.
+          }
+     }
+}
+
+static E_TC *
+_e_tc_add(unsigned int num,
+          const char *name,
+          Eina_Bool (*func)(E_TC*),
+          Eina_Bool expect,
+          E_Test_Runner *runner)
+{
+   E_TC *tc;
+
+   tc = E_NEW(E_TC, 1);
+
+   tc->num = num;
+   tc->name = name;
+   tc->func = func;
+   tc->expect = expect;
+   tc->runner = runner;
+
+   runner->tc_list = eina_list_append(runner->tc_list, tc);
+
+   return tc;
+}
+
+#undef TC_ADD
+#define TC_ADD(num, name, func, expect) _e_tc_add(num, name, func, expect, runner)
+
+static void
+_e_test_runner_init(E_Test_Runner *runner)
+{
+#undef T_FUNC
+#define T_FUNC(num_, test_) tc_000##num_##_##test_
+   /* [0000 - 0099] test runner verification */
+   TC_ADD(   0, "Base: Pass",                 T_FUNC(   0, base_pass                ), 1);
+   TC_ADD(   1, "Base: Fail",                 T_FUNC(   1, base_fail                ), 0);
+#undef T_FUNC
+#define T_FUNC(num_, test_) tc_00##num_##_##test_
+   TC_ADD(  10, "DBus: Introspect",           T_FUNC(  10, introspect               ), 1);
+   TC_ADD(  11, "DBus: Window register",      T_FUNC(  11, win_register             ), 1);
+#undef T_FUNC
+#define T_FUNC(num_, test_) tc_0##num_##_##test_
+   /* [0100 - 0199] window base operation */
+   TC_ADD( 100, "Basic window: Show",         T_FUNC( 100, win_show                 ), 1);
+   TC_ADD( 101, "Basic window: Stack",        T_FUNC( 101, win_stack                ), 1);
+   TC_ADD( 110, "Alpha window: Show",         T_FUNC( 110, alpha_win_show           ), 1);
+   TC_ADD( 111, "Alpha window: Stack",        T_FUNC( 111, alpha_win_stack          ), 1);
+   /* [0200 - 0299] transient for */
+   TC_ADD( 200, "Transient for: Basic",       T_FUNC( 200, transient_for_basic      ), 1);
+   TC_ADD( 201, "Transient for: Raise",       T_FUNC( 201, transient_for_raise      ), 1);
+   TC_ADD( 202, "Transient for: Lower",       T_FUNC( 202, transient_for_lower      ), 1);
+   TC_ADD( 203, "Transient for: Stack above", T_FUNC( 203, transient_for_stack_above), 1);
+   TC_ADD( 204, "Transient for: Stack below", T_FUNC( 204, transient_for_stack_below), 1);
+   /* [0300 - 0399] notification */
+   /* TODO */
+#undef T_FUNC
+}
+
+static void
+_e_test_runner_shutdown(E_Test_Runner *runner)
+{
+   E_TC *tc;
+
+   EINA_LIST_FREE(runner->tc_list, tc)
+     {
+        E_FREE(tc);
+     }
+}
+
+static void
+_e_test_runner_run(E_Test_Runner *runner)
+{
+   Eina_List *l;
+   E_TC *tc;
+   Eina_Bool pass;
+
+   EINA_LIST_FOREACH(runner->tc_list, l, tc)
+     {
+        pass = tc->func(tc);
+        tc->passed = (pass == tc->expect);
+
+        printf("TEST \"%s\" : %s\n",
+               tc->name,
+               tc->passed ? "PASS" : "FAIL");
+     }
+}
+
+static void
+_e_test_runner_result(E_Test_Runner *runner)
+{
+   Eina_Strbuf *buf;
+   Eina_List *l;
+   E_TC *tc;
+   int pass_case = 0;
+   int fail_case = 0;
+   int total = 0;
+
+   if (!(buf = eina_strbuf_new())) return;
+
+   eina_strbuf_append(buf, "\n\n");
+   eina_strbuf_append(buf, "==============================================\n");
+   eina_strbuf_append(buf, "TEST CASE RESULT\n");
+   eina_strbuf_append(buf, "==============================================\n");
+
+   EINA_LIST_FOREACH(runner->tc_list, l, tc)
+     {
+        eina_strbuf_append_printf(buf,
+                                  "[%04d] TEST \"%-30.30s\" : %s\n",
+                                  tc->num,
+                                  tc->name,
+                                  tc->passed ? "PASS" : "FAIL");
+
+        total++;
+        tc->passed ? pass_case++ : fail_case++;
+     }
+
+   eina_strbuf_append(buf, "==============================================\n");
+   eina_strbuf_append_printf(buf, "TOTAL: %4d Cases\n", total);
+   eina_strbuf_append_printf(buf, "PASS : %4d Cases\n", pass_case);
+   eina_strbuf_append_printf(buf, "FAIL : %4d Cases\n", fail_case);
+   eina_strbuf_append(buf, "==============================================\n");
+
+   printf("%s", eina_strbuf_string_get(buf));
+}
+
+EAPI_MAIN int
+elm_main(int argc EINA_UNUSED,
+         char **argv EINA_UNUSED)
+{
+   E_Test_Runner *runner = NULL;
+   int res;
+
+   runner = E_NEW(E_Test_Runner, 1);
+   EINA_SAFETY_ON_NULL_GOTO(runner, err);
+
+   _log_dom = eina_log_domain_register("e-tc", EINA_COLOR_BLUE);
+   if (_log_dom < 0)
+     {
+        ERR("Can't register e-tc log domain.");
+        goto err;
+     }
+
+   res = eldbus_init();
+   EINA_SAFETY_ON_FALSE_GOTO((res > 0), err);
+
+   runner->dbus.conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
+   if (!runner->dbus.conn)
+     {
+        ERR("Can't get dbus connection.");
+        goto err;
+     }
+
+   runner->dbus.obj = eldbus_object_get(runner->dbus.conn,
+                                        "org.enlightenment.wm",
+                                        "/org/enlightenment/wm");
+   if (!runner->dbus.obj)
+     {
+        ERR("Can't get dbus object.");
+        goto err;
+     }
+
+   runner->dbus.proxy = eldbus_proxy_get(runner->dbus.obj,
+                                         "org.enlightenment.wm.Test");
+   if (!runner->dbus.proxy)
+     {
+        ERR("Can't get dbus proxy.");
+        goto err;
+     }
+
+   _e_test_runner_init(runner);
+   _e_test_runner_run(runner);
+   _e_test_runner_result(runner);
+   _e_test_runner_shutdown(runner);
+
+   eldbus_proxy_unref(runner->dbus.proxy);
+   eldbus_object_unref(runner->dbus.obj);
+   eldbus_connection_unref(runner->dbus.conn);
+   eldbus_shutdown();
+   eina_log_domain_unregister(_log_dom);
+
+   E_FREE(runner);
+   return 0;
+
+err:
+   E_FREE(runner);
+   return -1;
+}
+ELM_MAIN()
diff --git a/src/e_test_runner.h b/src/e_test_runner.h
new file mode 100644 (file)
index 0000000..bf08f14
--- /dev/null
@@ -0,0 +1,147 @@
+#ifndef E_TC_MAIN_H
+#define E_TC_MAIN_H
+
+#include <Eldbus.h>
+#include <Elementary.h>
+
+extern int _log_dom;
+
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_log_dom, __VA_ARGS__)
+
+#ifdef DBG
+# undef DBG
+#endif
+#define DBG(...) EINA_LOG_DOM_DBG(_log_dom, __VA_ARGS__)
+
+#ifdef INF
+# undef INF
+#endif
+#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
+
+#ifdef WRN
+# undef WRN
+#endif
+#define WRN(...) EINA_LOG_DOM_WARN(_log_dom, __VA_ARGS__)
+
+#ifdef CRI
+# undef CRI
+#endif
+#define CRI(...) EINA_LOG_DOM_CRIT(_log_dom, __VA_ARGS__)
+
+#ifdef E_NEW
+# undef E_NEW
+#endif
+# define E_NEW(s, n) (s *)calloc(n, sizeof(s))
+
+#ifdef E_FREE
+# undef E_FREE
+#endif
+# define E_FREE(p) do { free(p); p = NULL; } while (0)
+
+#ifdef E_FREE_LIST
+# undef E_FREE_LIST
+#endif
+# define E_FREE_LIST(list, free)   \
+  do                               \
+    {                              \
+       void *_tmp_;                \
+       EINA_LIST_FREE(list, _tmp_) \
+         {                         \
+            free(_tmp_);           \
+         }                         \
+    }                              \
+  while (0)
+
+typedef enum _E_TC_Event_Type
+{
+   E_TC_EVENT_TYPE_NONE = 0,
+   E_TC_EVENT_TYPE_TIMEOUT,
+   E_TC_EVENT_TYPE_VIS_ON,
+   E_TC_EVENT_TYPE_VIS_OFF,
+   E_TC_EVENT_TYPE_STACK_RAISE,
+   E_TC_EVENT_TYPE_STACK_LOWER,
+   E_TC_EVENT_TYPE_STACK_ABOVE,
+   E_TC_EVENT_TYPE_STACK_BELOW,
+   E_TC_EVENT_TYPE_MAX
+} E_TC_Event_Type;
+
+typedef struct _E_Test_Runner E_Test_Runner;
+typedef struct _E_TC_Win      E_TC_Win;
+typedef struct _E_TC          E_TC;
+typedef struct _E_TC_Data     E_TC_Data;
+
+struct _E_Test_Runner
+{
+   Eina_List   *tc_list; // test suite
+
+   struct
+   {
+      Ecore_Timer       *expire_timer;
+      E_TC_Event_Type    expect;
+      E_TC_Event_Type    response;
+   } ev;
+
+   struct
+   {
+      Eldbus_Connection *conn;
+      Eldbus_Proxy      *proxy;
+      Eldbus_Object     *obj;
+   } dbus;
+};
+
+struct _E_TC_Win
+{
+   Evas_Object *elm_win;    // elm_win evas object
+   Ecore_Window native_win; // native window id
+   const char  *name;       // name of client window
+   int          x, y, w, h; // geometry
+   int          layer;      // value of E_Layer
+   int          vis;        // visibility
+   int          alpha;      // alpha window
+};
+
+struct _E_TC
+{
+   const char    *name;
+   unsigned int   num;
+   Eina_Bool      (*func) (E_TC *tc);
+   Eina_Bool      passed;
+   Eina_Bool      expect;
+   E_Test_Runner *runner;
+   E_TC_Data     *data;
+};
+
+Eina_Bool  e_test_runner_req_win_register(E_Test_Runner *runner, E_TC_Win *tw);
+Eina_Bool  e_test_runner_req_win_deregister(E_Test_Runner *runner, E_TC_Win *tw);
+Eina_List *e_test_runner_req_win_info_list_get(E_Test_Runner *runner);
+Eina_Bool  e_test_runner_ev_wait(E_Test_Runner *runner, E_TC_Event_Type ev);
+
+E_TC_Win  *e_tc_win_add(E_TC_Win *parent, Elm_Win_Type type, Eina_Bool alpha, const char *name, int x, int y, int w, int h, int layer);
+E_TC_Win  *e_tc_win_info_add(Ecore_Window native_win, Eina_Bool alpha, const char *name, int x, int y, int w, int h, int layer);
+void       e_tc_win_del(E_TC_Win *tw);
+void       e_tc_win_geom_update(E_TC_Win *tw);
+void       e_tc_win_show(E_TC_Win *tw);
+void       e_tc_win_hide(E_TC_Win *tw);
+void       e_tc_win_stack_change(E_TC_Win *tw, E_TC_Win *sibling, Eina_Bool above);
+
+/* test cases */
+Eina_Bool  tc_0000_base_pass(E_TC *tc);
+Eina_Bool  tc_0001_base_fail(E_TC *tc);
+Eina_Bool  tc_0010_introspect(E_TC *tc);
+Eina_Bool  tc_0011_win_register(E_TC *tc);
+
+Eina_Bool  tc_0100_win_show(E_TC *tc);
+Eina_Bool  tc_0101_win_stack(E_TC *tc);
+Eina_Bool  tc_0110_alpha_win_show(E_TC *tc);
+Eina_Bool  tc_0111_alpha_win_stack(E_TC *tc);
+
+Eina_Bool  tc_0200_transient_for_basic(E_TC *tc);
+Eina_Bool  tc_0201_transient_for_raise(E_TC *tc);
+Eina_Bool  tc_0202_transient_for_lower(E_TC *tc);
+Eina_Bool  tc_0203_transient_for_stack_above(E_TC *tc);
+Eina_Bool  tc_0204_transient_for_stack_below(E_TC *tc);
+
+#endif