summaryrefslogtreecommitdiff
path: root/src/tests/emodel/emodel_test_monitor_add.c
blob: ee8bb49021181a04bcd5175efa1cd7b10b175bd3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//Compile with:
// gcc -o emodel_test_file emodel_test_file.c `pkg-config --cflags --libs emodel`
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <Eo.h>
#include <Eio.h>
#include <Ecore.h>
#include <Emodel.h>
#include <eio_model.h>
#include <stdio.h>

#include <check.h>

#define EMODEL_TEST_FILENAME_PATH "/tmp"

Eina_Bool children_added = EINA_FALSE;

static Eina_Bool
_load_monitor_status_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info)
{
  Emodel_Load* st = event_info;
  Eo* parent = data;
  const Eina_Value* value_prop = NULL;
  const char* str = NULL;

  if (!(st->status & EMODEL_LOAD_STATUS_LOADED_PROPERTIES))
    return EINA_TRUE;

  eo_do(obj, emodel_property_get("filename", &value_prop));
  fail_if(!value_prop, "ERROR: Cannot get property!\n");

  str = eina_value_to_string(value_prop);
  fail_if(!str, "ERROR: Cannot convert value to string!\n");
  fprintf(stderr, "new children filename %s\n", str);
  if(strcmp(str, "test_file_monitor_add") == 0)
    {
      fprintf(stderr, "is child that we want\n");
      eo_do(obj, eo_event_callback_del(EMODEL_EVENT_LOAD_STATUS, _load_monitor_status_cb, data));
      children_added = EINA_TRUE;
      eo_do(parent, emodel_child_del(obj));
      ecore_main_loop_quit();
    }

    return EINA_FALSE;
}

static Eina_Bool
_children_added_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info)
{
  Emodel_Children_Event* evt = event_info;
  if (evt == NULL)
    return EINA_TRUE;

  eo_do(evt->child, eo_event_callback_add(EMODEL_EVENT_LOAD_STATUS, _load_monitor_status_cb, obj));
  eo_do(evt->child, emodel_load());

  return EINA_TRUE;
}

static Eina_Bool
_children_count_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info)
{
   unsigned int *len = event_info;
   Eina_Accessor *accessor;
   Emodel_Load_Status status;
   Eo *child;
   unsigned int i = 0;

   fprintf(stderr, "Children count number=%d\n", *len);

   /**< get full list */
   eo_do(obj, status = emodel_children_slice_get(0 ,0 ,(Eina_Accessor **)&accessor));
   if(accessor != NULL)
     {
        EINA_ACCESSOR_FOREACH(accessor, i, child) {}
        fprintf(stdout, "Got %d childs from Accessor. status=%d\n", i, status);
     }

   fclose(fopen(EMODEL_TEST_FILENAME_PATH "/test_file_monitor_add", "w+"));

   return EINA_TRUE;
}

START_TEST(emodel_test_test_monitor_add)
{
   Eo *filemodel = NULL;

   fprintf(stderr, "emodel_test_test_monitor_add\n");

   fail_if(!eina_init(), "ERROR: Cannot init Eina!\n");
   fail_if(!ecore_init(), "ERROR: Cannot init Ecore!\n");
   fail_if(!eio_init(), "ERROR: Cannot init EIO!\n");

   filemodel = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(EMODEL_TEST_FILENAME_PATH));
   fail_if(!filemodel, "ERROR: Cannot init model!\n");

   eo_do(filemodel, eo_event_callback_add(EMODEL_EVENT_CHILD_ADDED, _children_added_cb, NULL));
   eo_do(filemodel, eo_event_callback_add(EMODEL_EVENT_CHILDREN_COUNT_CHANGED, _children_count_cb, NULL));

   eo_do(filemodel, emodel_load());

   ecore_main_loop_begin();

   sleep(1); /**< EIO is asynchrounous so I must give some time for deletions to execute */

   ecore_main_loop_iterate(); /**< Give time to unlink file */

   eo_unref(filemodel);

   eio_shutdown();
   ecore_shutdown();
   eina_shutdown();

   fail_if(!children_added);
}
END_TEST

void
emodel_test_monitor_add(TCase *tc)
{
   tcase_add_test(tc, emodel_test_test_monitor_add);
}