Compare commits
2 commits
0863951787
...
93da2c9ca6
| Author | SHA1 | Date | |
|---|---|---|---|
| 93da2c9ca6 | |||
| b14dc557e2 |
2 changed files with 206 additions and 0 deletions
24
srcs/lst/ft_lstrm.c
Normal file
24
srcs/lst/ft_lstrm.c
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
182
tests/lst.c
Normal file
182
tests/lst.c
Normal file
|
|
@ -0,0 +1,182 @@
|
||||||
|
#include "test.h"
|
||||||
|
#include "libft.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue