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