Files
refcount/test/test_list.c

146 lines
5.5 KiB
C

#include "alloc.h"
#include <assert.h>
#include <refcount/list.h>
#include <string.h>
void *counting_strdup_callback(const void *str, void *ignored) {
return counting_strdup(str);
}
int main(int argc, const char **argv) {
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, counting_strdup_callback, NULL);
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;
}