Eobj: s/__UNUSED__/EINA_UNUSED/ I had no idea that exists.
[profile/ivi/eobj.git] / tests / eobj_test_class_errors.c
1 #include "config.h"
2
3 #include <stdio.h>
4
5 #include "eobj_suite.h"
6 #include "Eobj.h"
7
8 #include "class_simple.h"
9
10 START_TEST(eobj_incomplete_desc)
11 {
12    eobj_init();
13
14    const Eobj_Class *klass;
15    static Eobj_Op TMP_BASE_ID = EOBJ_NOOP;
16
17    enum {
18         TEST_SUB_ID_FOO,
19         TEST_SUB_ID_FOO2,
20         TEST_SUB_ID_LAST
21    };
22
23    static const Eobj_Op_Description op_desc[] = {
24         EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO, "i", "Foo"),
25         EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO2, "i", "Foo2"),
26         EOBJ_OP_DESCRIPTION_SENTINEL
27    };
28
29    static const Eobj_Op_Description op_desc_wrong[] = {
30         EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO2, "i", "Foo2"),
31         EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO, "i", "Foo"),
32         EOBJ_OP_DESCRIPTION_SENTINEL
33    };
34
35    /* XXX: In real life this should be const, this is just for testing. */
36    static Eobj_Class_Description class_desc = {
37         "Simple",
38         EOBJ_CLASS_TYPE_REGULAR,
39         EOBJ_CLASS_DESCRIPTION_OPS(NULL, op_desc, 1),
40         NULL,
41         0,
42         NULL,
43         NULL,
44         NULL,
45         NULL
46    };
47
48    klass = eobj_class_new(&class_desc, 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 = eobj_class_new(&class_desc, 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 = eobj_class_new(&class_desc, NULL, NULL);
61    fail_if(klass);
62
63    class_desc.ops.count = 0;
64
65    klass = eobj_class_new(&class_desc, 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 = eobj_class_new(&class_desc, NULL, NULL);
72    fail_if(klass);
73
74    class_desc.ops.descs = op_desc;
75    class_desc.name = NULL;
76
77    klass = eobj_class_new(&class_desc, NULL, NULL);
78    fail_if(klass);
79
80    class_desc.name = "Simple";
81
82
83    klass = eobj_class_new(NULL, NULL, NULL);
84    fail_if(klass);
85
86    /* Should create a class. */
87    klass = eobj_class_new(&class_desc, NULL, NULL);
88    fail_if(!klass);
89
90    (void) klass;
91
92    eobj_shutdown();
93 }
94 END_TEST
95
96 START_TEST(eobj_inherit_errors)
97 {
98    eobj_init();
99
100    const Eobj_Class *klass;
101    const Eobj_Class *klass_mixin;
102    const Eobj_Class *klass_simple;
103
104    static const Eobj_Class_Description class_desc_simple = {
105         "Simple",
106         EOBJ_CLASS_TYPE_REGULAR,
107         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
108         NULL,
109         0,
110         NULL,
111         NULL,
112         NULL,
113         NULL
114    };
115
116    static const Eobj_Class_Description class_desc_mixin = {
117         "Mixin",
118         EOBJ_CLASS_TYPE_MIXIN,
119         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
120         NULL,
121         0,
122         NULL,
123         NULL,
124         NULL,
125         NULL
126    };
127
128    static Eobj_Class_Description class_desc = {
129         "General",
130         EOBJ_CLASS_TYPE_MIXIN,
131         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
132         NULL,
133         0,
134         NULL,
135         NULL,
136         NULL,
137         NULL
138    };
139
140    klass_mixin = eobj_class_new(&class_desc_mixin, NULL, NULL);
141    fail_if(!klass_mixin);
142
143    klass_simple = eobj_class_new(&class_desc_simple, NULL, NULL);
144    fail_if(!klass_simple);
145
146    klass = eobj_class_new(&class_desc, klass_simple, NULL);
147    fail_if(klass);
148
149    class_desc.type = EOBJ_CLASS_TYPE_REGULAR;
150
151    klass = eobj_class_new(&class_desc, klass_mixin, NULL);
152    fail_if(klass);
153
154    (void) klass;
155
156    eobj_shutdown();
157 }
158 END_TEST
159
160 START_TEST(eobj_inconsistent_mro)
161 {
162    eobj_init();
163
164    const Eobj_Class *klass;
165    const Eobj_Class *klass_mixin;
166    const Eobj_Class *klass_mixin2;
167    const Eobj_Class *klass_mixin3;
168
169    static const Eobj_Class_Description class_desc_simple = {
170         "Simple",
171         EOBJ_CLASS_TYPE_REGULAR,
172         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
173         NULL,
174         0,
175         NULL,
176         NULL,
177         NULL,
178         NULL
179    };
180
181    static const Eobj_Class_Description class_desc_mixin = {
182         "Mixin",
183         EOBJ_CLASS_TYPE_MIXIN,
184         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
185         NULL,
186         0,
187         NULL,
188         NULL,
189         NULL,
190         NULL
191    };
192
193    static const Eobj_Class_Description class_desc_mixin2 = {
194         "Mixin2",
195         EOBJ_CLASS_TYPE_MIXIN,
196         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
197         NULL,
198         0,
199         NULL,
200         NULL,
201         NULL,
202         NULL
203    };
204
205    static const Eobj_Class_Description class_desc_mixin3 = {
206         "Mixin3",
207         EOBJ_CLASS_TYPE_MIXIN,
208         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
209         NULL,
210         0,
211         NULL,
212         NULL,
213         NULL,
214         NULL
215    };
216
217    klass_mixin = eobj_class_new(&class_desc_mixin, NULL, NULL);
218    fail_if(!klass_mixin);
219
220    klass_mixin2 = eobj_class_new(&class_desc_mixin2, klass_mixin, NULL);
221    fail_if(!klass_mixin2);
222
223    klass_mixin3 = eobj_class_new(&class_desc_mixin3, klass_mixin, NULL);
224    fail_if(!klass_mixin3);
225
226    klass = eobj_class_new(&class_desc_simple, EOBJ_BASE_CLASS, klass_mixin, klass_mixin2, NULL);
227    fail_if(klass);
228
229    klass = eobj_class_new(&class_desc_simple, EOBJ_BASE_CLASS, klass_mixin2, klass_mixin, NULL);
230    fail_if(!klass);
231
232    klass = eobj_class_new(&class_desc_simple, EOBJ_BASE_CLASS, klass_mixin2, klass_mixin3, NULL);
233    fail_if(!klass);
234
235    eobj_shutdown();
236 }
237 END_TEST
238
239 static void _stub_constructor(Eobj *obj EINA_UNUSED, void *data EINA_UNUSED) {}
240 static void _stub_class_constructor(Eobj_Class *klass EINA_UNUSED) {}
241
242 START_TEST(eobj_bad_interface)
243 {
244    eobj_init();
245
246    const Eobj_Class *klass;
247
248    static Eobj_Class_Description class_desc = {
249         "Interface",
250         EOBJ_CLASS_TYPE_INTERFACE,
251         EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
252         NULL,
253         10,
254         NULL,
255         NULL,
256         NULL,
257         NULL
258    };
259
260    klass = eobj_class_new(&class_desc, NULL, NULL);
261    fail_if(klass);
262
263    class_desc.data_size = 0;
264    class_desc.constructor = _stub_constructor;
265
266    klass = eobj_class_new(&class_desc, NULL, NULL);
267    fail_if(klass);
268
269    class_desc.constructor = NULL;
270    class_desc.destructor = _stub_constructor;
271
272    klass = eobj_class_new(&class_desc, NULL, NULL);
273    fail_if(klass);
274
275    class_desc.destructor = NULL;
276    class_desc.class_constructor = _stub_class_constructor;
277
278    klass = eobj_class_new(&class_desc, NULL, NULL);
279    fail_if(klass);
280
281    class_desc.class_constructor = NULL;
282    class_desc.class_destructor = _stub_class_constructor;
283
284    klass = eobj_class_new(&class_desc, NULL, NULL);
285    fail_if(klass);
286
287    class_desc.class_destructor = NULL;
288
289    klass = eobj_class_new(&class_desc, NULL, NULL);
290    fail_if(!klass);
291
292    eobj_shutdown();
293 }
294 END_TEST
295
296 void eobj_test_class_errors(TCase *tc)
297 {
298    tcase_add_test(tc, eobj_incomplete_desc);
299    tcase_add_test(tc, eobj_inherit_errors);
300    tcase_add_test(tc, eobj_inconsistent_mro);
301    tcase_add_test(tc, eobj_bad_interface);
302 }