Add some tests for function objects

This commit is contained in:
Patrick Pelissier committed 2020-05-08 11:37:38 +02:00
1 parent 1200f30695
commit e6daaf429c
1 file changed
+63
+63
View File
@@ -60,6 +60,12 @@ ALGO_DEF(algo_dict, DICT_OPLIST(dict_obj, STRING_OPLIST, TESTOBJ_OPLIST))
END_COVERAGE
ALGO_DEF(algo_dlist, LIST_OPLIST(list_int))
// Needs to be included ***AFTER*** so that the algorithms can be generated without Function Object before.
#include "m-funcobj.h"
ALGO_DEF(algo_array_fo, array_int_t)
ALGO_DEF(algo_list_fo, LIST_OPLIST(list_int))
/* Helper functions */
int g_min, g_max, g_count;
@@ -561,6 +567,62 @@ static void test_string_utf8(void)
}
}
/* Define some function objects */
FUNC_OBJ_INS_DEF(fo_test, algo_array_fo_test_obj,
(a), {
return a == self->x;
}, (x, int))
#define M_OPL_fo_test_t() FUNC_OBJ_INS_OPLIST(fo_test, int)
FUNC_OBJ_INS_DEF(fo_eq, algo_array_fo_eq_obj,
(a, b), {
return a == b && self->x != a;
}, (x, int))
#define M_OPL_fo_eq_t() FUNC_OBJ_INS_OPLIST(fo_eq, int)
FUNC_OBJ_INS_DEF(fo_cmp, algo_array_fo_cmp_obj,
(a, b), {
return a < b ? -self->x : a > b ? self->x : 0;
}, (x, int))
#define M_OPL_fo_cmp_t() FUNC_OBJ_INS_OPLIST(fo_cmp, int)
static void test_fo(void)
{
M_LET(tab, array_int_t) {
for(int i = 0; i < 10; i++)
array_int_push_back(tab, i);
array_int_push_back(tab, 5);
array_int_it_t it;
M_LET( (obj, 6), fo_test_t)
algo_array_fo_find_fo(it, tab, fo_test_as_interface(obj));
assert(!array_int_end_p(it));
M_LET( (obj, 11), fo_test_t)
algo_array_fo_find_fo(it, tab, fo_test_as_interface(obj));
assert(array_int_end_p(it));
M_LET( (obj, 11), fo_test_t)
assert( 0 == algo_array_fo_count_fo(tab, fo_test_as_interface(obj)));
M_LET( (obj, 5), fo_test_t)
assert( 2 == algo_array_fo_count_fo(tab, fo_test_as_interface(obj)));
M_LET( (obj, 3), fo_test_t)
assert( false == algo_array_fo_all_of_fo_p(tab, fo_test_as_interface(obj)));
M_LET( (obj, 3), fo_test_t)
assert( true == algo_array_fo_any_of_fo_p(tab, fo_test_as_interface(obj)));
M_LET( (obj, 3), fo_test_t)
assert( false == algo_array_fo_none_of_fo_p(tab, fo_test_as_interface(obj)));
M_LET( (obj, -1), fo_test_t)
assert( true == algo_array_fo_none_of_fo_p(tab, fo_test_as_interface(obj)));
array_int_push_back(tab, -1);
M_LET( (obj, 1), fo_cmp_t)
algo_array_fo_sort_fo(tab, fo_cmp_as_interface(obj));
M_LET ( (ref, -1, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9), array_int_t)
assert( array_int_equal_p(tab, ref));
}
}
int main(void)
{
test_list();
@@ -569,5 +631,6 @@ int main(void)
test_extract();
test_insert();
test_string_utf8();
test_fo();
exit(0);
}