0009_input: Add pointer_event_robustness TC 53/315453/2
authorduna.oh <duna.oh@samsung.com>
Thu, 1 Aug 2024 05:38:37 +0000 (14:38 +0900)
committerduna.oh <duna.oh@samsung.com>
Thu, 1 Aug 2024 06:08:17 +0000 (15:08 +0900)
This TC aims to validate whether the coordinate of mouse events are accurate.

Change-Id: I8ff68cee5d4863b2ae5dc2464376fa3e1ac5dac2

src/e_test_event.cpp
src/e_test_event.h
src/e_test_util.h
src/testcase/0009_input.cpp

index 78770589adc3f40fd48794792a461ebec59666da..ecf040e589bb77ec62bea754b82ef326c390a073 100644 (file)
@@ -122,6 +122,9 @@ static void _cb_signal_iconic_state_changed(void *data, const Eldbus_Message *ms
 /* callbacks - ecore */
 static Eina_Bool _cb_ecore_key_down(void *data, int type, void *event);
 static Eina_Bool _cb_ecore_key_up(void *data, int type, void *event);
+static Eina_Bool _cb_ecore_mouse_button_down(void *data, int type, void *event);
+static Eina_Bool _cb_ecore_mouse_button_up(void *data, int type, void *event);
+static Eina_Bool _cb_ecore_mouse_move(void *data, int type, void *event);
 
 /* callbacks - evas */
 static void _cb_evas_key_down(void * data, Evas * evas, Evas_Object * obj, void * event_info);
@@ -1467,7 +1470,8 @@ etRunner::waitEvent(etWin *win, E_TC_Event_Type ev_type)
              recv_item->result = EINA_TRUE;
              return recv_item;
           }
-        else if (ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_KEY)
+        else if ((ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_KEY) ||
+                 (ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE))
           {
              Ecore_Window ew = elm_win_window_id_get(win?win->elm_win:0);
              if (recv_item->isSameWin(ew) &&
@@ -1630,6 +1634,20 @@ etRunner::addSignalHandlers()
 
    ev.key.ecore_state = EINA_FALSE;
 
+   eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, _cb_ecore_mouse_button_down, this);
+   EINA_SAFETY_ON_NULL_GOTO(eh, err);
+   ev.eh_list = eina_list_append(ev.eh_list, eh);
+
+   eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP, _cb_ecore_mouse_button_up, this);
+   EINA_SAFETY_ON_NULL_GOTO(eh, err);
+   ev.eh_list = eina_list_append(ev.eh_list, eh);
+
+   eh = ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE, _cb_ecore_mouse_move, this);
+   EINA_SAFETY_ON_NULL_GOTO(eh, err);
+   ev.eh_list = eina_list_append(ev.eh_list, eh);
+
+   ev.mouse.ecore_state = EINA_FALSE;
+
    return EINA_TRUE;
 
 err:
@@ -2528,6 +2546,74 @@ _cb_ecore_key_up(void *data, int type, void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static Eina_Bool
+_cb_ecore_mouse_button_down(void *data, int type, void *event)
+{
+   Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button *)event;
+   etRunner *runner = (etRunner *)data;
+
+   DBG("Mouse button DOWN cb");
+   if (runner->ev.mouse.buttons != ev->buttons) return ECORE_CALLBACK_PASS_ON;
+
+   if ((runner->ev.mouse.x == ev->x) &&
+       (runner->ev.mouse.y == ev->y))
+     {
+        if (runner->ev.mouse.ecore_state == EINA_FALSE &&
+            type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
+          {
+             DBG("Mouse button DOWN cb. insert event");
+             runner->ev.mouse.ecore_state = EINA_TRUE;
+             runner->insertEventQueue(ev->window, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+          }
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_cb_ecore_mouse_button_up(void *data, int type, void *event)
+{
+   Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button *)event;
+   etRunner *runner = (etRunner *)data;
+
+   DBG("Mouse button UP cb");
+   if (runner->ev.mouse.buttons != ev->buttons) return ECORE_CALLBACK_PASS_ON;
+
+   if ((runner->ev.mouse.x == ev->x) &&
+       (runner->ev.mouse.y == ev->y))
+     {
+        if (runner->ev.mouse.ecore_state == EINA_TRUE &&
+            type == ECORE_EVENT_MOUSE_BUTTON_UP)
+          {
+             DBG("Mouse button UP cb. insert event");
+             runner->ev.mouse.ecore_state = EINA_FALSE;
+             runner->insertEventQueue(ev->window, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+          }
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_cb_ecore_mouse_move(void *data, int type, void *event)
+{
+   Ecore_Event_Mouse_Move *ev = (Ecore_Event_Mouse_Move *)event;
+   etRunner *runner = (etRunner *)data;
+
+   DBG("Mouse MOVE cb");
+   if ((runner->ev.mouse.x == ev->x) &&
+       (runner->ev.mouse.y == ev->y))
+     {
+        if (type == ECORE_EVENT_MOUSE_MOVE)
+          {
+             DBG("Mouse MOVE cb. insert event");
+             runner->insertEventQueue(ev->window, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+          }
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
 /* callbacks - evas */
 static void
 _cb_evas_key_down(void *data, Evas * evas, Evas_Object * obj, void * event_info)
index fa504db63ab45dacaa2efe5074acc9759f9d23a4..ca3b021c8a4ecea43f76a2c8c6f108529fe9f31a 100644 (file)
@@ -225,6 +225,13 @@ public: /* TODO: make it hidden */
              Eina_Bool evas_state;
              Ecore_Timer *timer;
           } key;
+        struct
+          {
+             int x;
+             int y;
+             unsigned int buttons;
+             Eina_Bool ecore_state;
+          } mouse;
         struct
           {
              unsigned int state_smcb;
index 0fa0d594d3ce7ce3bc8f21233db59a5c7f5c599c..376d9fbf237169399b37b0d0494baf2d3eaf040e 100644 (file)
@@ -87,6 +87,7 @@ typedef enum _E_TC_Event_Type
    E_TC_EVENT_TYPE_WINDOW_ROTATION_CHANGE,
    E_TC_EVENT_TYPE_FOCUS_CHANGED,
    E_TC_EVENT_TYPE_INPUT_ECORE_KEY,
+   E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE,
    E_TC_EVENT_TYPE_INPUT_EVAS_KEY,
    E_TC_EVENT_TYPE_EFFECT_EVAS_CB,
    E_TC_EVENT_TYPE_EFFECT,
index 164662894f819ff5735e52538e78ceafe446ffed..fdd2682d9e531a90a6e42d285071f7654f473168 100644 (file)
@@ -1063,6 +1063,47 @@ TEST_F(etTestInput, pointer_move_invalid_position)
    ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
 }
 
+TEST_F(etTestInput, pointer_event_robustness)
+{
+   int ret = EFL_UTIL_ERROR_NONE;
+
+   etWin *tw = initNormalWin("TCWin_PointerEventRobustness", EINA_FALSE);
+   ASSERT_TRUE(tw != NULL) << "failed to initiation window";
+
+   showTCWin(tw);
+   ASSERT_VIS_ON(tw);
+
+   InputGenHandler inputgen_h = std::make_shared<etInputGenHandler>(EFL_UTIL_INPUT_DEVTYPE_POINTER, true);
+   ret = inputgen_h->generatePointerMove(1, 0, 0);
+   ASSERT_TRUE(ret);
+
+   etRunner::get().ev.mouse.x = 50;
+   etRunner::get().ev.mouse.y = 50;
+
+   ret = inputgen_h->generatePointerMove(1, 50, 50);
+   ASSERT_TRUE(ret);
+   ev_result = etRunner::get().waitEvent(tw, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+   ASSERT_NE(ev_result, nullptr);
+
+   etRunner::get().ev.mouse.buttons = 1;
+   etRunner::get().ev.mouse.x = 100;
+   etRunner::get().ev.mouse.y = 100;
+
+   inputgen_h->generatePointerMove(1, 100, 100);
+   ret = inputgen_h->generatePointerDown(1, 100, 100);
+   ASSERT_TRUE(ret);
+   ev_result = etRunner::get().waitEvent(tw, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+   ASSERT_NE(ev_result, nullptr);
+
+   ret = inputgen_h->generatePointerUp(1, 100, 100);
+   ASSERT_TRUE(ret);
+   ev_result = etRunner::get().waitEvent(tw, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+   ASSERT_NE(ev_result, nullptr);
+   etRunner::get().ev.elm_win = NULL;
+
+   ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
+}
+
 TEST_F(etTestInput, pointer_warp)
 {
    Ecore_Wl2_Window *wlwin = NULL;