#include "config.h" #include #include "eobj_suite.h" #include "Eobj.h" #include "class_simple.h" START_TEST(eobj_incomplete_desc) { eobj_init(); const Eobj_Class *klass; static Eobj_Op TMP_BASE_ID = EOBJ_NOOP; enum { TEST_SUB_ID_FOO, TEST_SUB_ID_FOO2, TEST_SUB_ID_LAST }; static const Eobj_Op_Description op_desc[] = { EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO, "i", "Foo"), EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO2, "i", "Foo2"), EOBJ_OP_DESCRIPTION_SENTINEL }; static const Eobj_Op_Description op_desc_wrong[] = { EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO2, "i", "Foo2"), EOBJ_OP_DESCRIPTION(TEST_SUB_ID_FOO, "i", "Foo"), EOBJ_OP_DESCRIPTION_SENTINEL }; /* XXX: In real life this should be const, this is just for testing. */ static Eobj_Class_Description class_desc = { "Simple", EOBJ_CLASS_TYPE_REGULAR, EOBJ_CLASS_DESCRIPTION_OPS(NULL, op_desc, 1), NULL, 0, NULL, NULL, NULL, NULL }; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.ops.base_op_id = &TMP_BASE_ID; class_desc.ops.descs = NULL; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.ops.descs = op_desc; class_desc.ops.count = TEST_SUB_ID_LAST + 1; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.ops.count = 0; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.ops.count = TEST_SUB_ID_LAST; class_desc.ops.descs = op_desc_wrong; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.ops.descs = op_desc; class_desc.name = NULL; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.name = "Simple"; klass = eobj_class_new(NULL, NULL, NULL); fail_if(klass); /* Should create a class. */ klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(!klass); (void) klass; eobj_shutdown(); } END_TEST START_TEST(eobj_inherit_errors) { eobj_init(); const Eobj_Class *klass; const Eobj_Class *klass_mixin; const Eobj_Class *klass_simple; static const Eobj_Class_Description class_desc_simple = { "Simple", EOBJ_CLASS_TYPE_REGULAR, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; static const Eobj_Class_Description class_desc_mixin = { "Mixin", EOBJ_CLASS_TYPE_MIXIN, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; static Eobj_Class_Description class_desc = { "General", EOBJ_CLASS_TYPE_MIXIN, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; klass_mixin = eobj_class_new(&class_desc_mixin, NULL, NULL); fail_if(!klass_mixin); klass_simple = eobj_class_new(&class_desc_simple, NULL, NULL); fail_if(!klass_simple); klass = eobj_class_new(&class_desc, klass_simple, NULL); fail_if(klass); class_desc.type = EOBJ_CLASS_TYPE_REGULAR; klass = eobj_class_new(&class_desc, klass_mixin, NULL); fail_if(klass); (void) klass; eobj_shutdown(); } END_TEST START_TEST(eobj_inconsistent_mro) { eobj_init(); const Eobj_Class *klass; const Eobj_Class *klass_mixin; const Eobj_Class *klass_mixin2; const Eobj_Class *klass_mixin3; static const Eobj_Class_Description class_desc_simple = { "Simple", EOBJ_CLASS_TYPE_REGULAR, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; static const Eobj_Class_Description class_desc_mixin = { "Mixin", EOBJ_CLASS_TYPE_MIXIN, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; static const Eobj_Class_Description class_desc_mixin2 = { "Mixin2", EOBJ_CLASS_TYPE_MIXIN, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; static const Eobj_Class_Description class_desc_mixin3 = { "Mixin3", EOBJ_CLASS_TYPE_MIXIN, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 0, NULL, NULL, NULL, NULL }; klass_mixin = eobj_class_new(&class_desc_mixin, NULL, NULL); fail_if(!klass_mixin); klass_mixin2 = eobj_class_new(&class_desc_mixin2, klass_mixin, NULL); fail_if(!klass_mixin2); klass_mixin3 = eobj_class_new(&class_desc_mixin3, klass_mixin, NULL); fail_if(!klass_mixin3); klass = eobj_class_new(&class_desc_simple, EOBJ_BASE_CLASS, klass_mixin, klass_mixin2, NULL); fail_if(klass); klass = eobj_class_new(&class_desc_simple, EOBJ_BASE_CLASS, klass_mixin2, klass_mixin, NULL); fail_if(!klass); klass = eobj_class_new(&class_desc_simple, EOBJ_BASE_CLASS, klass_mixin2, klass_mixin3, NULL); fail_if(!klass); eobj_shutdown(); } END_TEST static void _stub_constructor(Eobj *obj __UNUSED__, void *data __UNUSED__) {} static void _stub_class_constructor(Eobj_Class *klass __UNUSED__) {} START_TEST(eobj_bad_interface) { eobj_init(); const Eobj_Class *klass; static Eobj_Class_Description class_desc = { "Interface", EOBJ_CLASS_TYPE_INTERFACE, EOBJ_CLASS_DESCRIPTION_OPS(NULL, NULL, 0), NULL, 10, NULL, NULL, NULL, NULL }; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.data_size = 0; class_desc.constructor = _stub_constructor; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.constructor = NULL; class_desc.destructor = _stub_constructor; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.destructor = NULL; class_desc.class_constructor = _stub_class_constructor; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.class_constructor = NULL; class_desc.class_destructor = _stub_class_constructor; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(klass); class_desc.class_destructor = NULL; klass = eobj_class_new(&class_desc, NULL, NULL); fail_if(!klass); eobj_shutdown(); } END_TEST void eobj_test_class_errors(TCase *tc) { tcase_add_test(tc, eobj_incomplete_desc); tcase_add_test(tc, eobj_inherit_errors); tcase_add_test(tc, eobj_inconsistent_mro); tcase_add_test(tc, eobj_bad_interface); }