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