Eobj: Enforce some interface restrictions.
authortasn <tasn>
Thu, 19 Apr 2012 11:30:10 +0000 (11:30 +0000)
committertasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 19 Apr 2012 11:30:10 +0000 (11:30 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/PROTO/eobj@70330 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

lib/eobj.c
tests/eobj_test_class_errors.c

index 0fe83b4..6a8354d 100644 (file)
@@ -685,7 +685,7 @@ eobj_class_new(const Eobj_Class_Description *desc, const Eobj_Class *parent, ...
      { \
         if (!x) \
           { \
-             ERR("%s must not be NULL! Aborting.", #x); \
+             ERR("'%s' must not be False! Aborting.", #x); \
              return NULL; \
           } \
      } \
@@ -694,6 +694,16 @@ eobj_class_new(const Eobj_Class_Description *desc, const Eobj_Class *parent, ...
    _CLS_NEW_CHECK(desc);
    _CLS_NEW_CHECK(desc->name);
 
+   /* Check restrictions on Interface types. */
+   if (desc->type == EOBJ_CLASS_TYPE_INTERFACE)
+     {
+        _CLS_NEW_CHECK(!desc->constructor);
+        _CLS_NEW_CHECK(!desc->destructor);
+        _CLS_NEW_CHECK(!desc->class_constructor);
+        _CLS_NEW_CHECK(!desc->class_destructor);
+        _CLS_NEW_CHECK(!desc->data_size);
+     }
+
    klass = calloc(1, sizeof(Eobj_Class));
    klass->parent = parent;
 
index 864a748..0574f45 100644 (file)
@@ -1,6 +1,4 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
 
 #include <stdio.h>
 
@@ -238,9 +236,67 @@ START_TEST(eobj_inconsistent_mro)
 }
 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);
 }