ecore: update ecore_test_ecore_main_loop_event test for more coverage code.
authorValerii Kanunik <v.kanunik@samsung.com>
Fri, 19 Apr 2013 06:42:41 +0000 (15:42 +0900)
committerCedric Bail <cedric.bail@samsung.com>
Fri, 19 Apr 2013 06:43:42 +0000 (15:43 +0900)
Signed-off-by: Cedric Bail <cedric.bail@samsung.com>
src/tests/ecore/ecore_test_ecore.c

index 872c7dc..c6eca20 100644 (file)
@@ -13,6 +13,9 @@
 #define FP_ERR (0.0000001)
 #define CHECK_FP(a, b) ((a - b) < FP_ERR)
 
+#define ECORE_EVENT_CUSTOM_1 1
+#define ECORE_EVENT_CUSTOM_2 2
+
 static int _log_dom;
 #define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
 
@@ -251,41 +254,210 @@ START_TEST(ecore_test_ecore_main_loop_fd_handler)
 END_TEST
 
 static Eina_Bool
-_event_handler_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
+_event_handler_cb(void *data, int type, void *event)
 {
-   /* FIXME: why setting val if it is overwritten just after and what is its purpose ??? */
-   Eina_Bool *val = data;
+   int *did = data;
 
-   *val = EINA_TRUE;
-   ecore_main_loop_quit();
-   return EINA_FALSE;
+   int t1 = type;
+   int *e1 = event;
+
+   int t2 = ecore_event_current_type_get();
+   int *e2 = ecore_event_current_event_get();
+
+   if (t1 == t2)
+      (*did)++;
+
+   if (*e1 == *e2 && (ECORE_EVENT_CUSTOM_1 == *e1 || ECORE_EVENT_CUSTOM_2 == *e1))
+      (*did)++;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_event_handler_cb2(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
+{
+   int *did = data;
+   (*did)++;
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_event_handler_cb3(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
+{
+   int *did = data;
+   (*did)++;
+   return EINA_TRUE;
+}
+
+static int *
+_event_new(int id)
+{
+   int *ev = malloc(sizeof(int));
+
+   switch(id)
+   {
+   case ECORE_EVENT_CUSTOM_1:
+      *ev = ECORE_EVENT_CUSTOM_1;
+      break;
+
+   case ECORE_EVENT_CUSTOM_2:
+      *ev = ECORE_EVENT_CUSTOM_2;
+      break;
+
+   default:
+      *ev = ECORE_EVENT_NONE;
+   }
+
+   return ev;
+}
+
+static void
+_event_free(void *user_data, void *func_data)
+{
+   int *did = user_data;
+   int *ev = func_data;
+
+   if (ECORE_EVENT_CUSTOM_1 == *ev || ECORE_EVENT_CUSTOM_2 == *ev)
+      (*did)++;
+
+   free(ev);
+}
+
+static void*
+_filter_start(void *data)
+{
+   int *did = data;
+   (*did)++;
+   return NULL;
+}
+
+static Eina_Bool
+_filter(void *data, void *loop_data EINA_UNUSED, int type EINA_UNUSED, void *event)
+{
+   Eina_Bool res = EINA_TRUE;
+   int *did = data;
+   int *ev = event;
+
+   if (NULL != event)
+   {
+      /* Ignore second event */
+      if (ECORE_EVENT_CUSTOM_2 == *ev)
+      {
+         res = EINA_FALSE;
+      }
+   }
+
+   (*did)++;
+
+   return res;
+}
+
+static void
+_filter_end(void *user_data, void *func_data EINA_UNUSED)
+{
+   int *did = user_data;
+   (*did)++;
 }
 
 START_TEST(ecore_test_ecore_main_loop_event)
 {
-   Eina_Bool did = EINA_FALSE;
-   Ecore_Event_Handler *handler;
+   Ecore_Event_Handler *handler, *handler2, *handler3;
+   Ecore_Event_Filter *filter_handler;
    Ecore_Event *event;
-   int ret, type;
+   int res_counter;
+   int type, type2;
+   int *ev = NULL;
+   int did = 0;
+   int filter = 0;
 
-   ret = ecore_init();
-   fail_if(ret != 1);
+   res_counter = ecore_init();
+   fail_if(res_counter != 1);
 
+   /* Create 2 new event types */
    type = ecore_event_type_new();
    fail_if(type < 1);
 
+   type2 = ecore_event_type_new();
+   fail_if(type < 1);
+
+   /* Add handler for new type of event */
    handler = ecore_event_handler_add(type, _event_handler_cb, &did);
    fail_if(handler == NULL);
 
-   event = ecore_event_add(type, NULL, NULL, NULL);
+   /* Add another handler for event which will be deleted in next step */
+   handler2 = ecore_event_handler_add(type, _event_handler_cb2, &did);
+   fail_if(handler2 == NULL);
+
+   /* Add handler for event which will be filtered */
+   handler3 = ecore_event_handler_add(type2, _event_handler_cb3, &did);
+   fail_if(handler3 == NULL);
+
+   /* Add filtering mechanism */
+   filter_handler = ecore_event_filter_add(_filter_start, _filter, _filter_end, &filter);
+
+   /* Add into main loop three events: one to process, one to filter, one to quit */
+   ev = _event_new(ECORE_EVENT_CUSTOM_1);
+   event = ecore_event_add(type, ev, _event_free, &did);
+   fail_if(event == NULL);
+
+   ev = _event_new(ECORE_EVENT_CUSTOM_2);
+   event = ecore_event_add(type2, ev, _event_free, &did);
+   fail_if(event == NULL);
+
+   event = ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL);
    fail_if(event == NULL);
 
    ecore_main_loop_begin();
 
-   fail_if(did == EINA_FALSE);
+   /*
+      Check internal fail cases:
+       event_cbx - 3 increments (4th should be ignored)
+       free      - 2 increments
+   */
+   fail_if(did != 3 + 2); // 5
 
-   ret = ecore_shutdown();
-   fail_if(ret != 0);
+   /*
+      Check filter procedures calls:
+       start  - 1 call
+       filter - 3 calls
+       end    - 1 call
+   */
+   fail_if(filter != 1 + 3 + 1); // 5
+
+   /* New loop but with new data and without filter and one callback procedure */
+   int did2 = 0;
+   filter = 0;
+
+   int *old = ecore_event_handler_data_set(handler, &did2);
+   int *new = ecore_event_handler_data_get(handler);
+
+   ecore_event_handler_del(handler2);
+   ecore_event_filter_del(filter_handler);
+
+   fail_if(*old != did);
+   fail_if(*new != did2);
+
+   ev = _event_new(ECORE_EVENT_CUSTOM_1);
+   event = ecore_event_add(type, ev, _event_free, &did2);
+   fail_if(event == NULL);
+
+   event = ecore_event_add(ECORE_EVENT_SIGNAL_EXIT, NULL, NULL, NULL);
+   fail_if(event == NULL);
+
+   ecore_main_loop_begin();
+
+   /*
+      Check internal fail cases:
+       event_cb - 2 increments in first callback (another one was deleted)
+       free     - 1 increment
+   */
+   fail_if(did2 != 2 + 1); // 3
+
+   /* Filter counter shouldn't change */
+   fail_if(filter != 0); // 0
+
+   res_counter = ecore_shutdown();
+   fail_if(res_counter != 0);
 }
 END_TEST