Eo: Removed "type" property from event/op descriptions.
[profile/ivi/eobj.git] / tests / eo_test_class_errors.c
1 #include "config.h"
2
3 #include <stdio.h>
4
5 #include "eo_suite.h"
6 #include "Eo.h"
7
8 #include "class_simple.h"
9
10 START_TEST(eo_incomplete_desc)
11 {
12    eo_init();
13
14    const Eo_Class *klass;
15    static Eo_Op TMP_BASE_ID = EO_NOOP;
16
17    enum {
18         TEST_SUB_ID_FOO,
19         TEST_SUB_ID_FOO2,
20         TEST_SUB_ID_LAST
21    };
22
23    static const Eo_Op_Description op_desc[] = {
24         EO_OP_DESCRIPTION(TEST_SUB_ID_FOO, "Foo"),
25         EO_OP_DESCRIPTION(TEST_SUB_ID_FOO2, "Foo2"),
26         EO_OP_DESCRIPTION_SENTINEL
27    };
28
29    static const Eo_Op_Description op_desc_wrong[] = {
30         EO_OP_DESCRIPTION(TEST_SUB_ID_FOO2, "Foo2"),
31         EO_OP_DESCRIPTION(TEST_SUB_ID_FOO, "Foo"),
32         EO_OP_DESCRIPTION_SENTINEL
33    };
34
35    /* XXX: In real life this should be const, this is just for testing. */
36    static Eo_Class_Description class_desc = {
37         "Simple",
38         EO_CLASS_TYPE_REGULAR,
39         EO_CLASS_DESCRIPTION_OPS(NULL, op_desc, 1),
40         NULL,
41         0,
42         NULL,
43         NULL,
44         NULL,
45         NULL
46    };
47
48    klass = eo_class_new(&class_desc, 0, NULL, NULL);
49    fail_if(klass);
50
51    class_desc.ops.base_op_id = &TMP_BASE_ID;
52    class_desc.ops.descs = NULL;
53
54    klass = eo_class_new(&class_desc, 0, NULL, NULL);
55    fail_if(klass);
56
57    class_desc.ops.descs = op_desc;
58    class_desc.ops.count = TEST_SUB_ID_LAST + 1;
59
60    klass = eo_class_new(&class_desc, 0, NULL, NULL);
61    fail_if(klass);
62
63    class_desc.ops.count = 0;
64
65    klass = eo_class_new(&class_desc, 0, NULL, NULL);
66    fail_if(klass);
67
68    class_desc.ops.count = TEST_SUB_ID_LAST;
69    class_desc.ops.descs = op_desc_wrong;
70
71    klass = eo_class_new(&class_desc, 0, NULL, NULL);
72    fail_if(klass);
73
74    class_desc.ops.descs = op_desc;
75    class_desc.name = NULL;
76
77    klass = eo_class_new(&class_desc, 0, NULL, NULL);
78    fail_if(klass);
79
80    class_desc.name = "Simple";
81
82
83    klass = eo_class_new(NULL, 0, NULL, NULL);
84    fail_if(klass);
85
86    /* Should create a class. */
87    klass = eo_class_new(&class_desc, 0, NULL, NULL);
88    fail_if(!klass);
89
90    (void) klass;
91
92    eo_shutdown();
93 }
94 END_TEST
95
96 START_TEST(eo_inherit_errors)
97 {
98    eo_init();
99
100    const Eo_Class *klass;
101    const Eo_Class *klass_mixin;
102    const Eo_Class *klass_simple;
103
104    static const Eo_Class_Description class_desc_simple = {
105         "Simple",
106         EO_CLASS_TYPE_REGULAR,
107         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
108         NULL,
109         0,
110         NULL,
111         NULL,
112         NULL,
113         NULL
114    };
115
116    static const Eo_Class_Description class_desc_mixin = {
117         "Mixin",
118         EO_CLASS_TYPE_MIXIN,
119         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
120         NULL,
121         0,
122         NULL,
123         NULL,
124         NULL,
125         NULL
126    };
127
128    static Eo_Class_Description class_desc = {
129         "General",
130         EO_CLASS_TYPE_MIXIN,
131         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
132         NULL,
133         0,
134         NULL,
135         NULL,
136         NULL,
137         NULL
138    };
139
140    klass_mixin = eo_class_new(&class_desc_mixin, 0, NULL, NULL);
141    fail_if(!klass_mixin);
142
143    klass_simple = eo_class_new(&class_desc_simple, 0, NULL, NULL);
144    fail_if(!klass_simple);
145
146    klass = eo_class_new(&class_desc, 0, klass_simple, NULL);
147    fail_if(klass);
148
149    class_desc.type = EO_CLASS_TYPE_REGULAR;
150
151    klass = eo_class_new(&class_desc, 0, klass_mixin, NULL);
152    fail_if(klass);
153
154    (void) klass;
155
156    eo_shutdown();
157 }
158 END_TEST
159
160 START_TEST(eo_inconsistent_mro)
161 {
162    eo_init();
163
164    const Eo_Class *klass;
165    const Eo_Class *klass_mixin;
166    const Eo_Class *klass_mixin2;
167    const Eo_Class *klass_mixin3;
168
169    static const Eo_Class_Description class_desc_simple = {
170         "Simple",
171         EO_CLASS_TYPE_REGULAR,
172         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
173         NULL,
174         0,
175         NULL,
176         NULL,
177         NULL,
178         NULL
179    };
180
181    static const Eo_Class_Description class_desc_mixin = {
182         "Mixin",
183         EO_CLASS_TYPE_MIXIN,
184         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
185         NULL,
186         0,
187         NULL,
188         NULL,
189         NULL,
190         NULL
191    };
192
193    static const Eo_Class_Description class_desc_mixin2 = {
194         "Mixin2",
195         EO_CLASS_TYPE_MIXIN,
196         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
197         NULL,
198         0,
199         NULL,
200         NULL,
201         NULL,
202         NULL
203    };
204
205    static const Eo_Class_Description class_desc_mixin3 = {
206         "Mixin3",
207         EO_CLASS_TYPE_MIXIN,
208         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
209         NULL,
210         0,
211         NULL,
212         NULL,
213         NULL,
214         NULL
215    };
216
217    klass_mixin = eo_class_new(&class_desc_mixin, 0, NULL, NULL);
218    fail_if(!klass_mixin);
219
220    klass_mixin2 = eo_class_new(&class_desc_mixin2, 0, klass_mixin, NULL);
221    fail_if(!klass_mixin2);
222
223    klass_mixin3 = eo_class_new(&class_desc_mixin3, 0, klass_mixin, NULL);
224    fail_if(!klass_mixin3);
225
226    klass = eo_class_new(&class_desc_simple, 0, EO_BASE_CLASS, klass_mixin, klass_mixin2, NULL);
227    fail_if(klass);
228
229    klass = eo_class_new(&class_desc_simple, 0, EO_BASE_CLASS, klass_mixin2, klass_mixin, NULL);
230    fail_if(!klass);
231
232    klass = eo_class_new(&class_desc_simple, 0, EO_BASE_CLASS, klass_mixin2, klass_mixin3, NULL);
233    fail_if(!klass);
234
235    eo_shutdown();
236 }
237 END_TEST
238
239 static void _stub_constructor(Eo *obj EINA_UNUSED, void *data EINA_UNUSED) {}
240 static void _stub_class_constructor(Eo_Class *klass EINA_UNUSED) {}
241
242 START_TEST(eo_bad_interface)
243 {
244    eo_init();
245
246    const Eo_Class *klass;
247
248    static Eo_Class_Description class_desc = {
249         "Interface",
250         EO_CLASS_TYPE_INTERFACE,
251         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
252         NULL,
253         10,
254         NULL,
255         NULL,
256         NULL,
257         NULL
258    };
259
260    klass = eo_class_new(&class_desc, 0, NULL, NULL);
261    fail_if(klass);
262
263    class_desc.data_size = 0;
264    class_desc.constructor = _stub_constructor;
265
266    klass = eo_class_new(&class_desc, 0, NULL, NULL);
267    fail_if(klass);
268
269    class_desc.constructor = NULL;
270    class_desc.destructor = _stub_constructor;
271
272    klass = eo_class_new(&class_desc, 0, NULL, NULL);
273    fail_if(klass);
274
275    class_desc.destructor = NULL;
276    class_desc.class_constructor = _stub_class_constructor;
277
278    klass = eo_class_new(&class_desc, 0, NULL, NULL);
279    fail_if(klass);
280
281    class_desc.class_constructor = NULL;
282    class_desc.class_destructor = _stub_class_constructor;
283
284    klass = eo_class_new(&class_desc, 0, NULL, NULL);
285    fail_if(klass);
286
287    class_desc.class_destructor = NULL;
288
289    klass = eo_class_new(&class_desc, 0, NULL, NULL);
290    fail_if(!klass);
291
292    eo_shutdown();
293 }
294 END_TEST
295
296 static int _const_ops_counter = 0;
297
298 static void
299 _const_ops_a_set(const Eo *obj EINA_UNUSED, const void *class_data EINA_UNUSED, va_list *list)
300 {
301    int a = va_arg(*list, int);
302    (void) a;
303    _const_ops_counter++;
304 }
305
306 static void
307 _const_ops_a_print(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED)
308 {
309    _const_ops_counter++;
310 }
311
312 static void
313 _const_ops_class_hi_print(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED)
314 {
315    _const_ops_counter++;
316 }
317
318 static void
319 _const_ops_class_constructor(Eo_Class *klass)
320 {
321    const Eo_Op_Func_Description func_desc[] = {
322         EO_OP_FUNC_CONST(SIMPLE_ID(SIMPLE_SUB_ID_A_SET), (eo_op_func_type_const) _const_ops_a_set),
323         EO_OP_FUNC(SIMPLE_ID(SIMPLE_SUB_ID_A_PRINT), (eo_op_func_type) _const_ops_a_print),
324         EO_OP_FUNC_CLASS(SIMPLE_ID(SIMPLE_SUB_ID_A_SET), (eo_op_func_type_class) _const_ops_a_set),
325         EO_OP_FUNC_CLASS(SIMPLE_ID(SIMPLE_SUB_ID_A_PRINT), (eo_op_func_type_class) _const_ops_a_print),
326         EO_OP_FUNC_CONST(SIMPLE_ID(SIMPLE_SUB_ID_CLASS_HI_PRINT), (eo_op_func_type_const) _const_ops_class_hi_print),
327         EO_OP_FUNC(SIMPLE_ID(SIMPLE_SUB_ID_CLASS_HI_PRINT), (eo_op_func_type) _const_ops_class_hi_print),
328         EO_OP_FUNC_SENTINEL
329    };
330
331    eo_class_funcs_set(klass, func_desc);
332 }
333
334 START_TEST(eo_op_types)
335 {
336    eo_init();
337
338    const Eo_Class *klass;
339
340    static Eo_Class_Description class_desc = {
341         "Simple",
342         EO_CLASS_TYPE_REGULAR,
343         EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
344         NULL,
345         0,
346         NULL,
347         NULL,
348         _const_ops_class_constructor,
349         NULL
350    };
351
352    klass = eo_class_new(&class_desc, 0, SIMPLE_CLASS, NULL);
353    fail_if(!klass);
354
355    Eo *obj = eo_add(klass, NULL);
356    eo_do(obj, simple_a_set(7), simple_a_print(), simple_class_hi_print());
357    fail_if(_const_ops_counter != 0);
358
359    eo_unref(obj);
360
361    eo_shutdown();
362 }
363 END_TEST
364
365 void eo_test_class_errors(TCase *tc)
366 {
367    tcase_add_test(tc, eo_incomplete_desc);
368    tcase_add_test(tc, eo_inherit_errors);
369    tcase_add_test(tc, eo_inconsistent_mro);
370    tcase_add_test(tc, eo_bad_interface);
371    tcase_add_test(tc, eo_op_types);
372 }