--- a/tests/test_list.c Sat Dec 20 10:51:56 2025 +0100 +++ b/tests/test_list.c Sat Dec 20 11:08:30 2025 +0100 @@ -731,6 +731,13 @@ return left->data - right->data; } +static int test_ccmp_node(const void *l, const void *r, void *c) { + if (c == NULL || *(int*)c != 1337) return -1; + const node *left = l; + const node *right = r; + return left->data - right->data; +} + const ptrdiff_t loc_prev = offsetof(struct node, prev); const ptrdiff_t loc_next = offsetof(struct node, next); const ptrdiff_t loc_data = offsetof(struct node, data); @@ -853,6 +860,37 @@ destroy_nodes_test_data(list); } +CX_TEST(test_linked_list_find_c) { + node *list = create_nodes_test_data(4); + assign_nodes_test_data(list, 2, 4, 6, 8); + CX_TEST_DO { + int z = 1337; + size_t i = 10; + int s; + s = 2; + node *n = list; + CX_TEST_ASSERT(cx_linked_list_find_c(list, loc_next, loc_data, &s, &i, test_ccmp_int, &z) == n); + CX_TEST_ASSERT(i == 0); + n = n->next; + s = 4; + CX_TEST_ASSERT(cx_linked_list_find_c(list, loc_next, loc_data, &s, &i, test_ccmp_int, &z) == n); + CX_TEST_ASSERT(i == 1); + n = n->next; + s = 6; + CX_TEST_ASSERT(cx_linked_list_find_c(list, loc_next, loc_data, &s, &i, test_ccmp_int, &z) == n); + CX_TEST_ASSERT(i == 2); + n = n->next; + s = 8; + CX_TEST_ASSERT(cx_linked_list_find_c(list, loc_next, loc_data, &s, &i, test_ccmp_int, &z) == n); + CX_TEST_ASSERT(i == 3); + s = 10; + CX_TEST_ASSERT(cx_linked_list_find_c(list, loc_next, loc_data, &s, &i, test_ccmp_int, &z) == NULL); + s = -2; + CX_TEST_ASSERT(cx_linked_list_find_c(list, loc_next, loc_data, &s, &i, test_ccmp_int, &z) == NULL); + } + destroy_nodes_test_data(list); +} + CX_TEST(test_linked_list_compare) { void *la = create_nodes_test_data(4); void *lb = create_nodes_test_data(3); @@ -872,6 +910,26 @@ destroy_nodes_test_data(lc); } +CX_TEST(test_linked_list_compare_c) { + void *la = create_nodes_test_data(4); + void *lb = create_nodes_test_data(3); + void *lc = create_nodes_test_data(4); + assign_nodes_test_data(la, 2, 4, 6, 8); + assign_nodes_test_data(lb, 2, 4, 6); + assign_nodes_test_data(lc, 2, 4, 6, 9); + CX_TEST_DO { + int z = 1337; + CX_TEST_ASSERT(cx_linked_list_compare_c(la, lb, loc_next, loc_data, test_ccmp_int, &z) > 0); + CX_TEST_ASSERT(cx_linked_list_compare_c(lb, la, loc_next, loc_data, test_ccmp_int, &z) < 0); + CX_TEST_ASSERT(cx_linked_list_compare_c(lc, la, loc_next, loc_data, test_ccmp_int, &z) > 0); + CX_TEST_ASSERT(cx_linked_list_compare_c(la, lc, loc_next, loc_data, test_ccmp_int, &z) < 0); + CX_TEST_ASSERT(cx_linked_list_compare_c(la, la, loc_next, loc_data, test_ccmp_int, &z) == 0); + } + destroy_nodes_test_data(la); + destroy_nodes_test_data(lb); + destroy_nodes_test_data(lc); +} + CX_TEST(test_linked_list_add) { node nodes[4]; void *begin, *end; @@ -1125,6 +1183,8 @@ begin = &nodes[0]; end = &nodes[4]; CX_TEST_DO { + int z = 1337; + // insert a single node node new_node = {0}; new_node.data = 5; @@ -1143,10 +1203,10 @@ // insert a new beginning node node new_begin = {0}; new_begin.data = 1; - cx_linked_list_insert_sorted( + cx_linked_list_insert_sorted_c( &begin, &end, loc_prev, loc_next, - &new_begin, test_cmp_node + &new_begin, test_ccmp_node, &z ); CX_TEST_ASSERT(new_begin.prev == NULL); CX_TEST_ASSERT(new_begin.next == &nodes[0]); @@ -1208,6 +1268,7 @@ begin = &nodes[0]; end = &nodes[4]; CX_TEST_DO { + int z = 1337; // insert a single node node new_node = {0}; new_node.data = 5; @@ -1226,10 +1287,10 @@ // now as duplicate node new_node_dup = {0}; new_node_dup.data = 5; - CX_TEST_ASSERT(0 != cx_linked_list_insert_unique( + CX_TEST_ASSERT(0 != cx_linked_list_insert_unique_c( &begin, &end, loc_prev, loc_next, - &new_node_dup, test_cmp_node + &new_node_dup, test_ccmp_node, &z )); CX_TEST_ASSERT(new_node_dup.prev == NULL); CX_TEST_ASSERT(new_node_dup.next == NULL); @@ -3801,7 +3862,9 @@ cx_test_register(suite, test_linked_list_link_unlink); cx_test_register(suite, test_linked_list_at); cx_test_register(suite, test_linked_list_find); + cx_test_register(suite, test_linked_list_find_c); cx_test_register(suite, test_linked_list_compare); + cx_test_register(suite, test_linked_list_compare_c); cx_test_register(suite, test_linked_list_add); cx_test_register(suite, test_linked_list_prepend); cx_test_register(suite, test_linked_list_insert);