8 #include "class_simple.h"
10 START_TEST(eo_incomplete_desc)
14 const Eo_Class *klass;
15 static Eo_Op TMP_BASE_ID = EO_NOOP;
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
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
35 /* XXX: In real life this should be const, this is just for testing. */
36 static Eo_Class_Description class_desc = {
38 EO_CLASS_TYPE_REGULAR,
39 EO_CLASS_DESCRIPTION_OPS(NULL, op_desc, 1),
48 klass = eo_class_new(&class_desc, 0, NULL, NULL);
51 class_desc.ops.base_op_id = &TMP_BASE_ID;
52 class_desc.ops.descs = NULL;
54 klass = eo_class_new(&class_desc, 0, NULL, NULL);
57 class_desc.ops.descs = op_desc;
58 class_desc.ops.count = TEST_SUB_ID_LAST + 1;
60 klass = eo_class_new(&class_desc, 0, NULL, NULL);
63 class_desc.ops.count = 0;
65 klass = eo_class_new(&class_desc, 0, NULL, NULL);
68 class_desc.ops.count = TEST_SUB_ID_LAST;
69 class_desc.ops.descs = op_desc_wrong;
71 klass = eo_class_new(&class_desc, 0, NULL, NULL);
74 class_desc.ops.descs = op_desc;
75 class_desc.name = NULL;
77 klass = eo_class_new(&class_desc, 0, NULL, NULL);
80 class_desc.name = "Simple";
83 klass = eo_class_new(NULL, 0, NULL, NULL);
86 /* Should create a class. */
87 klass = eo_class_new(&class_desc, 0, NULL, NULL);
96 START_TEST(eo_inherit_errors)
100 const Eo_Class *klass;
101 const Eo_Class *klass_mixin;
102 const Eo_Class *klass_simple;
104 static const Eo_Class_Description class_desc_simple = {
106 EO_CLASS_TYPE_REGULAR,
107 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
116 static const Eo_Class_Description class_desc_mixin = {
119 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
128 static Eo_Class_Description class_desc = {
131 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
140 klass_mixin = eo_class_new(&class_desc_mixin, 0, NULL, NULL);
141 fail_if(!klass_mixin);
143 klass_simple = eo_class_new(&class_desc_simple, 0, NULL, NULL);
144 fail_if(!klass_simple);
146 klass = eo_class_new(&class_desc, 0, klass_simple, NULL);
149 class_desc.type = EO_CLASS_TYPE_REGULAR;
151 klass = eo_class_new(&class_desc, 0, klass_mixin, NULL);
160 START_TEST(eo_inconsistent_mro)
164 const Eo_Class *klass;
165 const Eo_Class *klass_mixin;
166 const Eo_Class *klass_mixin2;
167 const Eo_Class *klass_mixin3;
169 static const Eo_Class_Description class_desc_simple = {
171 EO_CLASS_TYPE_REGULAR,
172 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
181 static const Eo_Class_Description class_desc_mixin = {
184 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
193 static const Eo_Class_Description class_desc_mixin2 = {
196 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
205 static const Eo_Class_Description class_desc_mixin3 = {
208 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
217 klass_mixin = eo_class_new(&class_desc_mixin, 0, NULL, NULL);
218 fail_if(!klass_mixin);
220 klass_mixin2 = eo_class_new(&class_desc_mixin2, 0, klass_mixin, NULL);
221 fail_if(!klass_mixin2);
223 klass_mixin3 = eo_class_new(&class_desc_mixin3, 0, klass_mixin, NULL);
224 fail_if(!klass_mixin3);
226 klass = eo_class_new(&class_desc_simple, 0, EO_BASE_CLASS, klass_mixin, klass_mixin2, NULL);
229 klass = eo_class_new(&class_desc_simple, 0, EO_BASE_CLASS, klass_mixin2, klass_mixin, NULL);
232 klass = eo_class_new(&class_desc_simple, 0, EO_BASE_CLASS, klass_mixin2, klass_mixin3, NULL);
239 static void _stub_constructor(Eo *obj EINA_UNUSED, void *data EINA_UNUSED) {}
240 static void _stub_class_constructor(Eo_Class *klass EINA_UNUSED) {}
242 START_TEST(eo_bad_interface)
246 const Eo_Class *klass;
248 static Eo_Class_Description class_desc = {
250 EO_CLASS_TYPE_INTERFACE,
251 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
260 klass = eo_class_new(&class_desc, 0, NULL, NULL);
263 class_desc.data_size = 0;
264 class_desc.constructor = _stub_constructor;
266 klass = eo_class_new(&class_desc, 0, NULL, NULL);
269 class_desc.constructor = NULL;
270 class_desc.destructor = _stub_constructor;
272 klass = eo_class_new(&class_desc, 0, NULL, NULL);
275 class_desc.destructor = NULL;
276 class_desc.class_constructor = _stub_class_constructor;
278 klass = eo_class_new(&class_desc, 0, NULL, NULL);
281 class_desc.class_constructor = NULL;
282 class_desc.class_destructor = _stub_class_constructor;
284 klass = eo_class_new(&class_desc, 0, NULL, NULL);
287 class_desc.class_destructor = NULL;
289 klass = eo_class_new(&class_desc, 0, NULL, NULL);
296 static int _const_ops_counter = 0;
299 _const_ops_a_set(const Eo *obj EINA_UNUSED, const void *class_data EINA_UNUSED, va_list *list)
301 int a = va_arg(*list, int);
303 _const_ops_counter++;
307 _const_ops_a_print(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED)
309 _const_ops_counter++;
313 _const_ops_class_hi_print(Eo *obj EINA_UNUSED, void *class_data EINA_UNUSED, va_list *list EINA_UNUSED)
315 _const_ops_counter++;
319 _const_ops_class_constructor(Eo_Class *klass)
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),
331 eo_class_funcs_set(klass, func_desc);
334 START_TEST(eo_op_types)
338 const Eo_Class *klass;
340 static Eo_Class_Description class_desc = {
342 EO_CLASS_TYPE_REGULAR,
343 EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
348 _const_ops_class_constructor,
352 klass = eo_class_new(&class_desc, 0, SIMPLE_CLASS, NULL);
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);
365 void eo_test_class_errors(TCase *tc)
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);