#include "alloc.h" #include #include #include int main() { refcount_global_allocator = &COUNTING_ALLOCATOR; assert(refcount_list_length(NULL) == 0); refcount_list_free(NULL, counting_free); check_allocator_status(); RefcountList *l = NULL; l = refcount_list_push(l, counting_strdup("str1")); assert(!l->prev); assert(refcount_list_length(l) == 1); assert(strcmp(refcount_list_peek(l), "str1") == 0); assert(refcount_list_peek(l) == refcount_list_nth(l, 0)); l = refcount_list_push(l, counting_strdup("str2")); assert(!l->prev); assert(l == l->next->prev); assert(refcount_list_length(l) == 2); assert(strcmp(refcount_list_peek(l), "str2") == 0); assert(refcount_list_peek(l) == refcount_list_nth(l, 0)); l = refcount_list_push(l, counting_strdup("str3")); assert(refcount_list_length(l) == 3); assert(strcmp(refcount_list_peek(l), "str3") == 0); assert(refcount_list_peek(l) == refcount_list_nth(l, 0)); l = refcount_list_push_back(l, counting_strdup("str4")); assert(refcount_list_length(l) == 4); assert(strcmp(refcount_list_peek(l), "str3") == 0); assert(refcount_list_drop(l, 2) == refcount_list_drop(l, 3)->prev); assert(refcount_list_drop(l, 2) == refcount_list_drop(l, 3)->prev); assert(strcmp(refcount_list_nth(l, 0), "str3") == 0); assert(strcmp(refcount_list_nth(l, 1), "str2") == 0); assert(strcmp(refcount_list_nth(l, 2), "str1") == 0); assert(strcmp(refcount_list_nth(l, 3), "str4") == 0); assert(!refcount_list_nth(l, 4)); RefcountList *sl = refcount_list_drop(l, 2); assert(strcmp(refcount_list_nth(sl, 0), "str1") == 0); assert(strcmp(refcount_list_nth(sl, 1), "str4") == 0); sl = sl->next; l = refcount_list_remove(l, sl->prev, counting_free); assert(sl->prev == refcount_list_drop(l, 1)); assert(strcmp(refcount_list_nth(l, 0), "str3") == 0); assert(strcmp(refcount_list_nth(l, 1), "str2") == 0); assert(strcmp(refcount_list_nth(l, 2), "str4") == 0); assert(!refcount_list_nth(l, 3)); l = refcount_list_pop(l, counting_free); assert(refcount_list_length(l) == 2); assert(strcmp(refcount_list_peek(l), "str2") == 0); l = refcount_list_pop(l, counting_free); assert(refcount_list_length(l) == 1); assert(strcmp(refcount_list_peek(l), "str4") == 0); l = refcount_list_pop(l, counting_free); assert(!l); assert(refcount_list_length(l) == 0); l = refcount_list_build(5, counting_strdup("str1"), counting_strdup("str2"), counting_strdup("str3"), counting_strdup("str4"), counting_strdup("str5")); assert(refcount_list_length(l) == 5); assert(strcmp(refcount_list_nth(l, 0), "str1") == 0); assert(strcmp(refcount_list_nth(l, 1), "str2") == 0); assert(strcmp(refcount_list_nth(l, 2), "str3") == 0); assert(strcmp(refcount_list_nth(l, 3), "str4") == 0); assert(strcmp(refcount_list_nth(l, 4), "str5") == 0); RefcountList *l2 = refcount_list_copy(l, (void *) counting_strdup); refcount_list_free(l, counting_free); assert(refcount_list_length(l2) == 5); assert(strcmp(refcount_list_nth(l2, 0), "str1") == 0); assert(strcmp(refcount_list_nth(l2, 1), "str2") == 0); assert(strcmp(refcount_list_nth(l2, 2), "str3") == 0); assert(strcmp(refcount_list_nth(l2, 3), "str4") == 0); assert(strcmp(refcount_list_nth(l2, 4), "str5") == 0); l2 = refcount_list_reverse(l2); assert(refcount_list_length(l2) == 5); assert(strcmp(refcount_list_nth(l2, 0), "str5") == 0); assert(strcmp(refcount_list_nth(l2, 1), "str4") == 0); assert(strcmp(refcount_list_nth(l2, 2), "str3") == 0); assert(strcmp(refcount_list_nth(l2, 3), "str2") == 0); assert(strcmp(refcount_list_nth(l2, 4), "str1") == 0); refcount_list_free(l2, counting_free); l = refcount_list_build(2, counting_strdup("str1"), counting_strdup("str2")); l2 = refcount_list_build(2, counting_strdup("str3"), counting_strdup("str4")); l = refcount_list_join(l, l2); assert(refcount_list_length(l) == 4); assert(strcmp(refcount_list_nth(l, 0), "str1") == 0); assert(strcmp(refcount_list_nth(l, 1), "str2") == 0); assert(strcmp(refcount_list_nth(l, 2), "str3") == 0); assert(strcmp(refcount_list_nth(l, 3), "str4") == 0); sl = refcount_list_drop(l, 3); l = refcount_list_remove(l, sl, counting_free); assert(refcount_list_length(l) == 3); assert(strcmp(refcount_list_nth(l, 2), "str3") == 0); assert(!refcount_list_nth(l, 3)); refcount_list_free(l, counting_free); l = refcount_list_build(2, counting_strdup("str1"), counting_strdup("str2")); l = refcount_list_join(NULL, l); assert(refcount_list_length(l) == 2); assert(strcmp(refcount_list_nth(l, 0), "str1") == 0); assert(strcmp(refcount_list_nth(l, 1), "str2") == 0); refcount_list_free(l, counting_free); l = refcount_list_build(2, counting_strdup("str1"), counting_strdup("str2")); l = refcount_list_join(l, NULL); assert(refcount_list_length(l) == 2); assert(strcmp(refcount_list_nth(l, 0), "str1") == 0); assert(strcmp(refcount_list_nth(l, 1), "str2") == 0); refcount_list_free(l, counting_free); check_allocator_status(); return 0; }