26ac85371d7b4aa6a23df767c2424c3281498897
[profile/ivi/eobj.git] / examples / signals / main.c
1 #include "Eo.h"
2 #include "simple.h"
3
4 #include "../eunit_tests.h"
5
6 static int cb_count = 0;
7
8 static Eina_Bool
9 _null_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info)
10 {
11    (void) desc;
12    (void) obj;
13    (void) data;
14    (void) event_info;
15    return EO_CALLBACK_CONTINUE;
16 }
17
18 static Eina_Bool
19 _a_changed_cb(void *data, Eo *obj, const Eo_Event_Description *desc, void *event_info)
20 {
21    (void) desc;
22    (void) obj;
23    int new_a = *((int *) event_info);
24    printf("%s event_info:'%d' data:'%d'\n", __func__, new_a, (int) data);
25
26    cb_count++;
27
28    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _null_cb, (void *) 23423));
29    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _null_cb, (void *) 23423));
30
31    /* Stop as we reached the 3rd one. */
32    return (cb_count != 3);
33 }
34
35 int
36 main(int argc, char *argv[])
37 {
38    (void) argc;
39    (void) argv;
40    eo_init();
41
42    Eo *obj = eo_add(SIMPLE_CLASS, NULL);
43    Simple_Public_Data *pd = eo_data_get(obj, SIMPLE_CLASS);
44
45    /* The order of these two is undetermined. */
46    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _a_changed_cb, (void *) 2));
47    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _a_changed_cb, (void *) 1));
48    /* This will be called afterwards. */
49    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_DEFAULT, _a_changed_cb, (void *) 3));
50    /* This will never be called because the previous callback returns NULL. */
51    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_AFTER, _a_changed_cb, (void *) 4));
52
53    eo_do(obj, simple_a_set(1));
54
55    fail_if(cb_count != 3);
56
57    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 3));
58    fail_if(pd->cb_count != 3);
59
60    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 12));
61    fail_if(pd->cb_count != 3);
62
63    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 4));
64    fail_if(pd->cb_count != 2);
65
66    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 2));
67    fail_if(pd->cb_count != 1);
68
69    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 1));
70    fail_if(pd->cb_count != 0);
71
72    /* Freeze/thaw. */
73    int fcount = 0;
74    cb_count = 0;
75    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _a_changed_cb, (void *) 1));
76    fail_if(pd->cb_count != 1);
77
78    eo_do(obj, eo_event_freeze_get(&fcount));
79    fail_if(fcount != 0);
80
81    eo_do(obj, eo_event_freeze());
82    eo_do(obj, eo_event_freeze_get(&fcount));
83    fail_if(fcount != 1);
84
85    eo_do(obj, eo_event_freeze());
86    eo_do(obj, eo_event_freeze_get(&fcount));
87    fail_if(fcount != 2);
88
89    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _a_changed_cb, (void *) 2));
90    fail_if(pd->cb_count != 1);
91
92    eo_do(obj, simple_a_set(2));
93    fail_if(cb_count != 0);
94    eo_do(obj, eo_event_thaw());
95    eo_do(obj, eo_event_freeze_get(&fcount));
96    fail_if(fcount != 1);
97
98    eo_do(obj, eo_event_thaw());
99    eo_do(obj, eo_event_freeze_get(&fcount));
100    fail_if(fcount != 0);
101
102    eo_do(obj, simple_a_set(3));
103    fail_if(cb_count != 2);
104
105    cb_count = 0;
106    eo_do(obj, eo_event_thaw());
107    eo_do(obj, eo_event_freeze_get(&fcount));
108    fail_if(fcount != 0);
109
110    eo_do(obj, eo_event_freeze());
111    eo_do(obj, eo_event_freeze_get(&fcount));
112    fail_if(fcount != 1);
113
114    eo_do(obj, simple_a_set(2));
115    fail_if(cb_count != 0);
116    eo_do(obj, eo_event_thaw());
117    eo_do(obj, eo_event_freeze_get(&fcount));
118    fail_if(fcount != 0);
119
120    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 1));
121    fail_if(pd->cb_count != 0);
122    eo_do(obj, eo_event_callback_del(EV_A_CHANGED, _a_changed_cb, (void *) 2));
123    fail_if(pd->cb_count != -1);
124
125    /* Global Freeze/thaw. */
126    fcount = 0;
127    cb_count = 0;
128    pd->cb_count = 0;
129    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _a_changed_cb, (void *) 1));
130    fail_if(pd->cb_count != 1);
131
132    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
133    fail_if(fcount != 0);
134
135    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze());
136    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
137    fail_if(fcount != 1);
138
139    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze());
140    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
141    fail_if(fcount != 2);
142
143    eo_do(obj, eo_event_callback_priority_add(EV_A_CHANGED, EO_CALLBACK_PRIORITY_BEFORE, _a_changed_cb, (void *) 2));
144    fail_if(pd->cb_count != 1);
145
146    eo_do(obj, simple_a_set(2));
147    fail_if(cb_count != 0);
148    eo_class_do(EO_BASE_CLASS, eo_event_global_thaw());
149    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
150    fail_if(fcount != 1);
151
152    eo_class_do(EO_BASE_CLASS, eo_event_global_thaw());
153    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
154    fail_if(fcount != 0);
155
156    eo_do(obj, simple_a_set(3));
157    fail_if(cb_count != 2);
158
159    cb_count = 0;
160    eo_class_do(EO_BASE_CLASS, eo_event_global_thaw());
161    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
162    fail_if(fcount != 0);
163
164    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze());
165    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
166    fail_if(fcount != 1);
167
168    eo_do(obj, simple_a_set(2));
169    fail_if(cb_count != 0);
170    eo_class_do(EO_BASE_CLASS, eo_event_global_thaw());
171    eo_class_do(EO_BASE_CLASS, eo_event_global_freeze_get(&fcount));
172    fail_if(fcount != 0);
173
174
175    eo_unref(obj);
176    eo_shutdown();
177    return 0;
178 }
179