9_input: add pointer_down_and_move TC and touch_multi_down TC 93/322093/3
authorduna.oh <duna.oh@samsung.com>
Thu, 3 Apr 2025 08:55:03 +0000 (17:55 +0900)
committerduna.oh <duna.oh@samsung.com>
Fri, 4 Apr 2025 01:46:12 +0000 (10:46 +0900)
Change-Id: I4231aefb1295c85b6441937a31381090a6d0da51

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

index 13df4e88c74637c72612a45e1824ab01c37cdfda..b173ba2324fca0dc8f4ad17132927c7dda7c7b91 100644 (file)
@@ -1452,7 +1452,18 @@ etRunner::waitEvent(etWin *win, E_TC_Event_Type ev_type)
      }
 
    // pre-waiting events
-   watchEventSignal(win?win->native_win:0, ev_type);
+   if ((ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_KEY) ||
+       (ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE) ||
+       (ev_type == E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE_RELATIVE_MOVE))
+     {
+        Ecore_Window ew = elm_win_window_id_get(win?win->elm_win:0);
+        watchEventSignal(ew, ev_type);
+     }
+   else
+     {
+        watchEventSignal(win?win->native_win:0, ev_type);
+     }
+
    work();
 
    if (*ev.wait_event_index == ev.last_event)
@@ -2572,14 +2583,16 @@ _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 (%d, %d) buttons: %d", ev->x, ev->y, ev->buttons);
+   DBG("Mouse button DOWN cb (%d, %d) buttons: %d device: %d", ev->x, ev->y, ev->buttons, ev->multi.device);
    if (runner->ev.mouse.buttons != ev->buttons) return ECORE_CALLBACK_PASS_ON;
+   if (runner->ev.mouse.multi_device != 0 &&
+       runner->ev.mouse.multi_device != (unsigned int)ev->multi.device)
+     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)
+        if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
           {
             if (checkEcoreDeviceInfo(ev->dev))
               {
@@ -2601,14 +2614,16 @@ _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 (%d, %d) buttons: %d", ev->x, ev->y, ev->buttons);
+   DBG("Mouse button UP cb (%d, %d) buttons: %d device: %d", ev->x, ev->y, ev->buttons, ev->multi.device);
    if (runner->ev.mouse.buttons != ev->buttons) return ECORE_CALLBACK_PASS_ON;
+   if (runner->ev.mouse.multi_device != 0 &&
+       runner->ev.mouse.multi_device != (unsigned int)ev->multi.device)
+     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)
+        if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
           {
              if (checkEcoreDeviceInfo(ev->dev))
                {
index b63ac73c5db67481c65235594142f4ac93975a71..f459312ea6fdfc7e7614166b6d77d04788244d3f 100644 (file)
@@ -231,6 +231,7 @@ public: /* TODO: make it hidden */
              int x;
              int y;
              unsigned int buttons;
+             unsigned int multi_device;
              Eina_Bool ecore_state;
           } mouse;
         struct
index 989831c3890bd01afe75d0701ae9267afdd9d2d4..6d9e6167e6ae8282302a5e70e86fbb5d1f497916 100644 (file)
@@ -1777,6 +1777,138 @@ TEST_F(etTestInput, relative_motion_grab_invalid_parameter)
 }
 #endif //RELATIVE_MOTION_GRAB_MERGED
 
+TEST_F(etTestInput, pointer_down_and_move)
+{
+   int ret = EFL_UTIL_ERROR_NONE;
+
+   etWin *tw_big = initNormalWin("TCWin_PointerEvent_Big", 0, 0, 500, 500);
+   ASSERT_TRUE(tw_big != NULL) << "failed to initiation Big window";
+   showTCWin(tw_big);
+   ASSERT_VIS_ON(tw_big);
+
+   etWin *tw_small = initNormalWin("TCWin_PointerEvent_Small", 0, 0, 100, 100);
+   ASSERT_TRUE(tw_small != NULL) << "failed to initiation Small window";
+   showTCWin(tw_small);
+   ASSERT_VIS_ON(tw_small);
+
+   InputGenHandler inputgen_h = std::make_shared<etInputGenHandler>(EFL_UTIL_INPUT_DEVTYPE_POINTER, true);
+   ret = inputgen_h->generatePointerMove(1, 50, 50);
+   ASSERT_TRUE(ret);
+
+   etRunner::get().ev.mouse.buttons = 1;
+   etRunner::get().ev.mouse.x = 50;
+   etRunner::get().ev.mouse.y = 50;
+
+   ret = inputgen_h->generatePointerDown(1, 50, 50);
+   ASSERT_TRUE(ret);
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   etRunner::get().ev.mouse.buttons = 1;
+   etRunner::get().ev.mouse.x = 400;
+   etRunner::get().ev.mouse.y = 400;
+
+   ret = inputgen_h->generatePointerMove(1, 200, 200);
+   ret = inputgen_h->generatePointerMove(1, 400, 400);
+   ret = inputgen_h->generatePointerUp(1, 400, 400);
+   ASSERT_TRUE(ret);
+   // Even if mouse up position is on the tw_big window, an event occurs on the tw_small window
+   // because mouse events are grabbed to tw_small window after mouse down position is on it.
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   etRunner::get().ev.elm_win = NULL;
+
+   ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
+}
+
+TEST_F(etTestInput, touch_down_and_move)
+{
+   int ret = EFL_UTIL_ERROR_NONE;
+
+   etWin *tw_big = initNormalWin("TCWin_TouchEvent_Big", 0, 0, 500, 500);
+   ASSERT_TRUE(tw_big != NULL) << "failed to initiation Big window";
+   showTCWin(tw_big);
+   ASSERT_VIS_ON(tw_big);
+
+   etWin *tw_small = initNormalWin("TCWin_TouchEvent_Small", 0, 0, 100, 100);
+   ASSERT_TRUE(tw_small != NULL) << "failed to initiation Small window";
+   showTCWin(tw_small);
+   ASSERT_VIS_ON(tw_small);
+
+   InputGenHandler inputgen_h = std::make_shared<etInputGenHandler>(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, true);
+
+   etRunner::get().ev.mouse.buttons = 1;
+   etRunner::get().ev.mouse.x = 50;
+   etRunner::get().ev.mouse.y = 50;
+
+   ret = inputgen_h->generateTouchDown(0, 50, 50);
+   ASSERT_TRUE(ret);
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   etRunner::get().ev.mouse.buttons = 1;
+   etRunner::get().ev.mouse.x = 400;
+   etRunner::get().ev.mouse.y = 400;
+
+   ret = inputgen_h->generateTouchMove(0, 200, 200);
+   ret = inputgen_h->generateTouchMove(0, 400, 400);
+   ret = inputgen_h->generateTouchUp(0, 400, 400);
+   ASSERT_TRUE(ret);
+   // Even if mouse up position is on the tw_big window, an event occurs on the tw_small window
+   // because mouse events are grabbed to tw_small window after mouse down position is on it.
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   etRunner::get().ev.elm_win = NULL;
+
+   ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
+}
+
+TEST_F(etTestInput, touch_multi_down)
+{
+   int ret = EFL_UTIL_ERROR_NONE;
+
+   etWin *tw_big = initNormalWin("TCWin_TouchMultiEvent_Big", 0, 0, 500, 500);
+   ASSERT_TRUE(tw_big != NULL) << "failed to initiation Big window";
+   showTCWin(tw_big);
+   ASSERT_VIS_ON(tw_big);
+
+   etWin *tw_small = initNormalWin("TCWin_TouchMultiEvent_Small", 0, 0, 100, 100);
+   ASSERT_TRUE(tw_small != NULL) << "failed to initiation Small window";
+   showTCWin(tw_small);
+   ASSERT_VIS_ON(tw_small);
+
+   InputGenHandler inputgen_h = std::make_shared<etInputGenHandler>(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN, true);
+
+   etRunner::get().ev.mouse.buttons = 1;
+   etRunner::get().ev.mouse.x = 50;
+   etRunner::get().ev.mouse.y = 50;
+
+   ret = inputgen_h->generateTouchDown(0, 50, 50);
+   ASSERT_TRUE(ret);
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   etRunner::get().ev.mouse.multi_device = 1;
+   etRunner::get().ev.mouse.x = 200;
+   etRunner::get().ev.mouse.y = 200;
+
+   // Even if the second mouse down position is on the tw_big window, an event occurs on the tw_small window
+   // because mouse events are grabbed to tw_small window after the first mouse down position is on it.
+   ret = inputgen_h->generateTouchDown(1, 200, 200);
+   ASSERT_TRUE(ret);
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   ret = inputgen_h->generateTouchUp(1, 200, 200);
+   ASSERT_TRUE(ret);
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   etRunner::get().ev.mouse.multi_device = 0;
+   etRunner::get().ev.mouse.x = 50;
+   etRunner::get().ev.mouse.y = 50;
+   ret = inputgen_h->generateTouchUp(0, 50, 50);
+   ASSERT_TRUE(ret);
+   ASSERT_EVENT(tw_small, E_TC_EVENT_TYPE_INPUT_ECORE_MOUSE);
+
+   ASSERT_EQ(etRunner::get().verifyTC(testCaseName, testName), EINA_TRUE);
+}
+
 #ifndef DISABLE_GESTURE_TESTS
 TEST_F(etTestInput, gesture_tap22)
 {