146 lines
5.5 KiB
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;
|
|
}
|