Initial commit

This commit is contained in:
2025-08-28 04:59:23 -07:00
commit 5ac6aaf900
14 changed files with 4983 additions and 0 deletions

141
test/test_list.c Normal file
View File

@ -0,0 +1,141 @@
#include "alloc.h"
#include <assert.h>
#include <refcount/list.h>
#include <string.h>
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;
}