Eobj: Rename to Eo.
[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 *wref;
73    eo_do(obj, eo_wref_add(&wref));
74    fail_if(!wref);
75
76    eo_unref(obj);
77    fail_if(wref);
78
79    obj = eo_add(SIMPLE_CLASS, NULL);
80    eo_do(obj, eo_wref_add(&wref));
81
82    eo_ref(obj);
83    fail_if(!wref);
84
85    eo_del(obj);
86    fail_if(wref);
87
88    eo_unref(obj);
89    fail_if(wref);
90
91    obj = eo_add(SIMPLE_CLASS, NULL);
92
93    eo_do(obj, eo_wref_add(&wref));
94    eo_do(obj, eo_wref_del(&wref));
95
96    eo_unref(obj);
97
98
99    eo_shutdown();
100 }
101 END_TEST
102
103 static void
104 _a_set(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED)
105 {
106    fail_if(EINA_TRUE);
107 }
108
109 static void
110 _op_errors_class_constructor(Eo_Class *klass)
111 {
112    const Eo_Op_Func_Description func_desc[] = {
113         EO_OP_FUNC(SIMPLE_ID(SIMPLE_SUB_ID_LAST), _a_set),
114         EO_OP_FUNC(SIMPLE_ID(SIMPLE_SUB_ID_LAST + 1), _a_set),
115         EO_OP_FUNC(0x0F010111, _a_set),
116         EO_OP_FUNC_SENTINEL
117    };
118
119    eo_class_funcs_set(klass, func_desc);
120 }
121
122 START_TEST(eo_op_errors)
123 {
124    eo_init();
125
126    static const Eo_Class_Description class_desc = {
127         "Simple",
128         EO_CLASS_TYPE_REGULAR,
129         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
130         NULL,
131         0,
132         NULL,
133         NULL,
134         _op_errors_class_constructor,
135         NULL
136    };
137
138    const Eo_Class *klass = eo_class_new(&class_desc, SIMPLE_CLASS, NULL);
139    fail_if(!klass);
140
141    Eo *obj = eo_add(klass, NULL);
142
143    /* Out of bounds op for a legal class. */
144    fail_if(eo_do(obj, 0x00010111));
145
146    /* Ilegal class. */
147    fail_if(eo_do(obj, 0x0F010111));
148
149    fail_if(eo_ref_get(obj) != 1);
150
151    eo_ref(obj);
152    fail_if(eo_ref_get(obj) != 2);
153
154    eo_ref(obj);
155    fail_if(eo_ref_get(obj) != 3);
156
157    eo_unref(obj);
158    fail_if(eo_ref_get(obj) != 2);
159
160    eo_unref(obj);
161    fail_if(eo_ref_get(obj) != 1);
162
163    eo_unref(obj);
164
165    obj = eo_add(SIMPLE_CLASS, NULL);
166    fail_if(!eo_do(obj, simple_a_print()));
167    fail_if(!eo_query(obj, simple_a_print()));
168    fail_if(eo_query(obj, simple_a_set(1)));
169
170    eo_shutdown();
171 }
172 END_TEST
173
174 static void
175 _fake_free_func(void *data)
176 {
177    if (!data)
178       return;
179
180    int *a = data;
181    ++*a;
182 }
183
184 START_TEST(eo_generic_data)
185 {
186    eo_init();
187    Eo *obj = eo_add(SIMPLE_CLASS, NULL);
188    void *data;
189
190    eo_do(obj, eo_base_data_set("test1", (void *) 1, NULL));
191    eo_do(obj, eo_base_data_get("test1", &data));
192    fail_if(1 != (int) data);
193    eo_do(obj, eo_base_data_del("test1"));
194    eo_do(obj, eo_base_data_get("test1", &data));
195    fail_if(data);
196
197    eo_do(obj, eo_base_data_set("test1", (void *) 1, NULL));
198    eo_do(obj, eo_base_data_set("test2", (void *) 2, NULL));
199    eo_do(obj, eo_base_data_get("test1", &data));
200    fail_if(1 != (int) data);
201    eo_do(obj, eo_base_data_get("test2", &data));
202    fail_if(2 != (int) data);
203
204    eo_do(obj, eo_base_data_get("test2", &data));
205    fail_if(2 != (int) data);
206    eo_do(obj, eo_base_data_del("test2"));
207    eo_do(obj, eo_base_data_get("test2", &data));
208    fail_if(data);
209
210    eo_do(obj, eo_base_data_get("test1", &data));
211    fail_if(1 != (int) data);
212    eo_do(obj, eo_base_data_del("test1"));
213    eo_do(obj, eo_base_data_get("test1", &data));
214    fail_if(data);
215
216    int a = 0;
217    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
218    eo_do(obj, eo_base_data_get("test3", &data));
219    fail_if(&a != data);
220    eo_do(obj, eo_base_data_get("test3", NULL));
221    eo_do(obj, eo_base_data_del("test3"));
222    fail_if(a != 1);
223
224    a = 0;
225    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
226    eo_do(obj, eo_base_data_set("test3", NULL, _fake_free_func));
227    fail_if(a != 1);
228    a = 0;
229    data = (void *) 123;
230    eo_do(obj, eo_base_data_set(NULL, &a, _fake_free_func));
231    eo_do(obj, eo_base_data_get(NULL, &data));
232    fail_if(data);
233    eo_do(obj, eo_base_data_del(NULL));
234
235    a = 0;
236    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
237    eo_do(obj, eo_base_data_set("test3", NULL, NULL));
238    fail_if(a != 1);
239    eo_do(obj, eo_base_data_set("test3", &a, _fake_free_func));
240
241    eo_unref(obj);
242    fail_if(a != 2);
243
244    eo_shutdown();
245 }
246 END_TEST
247
248 START_TEST(eo_magic_checks)
249 {
250    char buf[sizeof(long)]; /* Just enough to hold eina magic + a bit more. */
251    eo_init();
252
253    memset(buf, 1, sizeof(buf));
254    Eo *obj = eo_add((Eo_Class *) buf, NULL);
255    fail_if(obj);
256
257    obj = eo_add(SIMPLE_CLASS, (Eo *) buf);
258    fail_if(obj);
259
260    obj = eo_add(SIMPLE_CLASS, NULL);
261    fail_if(!obj);
262
263    fail_if(eo_do((Eo *) buf, EO_NOOP));
264    fail_if(eo_do_super((Eo *) buf, EO_NOOP));
265    fail_if(eo_class_get((Eo *) buf));
266    fail_if(eo_class_name_get((Eo_Class*) buf));
267    eo_class_funcs_set((Eo_Class *) buf, NULL);
268
269    fail_if(eo_class_new(NULL, (Eo_Class *) buf), NULL);
270
271    eo_xref(obj, (Eo *) buf);
272    eo_xunref(obj, (Eo *) buf);
273    eo_xref((Eo *) buf, obj);
274    eo_xunref((Eo *) buf, obj);
275
276    eo_ref((Eo *) buf);
277    eo_unref((Eo *) buf);
278
279    fail_if(0 != eo_ref_get((Eo *) buf));
280
281    Eo *wref = NULL;
282    eo_do((Eo *) buf, eo_wref_add(&wref));
283    fail_if(wref);
284
285    eo_del((Eo *) buf);
286
287    fail_if(eo_parent_get((Eo *) buf));
288
289    eo_constructor_error_set((Eo *) buf);
290    fail_if(!eo_constructor_error_get((Eo *) buf));
291
292    eo_constructor_super((Eo *) buf);
293    eo_destructor_super((Eo *) buf);
294
295    fail_if(eo_data_get((Eo *) buf, SIMPLE_CLASS));
296
297    eo_composite_object_attach((Eo *) buf, obj);
298    eo_composite_object_attach(obj, (Eo *) buf);
299    eo_composite_object_detach((Eo *) buf, obj);
300    eo_composite_object_detach(obj, (Eo *) buf);
301    eo_composite_is((Eo *) buf);
302
303    fail_if(eo_event_callback_add((Eo *) buf, NULL, NULL, NULL));
304    fail_if(eo_event_callback_del_lazy((Eo *) buf, NULL, NULL));
305    fail_if(eo_event_callback_del((Eo *) buf, NULL, NULL, NULL));
306    fail_if(eo_event_callback_call((Eo *) buf, NULL, NULL));
307
308    fail_if(eo_event_callback_forwarder_add((Eo *) buf, NULL, obj));
309    fail_if(eo_event_callback_forwarder_add(obj, NULL, (Eo *) buf));
310    fail_if(eo_event_callback_forwarder_del((Eo *) buf, NULL, obj));
311    fail_if(eo_event_callback_forwarder_del(obj, NULL, (Eo *) buf));
312
313    eo_unref(obj);
314
315    eo_shutdown();
316 }
317 END_TEST
318
319 void eo_test_general(TCase *tc)
320 {
321    tcase_add_test(tc, eo_generic_data);
322    tcase_add_test(tc, eo_op_errors);
323    tcase_add_test(tc, eo_simple);
324    tcase_add_test(tc, eo_weak_reference);
325    tcase_add_test(tc, eo_refs);
326    tcase_add_test(tc, eo_magic_checks);
327 }