diff --git a/srcs/lst/ft_lstrm.c b/srcs/lst/ft_lstrm.c new file mode 100644 index 0000000..f129f75 --- /dev/null +++ b/srcs/lst/ft_lstrm.c @@ -0,0 +1,24 @@ +#include "libft.h" + +void ft_lstrm(t_list **lst, void *data, int (*cmp)(void *, void *), void (*del)(void *)) +{ + t_list *curr = *lst; + t_list *prev = NULL; + + while (curr) + { + if (cmp(curr->data, data) == 0) + { + if (prev) + prev->next = curr->next; + else + *lst = curr->next; + if (del) + del(curr->data); + free(curr); + return; + } + prev = curr; + curr = curr->next; + } +} \ No newline at end of file diff --git a/tests/lst.c b/tests/lst.c new file mode 100644 index 0000000..bb666a0 --- /dev/null +++ b/tests/lst.c @@ -0,0 +1,182 @@ +#include "test.h" +#include "libft.h" +#include +#include + +/* Helper for comparing ints stored as void* */ +static int cmp_int(void *a, void *b) { + return (*(int*)a != *(int*)b); +} + +/* Helper for freeing ints stored as void* (no-op here, but for completeness) */ +static void del_int(void *a) { + (void)a; +} + +/* Helper for iterating: increments the int value */ +static void inc_int(void *a) { + (*(int*)a)++; +} + +/* ---- TESTS ---- */ + +TEST(test_lstnew) { + int x = 42; + t_list *node = ft_lstnew(&x); + ASSERT(node != NULL); + ASSERT(node->data == &x); + ASSERT(node->next == NULL); + free(node); +} + +TEST(test_lstpush_and_size) { + int a = 1, b = 2, c = 3; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + ft_lstpush(&lst, ft_lstnew(&c)); + ASSERT(ft_lstsize(lst) == 3); + ft_lstclear(&lst); +} + +TEST(test_lstunshift) { + int a = 1, b = 2; + t_list *lst = NULL; + ft_lstunshift(&lst, ft_lstnew(&a)); + ft_lstunshift(&lst, ft_lstnew(&b)); // b should be at head + ASSERT(lst && lst->data == &b); + ft_lstclear(&lst); +} + +TEST(test_lstpop) { + int a = 1, b = 2; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + t_list *node = ft_lstpop(&lst); + ASSERT(node && node->data == &b); + free(node); + ASSERT(ft_lstsize(lst) == 1); + ft_lstclear(&lst); +} + +TEST(test_lstshift) { + int a = 1, b = 2; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + t_list *node = ft_lstshift(&lst); + ASSERT(node && node->data == &a); + free(node); + ASSERT(ft_lstsize(lst) == 1); + ft_lstclear(&lst); +} + +TEST(test_lstclear) { + int a = 1, b = 2; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + ft_lstclear(&lst); + ASSERT(lst == NULL); +} + +TEST(test_lstreverse) { + int a = 1, b = 2, c = 3; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + ft_lstpush(&lst, ft_lstnew(&c)); // c->b->a + ft_lstreverse(&lst); // should be a->b->c + ASSERT(lst && *(int*)lst->data == 1); + ASSERT(lst->next && *(int*)lst->next->data == 2); + ASSERT(lst->next->next && *(int*)lst->next->next->data == 3); + ft_lstclear(&lst); +} + +TEST(test_lstempty) { + t_list *lst = NULL; + ASSERT(ft_lstempty(lst) == 1); + int x = 42; + lst = ft_lstnew(&x); + ASSERT(ft_lstempty(lst) == 0); + ft_lstclear(&lst); +} + +TEST(test_lstiter) { + int a = 1, b = 2, c = 3; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + ft_lstpush(&lst, ft_lstnew(&c)); + ft_lstiter(lst, inc_int); + ASSERT(a == 2 && b == 3 && c == 4); + ft_lstclear(&lst); +} + +TEST(test_lstrm) { + int a = 1, b = 2, c = 3; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + ft_lstpush(&lst, ft_lstnew(&c)); // c->b->a + ft_lstrm(&lst, &b, cmp_int, del_int); // remove b + ASSERT(ft_lstsize(lst) == 2); + ASSERT(ft_lstfind(lst, &b, cmp_int) == NULL); + ft_lstclear(&lst); +} + +TEST(test_lstfind) { + int a = 1, b = 2; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + t_list *found = ft_lstfind(lst, &b, cmp_int); + ASSERT(found && found->data == &b); + ft_lstclear(&lst); +} + +TEST(test_lstinsert) { + int a = 1, b = 2, c = 3; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); // a + ft_lstinsert(&lst, ft_lstnew(&b), 1); // a->b + ft_lstinsert(&lst, ft_lstnew(&c), 1); // a->c->b + ASSERT(ft_lstsize(lst) == 3); + ASSERT(*(int*)ft_lstget(lst, 0)->data == 1); + ASSERT(*(int*)ft_lstget(lst, 1)->data == 3); + ASSERT(*(int*)ft_lstget(lst, 2)->data == 2); + ft_lstclear(&lst); +} + +TEST(test_lstget) { + int a = 1, b = 2, c = 3; + t_list *lst = NULL; + ft_lstpush(&lst, ft_lstnew(&a)); + ft_lstpush(&lst, ft_lstnew(&b)); + ft_lstpush(&lst, ft_lstnew(&c)); // c->b->a + ASSERT(*(int*)ft_lstget(lst, 0)->data == 3); + ASSERT(*(int*)ft_lstget(lst, 1)->data == 2); + ASSERT(*(int*)ft_lstget(lst, 2)->data == 1); + ASSERT(ft_lstget(lst, 3) == NULL); + ft_lstclear(&lst); +} + +/* ---- MAIN ---- */ + +int main(void) { + RUN_TEST(test_lstnew); + RUN_TEST(test_lstpush_and_size); + RUN_TEST(test_lstunshift); + RUN_TEST(test_lstpop); + RUN_TEST(test_lstshift); + RUN_TEST(test_lstclear); + RUN_TEST(test_lstreverse); + RUN_TEST(test_lstempty); + RUN_TEST(test_lstiter); + RUN_TEST(test_lstrm); + RUN_TEST(test_lstfind); + RUN_TEST(test_lstinsert); + RUN_TEST(test_lstget); + return 0; +}