Eo: Move event callback handling to base class.
[profile/ivi/eobj.git] / tests / eo_test_general.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #include <stdio.h>
6
7 #include "eo_suite.h"
8 #include "Eo.h"
9
10 #include "class_simple.h"
11
12 START_TEST(eo_simple)
13 {
14    eo_init();
15    Eo *obj = eo_add(EO_BASE_CLASS, NULL);
16    fail_if(obj);
17
18    eo_shutdown();
19 }
20 END_TEST
21
22 START_TEST(eo_data_fetch)
23 {
24    eo_init();
25
26    /* Usually should be const, not const only for the test... */
27    static Eo_Class_Description class_desc = {
28         "Simple2",
29         EO_CLASS_TYPE_REGULAR,
30         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
31         NULL,
32         10,
33         NULL,
34         NULL,
35         NULL,
36         NULL
37    };
38
39    const Eo_Class *klass = eo_class_new(&class_desc, EO_BASE_CLASS, NULL);
40    fail_if(!klass);
41
42    Eo *obj = eo_add(klass, NULL);
43    fail_if(!obj);
44 #ifndef NDEBUG
45    fail_if(eo_data_get(obj, SIMPLE_CLASS));
46 #endif
47    eo_unref(obj);
48
49    class_desc.data_size = 0;
50    klass = eo_class_new(&class_desc, EO_BASE_CLASS, NULL);
51    fail_if(!klass);
52
53    obj = eo_add(klass, NULL);
54    fail_if(!obj);
55    fail_if(eo_data_get(obj, klass));
56    eo_unref(obj);
57
58    eo_shutdown();
59 }
60 END_TEST
61
62 START_TEST(eo_refs)
63 {
64    eo_init();
65    Eo *obj = eo_add(SIMPLE_CLASS, NULL);
66    Eo *obj2 = eo_add(SIMPLE_CLASS, NULL);
67    Eo *obj3 = eo_add(SIMPLE_CLASS, NULL);
68
69    eo_xref(obj, obj2);
70    fail_if(eo_ref_get(obj) != 2);
71    eo_xref(obj, obj3);
72    fail_if(eo_ref_get(obj) != 3);
73
74    eo_xunref(obj, obj2);
75    fail_if(eo_ref_get(obj) != 2);
76    eo_xunref(obj, obj3);
77    fail_if(eo_ref_get(obj) != 1);
78
79 #ifndef NDEBUG
80    eo_xunref(obj, obj3);
81    fail_if(eo_ref_get(obj) != 1);
82
83    eo_xref(obj, obj2);
84    fail_if(eo_ref_get(obj) != 2);
85
86    eo_xunref(obj, obj3);
87    fail_if(eo_ref_get(obj) != 2);
88
89    eo_xunref(obj, obj2);
90    fail_if(eo_ref_get(obj) != 1);
91 #endif
92
93    eo_unref(obj);
94    eo_unref(obj2);
95    eo_unref(obj3);
96
97    /* Just check it doesn't seg atm. */
98    obj = eo_add(SIMPLE_CLASS, NULL);
99    eo_ref(obj);
100    eo_del(obj);
101    eo_del(obj);
102
103    eo_shutdown();
104 }
105 END_TEST
106
107 START_TEST(eo_weak_reference)
108 {
109    eo_init();
110
111    Eo *obj = eo_add(SIMPLE_CLASS, NULL);
112    Eo *obj2 = eo_add(SIMPLE_CLASS, NULL);
113    Eo *wref, *wref2, *wref3;
114    eo_do(obj, eo_wref_add(&wref));
115    fail_if(!wref);
116
117    eo_unref(obj);
118    fail_if(wref);
119
120    obj = eo_add(SIMPLE_CLASS, NULL);
121    eo_do(obj, eo_wref_add(&wref));
122
123    eo_ref(obj);
124    fail_if(!wref);
125
126    eo_del(obj);
127    fail_if(wref);
128
129    eo_unref(obj);
130    fail_if(wref);
131
132    obj = eo_add(SIMPLE_CLASS, NULL);
133
134    eo_do(obj, eo_wref_add(&wref));
135    eo_do(obj, eo_wref_del(&wref));
136    fail_if(wref);
137
138    eo_do(obj, eo_wref_add(&wref));
139    eo_do(obj2, eo_wref_del(&wref));
140    fail_if(!wref);
141    eo_wref_del_safe(&wref);
142    fail_if(wref);
143
144    wref = obj;
145    eo_do(obj, eo_wref_del(&wref));
146    fail_if(wref);
147
148    wref = wref2 = wref3 = NULL;
149    eo_do(obj, eo_wref_add(&wref), eo_wref_add(&wref2), eo_wref_add(&wref3));
150    fail_if(!wref);
151    fail_if(!wref2);
152    fail_if(!wref3);
153    eo_do(obj, eo_wref_del(&wref), eo_wref_del(&wref2), eo_wref_del(&wref3));
154    fail_if(wref);
155    fail_if(wref2);
156    fail_if(wref3);
157
158    eo_do(obj, eo_wref_add(&wref2), eo_wref_add(&wref3));
159    wref = obj;
160    eo_do(obj, eo_wref_del(&wref));
161    fail_if(wref);
162    eo_do(obj, eo_wref_del(&wref2), eo_wref_del(&wref3));
163
164    eo_unref(obj);
165    eo_unref(obj2);
166
167
168    eo_shutdown();
169 }
170 END_TEST
171
172 static void
173 _a_set(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED)
174 {
175    fail_if(EINA_TRUE);
176 }
177
178 static void
179 _op_errors_class_constructor(Eo_Class *klass)
180 {
181    const Eo_Op_Func_Description func_desc[] = {
182         EO_OP_FUNC(SIMPLE_ID(SIMPLE_SUB_ID_LAST), _a_set),
183         EO_OP_FUNC(SIMPLE_ID(SIMPLE_SUB_ID_LAST + 1), _a_set),
184         EO_OP_FUNC(0x0F010111, _a_set),
185         EO_OP_FUNC_SENTINEL
186    };
187
188    eo_class_funcs_set(klass, func_desc);
189 }
190
191 START_TEST(eo_op_errors)
192 {
193    eo_init();
194
195    static const Eo_Class_Description class_desc = {
196         "Simple",
197         EO_CLASS_TYPE_REGULAR,
198         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
199         NULL,
200         0,
201         NULL,
202         NULL,
203         _op_errors_class_constructor,
204         NULL
205    };
206
207    const Eo_Class *klass = eo_class_new(&class_desc, SIMPLE_CLASS, NULL);
208    fail_if(!klass);
209
210    Eo *obj = eo_add(klass, NULL);
211
212    /* Out of bounds op for a legal class. */
213    fail_if(eo_do(obj, 0x00010111));
214
215    /* Ilegal class. */
216    fail_if(eo_do(obj, 0x0F010111));
217
218    fail_if(eo_ref_get(obj) != 1);
219
220    eo_ref(obj);
221    fail_if(eo_ref_get(obj) != 2);
222
223    eo_ref(obj);
224    fail_if(eo_ref_get(obj) != 3);
225
226    eo_unref(obj);
227    fail_if(eo_ref_get(obj) != 2);
228
229    eo_unref(obj);
230    fail_if(eo_ref_get(obj) != 1);
231
232    eo_unref(obj);
233
234    obj = eo_add(SIMPLE_CLASS, NULL);
235    fail_if(!eo_do(obj, simple_a_print()));
236    fail_if(!eo_query(obj, simple_a_print()));
237    fail_if(eo_query(obj, simple_a_set(1)));
238
239    eo_shutdown();
240 }
241 END_TEST
242
243 static void
244 _fake_free_func(void *data)
245 {
246    if (!data)
247       return;
248
249    int *a = data;
250    ++*a;
251 }
252
253 START_TEST(eo_generic_data)
254 {
255    eo_init();
256    Eo *obj = eo_add(SIMPLE_CLASS, NULL);
257    void *data;
258
259    eo_do(obj, eo_base_data_set("test1", (void *) 1, NULL));
260    eo_do(obj, eo_base_data_get("test1", &data));
261    fail_if(1 != (int) data);
262    eo_do(obj, eo_base_data_del("test1"));
263    eo_do(obj, eo_base_data_get("test1", &data));
264    fail_if(data);
265
266    eo_do(obj, eo_base_data_set("test1", (void *) 1, NULL));
267    eo_do(obj, eo_base_data_set("test2", (void *) 2, NULL));
268    eo_do(obj, eo_base_data_get("test1", &data));
269    fail_if(1 != (int) data);
270    eo_do(obj, eo_base_data_get("test2", &data));
271    fail_if(2 != (int) data);
272
273    eo_do(obj, eo_base_data_get("test2", &data));
274    fail_if(2 != (int) data);
275    eo_do(obj, eo_base_data_del("test2"));
276    eo_do(obj, eo_base_data_get("test2", &data));
277    fail_if(data);
278
279    eo_do(obj, eo_base_data_get("test1", &data));
280    fail_if(1 != (int) data);
281    eo_do(obj, eo_base_data_del("test1"));
282    eo_do(obj, eo_base_data_get("test1", &data));
283    fail_if(data);
284
285    int a = 0;
286    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
287    eo_do(obj, eo_base_data_get("test3", &data));
288    fail_if(&a != data);
289    eo_do(obj, eo_base_data_get("test3", NULL));
290    eo_do(obj, eo_base_data_del("test3"));
291    fail_if(a != 1);
292
293    a = 0;
294    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
295    eo_do(obj, eo_base_data_set("test3", NULL, _fake_free_func));
296    fail_if(a != 1);
297    a = 0;
298    data = (void *) 123;
299    eo_do(obj, eo_base_data_set(NULL, &a, _fake_free_func));
300    eo_do(obj, eo_base_data_get(NULL, &data));
301    fail_if(data);
302    eo_do(obj, eo_base_data_del(NULL));
303
304    a = 0;
305    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
306    eo_do(obj, eo_base_data_set("test3", NULL, NULL));
307    fail_if(a != 1);
308    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
309
310    eo_unref(obj);
311    fail_if(a != 2);
312
313    eo_shutdown();
314 }
315 END_TEST
316
317 START_TEST(eo_magic_checks)
318 {
319    char buf[sizeof(long)]; /* Just enough to hold eina magic + a bit more. */
320    eo_init();
321
322    memset(buf, 1, sizeof(buf));
323    Eo *obj = eo_add((Eo_Class *) buf, NULL);
324    fail_if(obj);
325
326    obj = eo_add(SIMPLE_CLASS, (Eo *) buf);
327    fail_if(obj);
328
329    obj = eo_add(SIMPLE_CLASS, NULL);
330    fail_if(!obj);
331
332    fail_if(eo_do((Eo *) buf, EO_NOOP));
333    fail_if(eo_do_super((Eo *) buf, EO_NOOP));
334    fail_if(eo_class_get((Eo *) buf));
335    fail_if(eo_class_name_get((Eo_Class*) buf));
336    eo_class_funcs_set((Eo_Class *) buf, NULL);
337
338    fail_if(eo_class_new(NULL, (Eo_Class *) buf), NULL);
339
340    eo_xref(obj, (Eo *) buf);
341    eo_xunref(obj, (Eo *) buf);
342    eo_xref((Eo *) buf, obj);
343    eo_xunref((Eo *) buf, obj);
344
345    eo_ref((Eo *) buf);
346    eo_unref((Eo *) buf);
347
348    fail_if(0 != eo_ref_get((Eo *) buf));
349
350    Eo *wref = NULL;
351    eo_do((Eo *) buf, eo_wref_add(&wref));
352    fail_if(wref);
353
354    eo_del((Eo *) buf);
355
356    fail_if(eo_parent_get((Eo *) buf));
357
358    eo_constructor_error_set((Eo *) buf);
359    fail_if(!eo_constructor_error_get((Eo *) buf));
360
361    eo_constructor_super((Eo *) buf);
362    eo_destructor_super((Eo *) buf);
363
364    fail_if(eo_data_get((Eo *) buf, SIMPLE_CLASS));
365
366    eo_composite_object_attach((Eo *) buf, obj);
367    eo_composite_object_attach(obj, (Eo *) buf);
368    eo_composite_object_detach((Eo *) buf, obj);
369    eo_composite_object_detach(obj, (Eo *) buf);
370    eo_composite_is((Eo *) buf);
371
372    eo_do(obj, eo_event_callback_forwarder_add(NULL, (Eo *) buf));
373    eo_do(obj, eo_event_callback_forwarder_del(NULL, (Eo *) buf));
374
375    eo_unref(obj);
376
377    eo_shutdown();
378 }
379 END_TEST
380
381 void eo_test_general(TCase *tc)
382 {
383    tcase_add_test(tc, eo_generic_data);
384    tcase_add_test(tc, eo_op_errors);
385    tcase_add_test(tc, eo_simple);
386    tcase_add_test(tc, eo_weak_reference);
387    tcase_add_test(tc, eo_refs);
388    tcase_add_test(tc, eo_magic_checks);
389    tcase_add_test(tc, eo_data_fetch);
390 }