eo2: add test cases for class construction errors
authorJérémy Zurcher <jeremy@asynk.ch>
Wed, 8 Jan 2014 10:30:44 +0000 (11:30 +0100)
committerTom Hacohen <tom@stosb.com>
Thu, 10 Apr 2014 03:20:20 +0000 (04:20 +0100)
it covers: NULL API func, overriding non-existing fct,
API redefined, dich func override.

src/tests/eo/suite/eo_test_class_errors.c

index 9f08b5e..abc839e 100644 (file)
@@ -273,9 +273,150 @@ START_TEST(eo_bad_interface)
 }
 END_TEST
 
+static void _null_fct(Eo *eo_obj EINA_UNUSED, void *d EINA_UNUSED) { }
+void null_fct (void) {}
+
+START_TEST(eo_null_api)
+{
+   eo_init();
+   eina_log_print_cb_set(_eo_test_print_cb, &ctx);
+
+   const Eo_Class *klass;
+
+   static Eo2_Op_Description op_descs[] = {
+        EO2_OP_FUNC(NULL, _null_fct, "NULL API function"),
+        EO2_OP_SENTINEL
+   };
+   static Eo_Class_Description class_desc = {
+        EO2_VERSION,
+        "Simple",
+        EO_CLASS_TYPE_REGULAR,
+        EO2_CLASS_DESCRIPTION_OPS(op_descs),
+        NULL,
+        0,
+        NULL,
+        NULL
+   };
+
+   TEST_EO_ERROR("_eo2_class_funcs_set", "Ignore %d NULL->%p '%s'. Can't set implementation for NULL API.");
+   klass = eo_class_new(&class_desc, NULL, NULL);
+   fail_if(!klass);
+   fail_unless(ctx.did);
+
+   eina_log_print_cb_set(eina_log_print_cb_stderr, NULL);
+
+   eo_shutdown();
+}
+END_TEST
+
+START_TEST(eo_wrong_override)
+{
+   eo_init();
+   eina_log_print_cb_set(_eo_test_print_cb, &ctx);
+
+   const Eo_Class *klass;
+
+   static Eo2_Op_Description op_descs[] = {
+        EO2_OP_FUNC_OVERRIDE(null_fct, _null_fct),
+        EO2_OP_SENTINEL
+   };
+   static Eo_Class_Description class_desc = {
+        EO2_VERSION,
+        "Simple",
+        EO_CLASS_TYPE_REGULAR,
+        EO2_CLASS_DESCRIPTION_OPS(op_descs),
+        NULL,
+        0,
+        NULL,
+        NULL
+   };
+
+   TEST_EO_ERROR("_eo2_class_funcs_set", "Ignore override %p->%p. Can't find api func description in class hierarchy.");
+   klass = eo_class_new(&class_desc, NULL, NULL);
+   fail_if(!klass);
+   fail_unless(ctx.did);
+
+   eina_log_print_cb_set(eina_log_print_cb_stderr, NULL);
+
+   eo_shutdown();
+}
+END_TEST
+
+START_TEST(eo_api_redefined)
+{
+   eo_init();
+   eina_log_print_cb_set(_eo_test_print_cb, &ctx);
+
+   const Eo_Class *klass;
+
+   static Eo2_Op_Description op_descs[] = {
+        EO2_OP_FUNC(null_fct, _null_fct, "API function"),
+        EO2_OP_FUNC(null_fct, NULL, "Redefining API function"),
+        EO2_OP_SENTINEL
+   };
+   static Eo_Class_Description class_desc = {
+        EO2_VERSION,
+        "Simple",
+        EO_CLASS_TYPE_REGULAR,
+        EO2_CLASS_DESCRIPTION_OPS(op_descs),
+        NULL,
+        0,
+        NULL,
+        NULL
+   };
+
+   TEST_EO_ERROR("_eo2_class_funcs_set", "API already defined %d %p->%p '%s'. Expect undefined behaviour.");
+   klass = eo_class_new(&class_desc, NULL, NULL);
+   fail_if(!klass);
+   fail_unless(ctx.did);
+
+   eina_log_print_cb_set(eina_log_print_cb_stderr, NULL);
+
+   eo_shutdown();
+}
+END_TEST
+
+START_TEST(eo_dich_func_override)
+{
+   eo_init();
+   eina_log_print_cb_set(_eo_test_print_cb, &ctx);
+
+   const Eo_Class *klass;
+
+   static Eo2_Op_Description op_descs[] = {
+        EO2_OP_FUNC_OVERRIDE(simple_a_set, _null_fct),
+        EO2_OP_FUNC_OVERRIDE(simple_a_set, NULL),
+        EO2_OP_SENTINEL
+   };
+   static Eo_Class_Description class_desc = {
+        EO2_VERSION,
+        "Simple",
+        EO_CLASS_TYPE_REGULAR,
+        EO2_CLASS_DESCRIPTION_OPS(op_descs),
+        NULL,
+        0,
+        NULL,
+        NULL
+   };
+
+   TEST_EO_ERROR("_dich_func_set", "Already set function for op %d (%s:'%s'). Overriding %p with %p.");
+   klass = eo_class_new(&class_desc, SIMPLE_CLASS, NULL);
+   fail_if(!klass);
+   fail_unless(ctx.did);
+
+   eina_log_print_cb_set(eina_log_print_cb_stderr, NULL);
+
+   eo_shutdown();
+}
+END_TEST
+
 void eo_test_class_errors(TCase *tc)
 {
    tcase_add_test(tc, eo_inherit_errors);
    tcase_add_test(tc, eo_inconsistent_mro);
    tcase_add_test(tc, eo_bad_interface);
+   tcase_add_test(tc, eo_null_api);
+   tcase_add_test(tc, eo_wrong_override);
+   tcase_add_test(tc, eo_api_redefined);
+   tcase_add_test(tc, eo_dich_func_override);
 }