@ -8,9 +8,71 @@
# include "eo_suite.h"
# include "eo_test_class_simple.h"
struct log_ctx {
const char * msg ;
const char * fnc ;
Eina_Bool did ;
int expected_level ;
} ;
static struct log_ctx ctx ;
static void
_eo_test_print_cb ( const Eina_Log_Domain * d , Eina_Log_Level level , const char * file , const char * fnc , int line , const char * fmt , void * data , va_list args EINA_UNUSED )
{
struct log_ctx * myctx = data ;
ck_assert_int_eq ( level , myctx - > expected_level ) ;
if ( myctx - > msg )
ck_assert_str_eq ( myctx - > msg , fmt ) ;
ck_assert_str_eq ( myctx - > fnc , fnc ) ;
myctx - > did = EINA_TRUE ;
# ifdef SHOW_LOG
eina_log_print_cb_stderr ( d , level , file , fnc , line , fmt , NULL , args ) ;
# else
( void ) d ;
( void ) file ;
( void ) line ;
# endif
}
static void
_eo_test_safety_print_cb ( const Eina_Log_Domain * d , Eina_Log_Level level , const char * file , const char * fnc , int line , const char * fmt , void * data , va_list args EINA_UNUSED )
{
struct log_ctx * myctx = data ;
va_list cp_args ;
const char * str ;
va_copy ( cp_args , args ) ;
str = va_arg ( cp_args , const char * ) ;
va_end ( cp_args ) ;
ck_assert_int_eq ( level , myctx - > expected_level ) ;
ck_assert_str_eq ( fmt , " %s " ) ;
ck_assert_str_eq ( myctx - > msg , str ) ;
ck_assert_str_eq ( myctx - > fnc , fnc ) ;
myctx - > did = EINA_TRUE ;
# ifdef SHOW_LOG
eina_log_print_cb_stderr ( d , level , file , fnc , line , fmt , NULL , args ) ;
# else
( void ) d ;
( void ) file ;
( void ) line ;
# endif
}
# define TEST_EO_ERROR(fn, _msg) \
ctx . msg = _msg ; \
ctx . fnc = fn ; \
ctx . did = EINA_FALSE ; \
ctx . expected_level = EINA_LOG_LEVEL_ERR
START_TEST ( eo_incomplete_desc )
{
eo_init ( ) ;
eina_log_print_cb_set ( _eo_test_print_cb , & ctx ) ;
const Eo_Class * klass ;
static Eo_Op TMP_BASE_ID = EO_NOOP ;
@ -45,49 +107,66 @@ START_TEST(eo_incomplete_desc)
NULL
} ;
TEST_EO_ERROR ( " _eo_class_check_op_descs " , " Class '%s' has a non-zero ops count, but base_id is NULL. " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . ops . base_op_id = & TMP_BASE_ID ;
class_desc . ops . descs = NULL ;
TEST_EO_ERROR ( " _eo_class_check_op_descs " , " Class '%s' has a non-zero ops count, but there are no descs. " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . ops . descs = op_desc ;
class_desc . ops . count = TEST_SUB_ID_LAST + 1 ;
TEST_EO_ERROR ( " _eo_class_check_op_descs " , " Found too few Ops description for class '%s'. Expected %lx descriptions, but found %lx. " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . ops . count = 0 ;
TEST_EO_ERROR ( " _eo_class_check_op_descs " , " Found extra Ops description for class '%s'. Expected %lu descriptions, but found more. " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . ops . count = TEST_SUB_ID_LAST ;
class_desc . ops . descs = op_desc_wrong ;
TEST_EO_ERROR ( " _eo_class_check_op_descs " , " Wrong order in Ops description for class '%s'. Expected %lx and got %lx " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . ops . descs = op_desc ;
class_desc . name = NULL ;
eina_log_print_cb_set ( _eo_test_safety_print_cb , & ctx ) ;
TEST_EO_ERROR ( " eo_class_new " , " safety check failed: desc->name == NULL " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . name = " Simple " ;
TEST_EO_ERROR ( " eo_class_new " , " safety check failed: desc == NULL " ) ;
klass = eo_class_new ( NULL , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
/* Should create a class. */
klass = eo_class_new ( & class_desc , EO_BASE_CLASS , NULL ) ;
fail_if ( ! klass ) ;
( void ) klass ;
eina_log_print_cb_set ( eina_log_print_cb_stderr , NULL ) ;
eo_shutdown ( ) ;
}
@ -96,6 +175,7 @@ END_TEST
START_TEST ( eo_inherit_errors )
{
eo_init ( ) ;
eina_log_print_cb_set ( _eo_test_print_cb , & ctx ) ;
const Eo_Class * klass ;
const Eo_Class * klass_mixin ;
@ -140,15 +220,20 @@ START_TEST(eo_inherit_errors)
klass_simple = eo_class_new ( & class_desc_simple , EO_BASE_CLASS , NULL ) ;
fail_if ( ! klass_simple ) ;
TEST_EO_ERROR ( " eo_class_new " , " Non-regular classes ('%s') aren't allowed to inherit from regular classes ('%s'). " ) ;
klass = eo_class_new ( & class_desc , klass_simple , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . type = EO_CLASS_TYPE_REGULAR ;
TEST_EO_ERROR ( " eo_class_new " , " Regular classes ('%s') aren't allowed to inherit from non-regular classes ('%s'). " ) ;
klass = eo_class_new ( & class_desc , klass_mixin , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
( void ) klass ;
eina_log_print_cb_set ( eina_log_print_cb_stderr , NULL ) ;
eo_shutdown ( ) ;
}
@ -157,6 +242,7 @@ END_TEST
START_TEST ( eo_inconsistent_mro )
{
eo_init ( ) ;
eina_log_print_cb_set ( _eo_test_print_cb , & ctx ) ;
const Eo_Class * klass ;
const Eo_Class * klass_mixin ;
@ -216,8 +302,10 @@ START_TEST(eo_inconsistent_mro)
klass_mixin3 = eo_class_new ( & class_desc_mixin3 , klass_mixin , NULL ) ;
fail_if ( ! klass_mixin3 ) ;
TEST_EO_ERROR ( " _eo_class_mro_add " , " Cannot create a consistent method resolution order for class '%s' because of '%s'. " ) ;
klass = eo_class_new ( & class_desc_simple , EO_BASE_CLASS , klass_mixin , klass_mixin2 , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
klass = eo_class_new ( & class_desc_simple , EO_BASE_CLASS , klass_mixin2 , klass_mixin , NULL ) ;
fail_if ( ! klass ) ;
@ -225,6 +313,8 @@ START_TEST(eo_inconsistent_mro)
klass = eo_class_new ( & class_desc_simple , EO_BASE_CLASS , klass_mixin2 , klass_mixin3 , NULL ) ;
fail_if ( ! klass ) ;
eina_log_print_cb_set ( eina_log_print_cb_stderr , NULL ) ;
eo_shutdown ( ) ;
}
END_TEST
@ -234,6 +324,7 @@ static void _stub_class_constructor(Eo_Class *klass EINA_UNUSED) {}
START_TEST ( eo_bad_interface )
{
eo_init ( ) ;
eina_log_print_cb_set ( _eo_test_safety_print_cb , & ctx ) ;
const Eo_Class * klass ;
@ -248,8 +339,10 @@ START_TEST(eo_bad_interface)
NULL
} ;
TEST_EO_ERROR ( " eo_class_new " , " safety check failed: !desc->data_size is false " ) ;
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( klass ) ;
fail_unless ( ctx . did ) ;
class_desc . data_size = 0 ;
class_desc . class_constructor = _stub_class_constructor ;
@ -268,6 +361,8 @@ START_TEST(eo_bad_interface)
klass = eo_class_new ( & class_desc , NULL , NULL ) ;
fail_if ( ! klass ) ;
eina_log_print_cb_set ( eina_log_print_cb_stderr , NULL ) ;
eo_shutdown ( ) ;
}
END_TEST
@ -313,6 +408,7 @@ _const_ops_class_constructor(Eo_Class *klass)
START_TEST ( eo_op_types )
{
eo_init ( ) ;
eina_log_print_cb_set ( _eo_test_print_cb , & ctx ) ;
const Eo_Class * klass ;
@ -327,15 +423,20 @@ START_TEST(eo_op_types)
NULL
} ;
TEST_EO_ERROR ( " eo_class_funcs_set " , " Set function's op type (%x) is different than the one in the op description (%d) for op '%s:%s'. Func index: %lu " ) ;
klass = eo_class_new ( & class_desc , SIMPLE_CLASS , NULL ) ;
fail_if ( ! klass ) ;
TEST_EO_ERROR ( " eo_class_name_get " , NULL ) ;
ctx . expected_level = EINA_LOG_LEVEL_CRITICAL ;
/* Add class checks here... */
Eo * obj = eo_add ( klass , NULL ) ;
eo_do ( obj , simple_a_set ( 7 ) , simple_a_print ( ) , simple_class_hi_print ( ) ) ;
eo_unref ( obj ) ;
eina_log_print_cb_set ( eina_log_print_cb_stderr , NULL ) ;
eo_shutdown ( ) ;
}
END_TEST