#include "curlcheck.h"
#include "llist.h"
static struct curl_llist *llist;
static struct curl_llist *llist_destination;
static void test_curl_llist_dtor(void *key, void *value)
{
(void)key;
(void)value;
}
static CURLcode unit_setup(void)
{
llist = Curl_llist_alloc(test_curl_llist_dtor);
if(!llist)
return CURLE_OUT_OF_MEMORY;
llist_destination = Curl_llist_alloc(test_curl_llist_dtor);
if(!llist_destination) {
Curl_llist_destroy(llist, NULL);
return CURLE_OUT_OF_MEMORY;
}
return CURLE_OK;
}
static void unit_stop(void)
{
Curl_llist_destroy(llist, NULL);
Curl_llist_destroy(llist_destination, NULL);
}
UNITTEST_START
int unusedData_case1 = 1;
int unusedData_case2 = 2;
int unusedData_case3 = 3;
struct curl_llist_element *head;
struct curl_llist_element *element_next;
struct curl_llist_element *element_prev;
struct curl_llist_element *to_remove;
size_t llist_size = Curl_llist_count(llist);
int curlErrCode = 0;
fail_unless(llist->size == 0, "list initial size should be zero");
fail_unless(llist->head == NULL, "list head should initiate to NULL");
fail_unless(llist->tail == NULL, "list tail should intiate to NULL");
fail_unless(llist->dtor == test_curl_llist_dtor,
"list dtor shold initiate to test_curl_llist_dtor");
curlErrCode = Curl_llist_insert_next(llist, llist->head, &unusedData_case1);
if(curlErrCode == 1) {
fail_unless(Curl_llist_count(llist) == 1,
"List size should be 1 after adding a new element");
fail_unless(llist->head->ptr == &unusedData_case1,
"List size should be 1 after adding a new element");
fail_unless(llist->tail == llist->head,
"List size should be 1 after adding a new element");
curlErrCode = Curl_llist_insert_next(llist, llist->head,
&unusedData_case3);
if(curlErrCode == 1) {
fail_unless(llist->head->next->ptr == &unusedData_case3,
"the node next to head is not getting set correctly");
fail_unless(llist->tail->ptr == &unusedData_case3,
"the list tail is not getting set correctly");
}
else {
printf("skipping Curl_llist_insert_next as a non "
"success error code was returned\n");
}
curlErrCode = Curl_llist_insert_next(llist, llist->head,
&unusedData_case2);
if(curlErrCode == 1) {
fail_unless(llist->head->next->ptr == &unusedData_case2,
"the node next to head is not getting set correctly");
fail_unless(llist->tail->ptr != &unusedData_case2,
"the list tail is not getting set correctly");
}
else {
printf("skipping Curl_llist_insert_next as a non "
"success error code was returned\n");
}
}
else {
printf("skipping Curl_llist_insert_next as a non "
"success error code was returned\n");
}
head=llist->head;
abort_unless(head, "llist->head is NULL");
element_next = head->next;
llist_size = Curl_llist_count(llist);
Curl_llist_remove(llist, llist->head, NULL);
fail_unless(Curl_llist_count(llist) == (llist_size-1),
"llist size not decremented as expected");
fail_unless(llist->head == element_next,
"llist new head not modified properly");
abort_unless(llist->head, "llist->head is NULL");
fail_unless(llist->head->prev == NULL,
"new head previous not set to null");
Curl_llist_insert_next(llist, llist->head, &unusedData_case3);
llist_size = Curl_llist_count(llist);
to_remove = llist->head->next;
abort_unless(to_remove, "to_remove is NULL");
element_next = to_remove->next;
element_prev = to_remove->prev;
Curl_llist_remove(llist, to_remove, NULL);
fail_unless(element_prev->next == element_next,
"element previous->next is not being adjusted");
abort_unless(element_next, "element_next is NULL");
fail_unless(element_next->prev == element_prev,
"element next->previous is not being adjusted");
to_remove = llist->tail;
element_prev = to_remove->prev;
Curl_llist_remove(llist, to_remove, NULL);
fail_unless(llist->tail == element_prev,
"llist tail is not being adjusted when removing tail");
to_remove = llist->head;
Curl_llist_remove(llist, to_remove, NULL);
fail_unless(llist->head == NULL,
"llist head is not NULL while the llist is empty");
fail_unless(llist->tail == NULL,
"llist tail is not NULL while the llist is empty");
curlErrCode = Curl_llist_insert_next(llist, llist->head, &unusedData_case1);
abort_unless(curlErrCode == 1,
"Curl_llist_insert_next returned an error, Can't move on with test");
abort_unless(Curl_llist_count(llist) == 1,
"Number of list elements is not as expected, Aborting");
abort_unless(Curl_llist_count(llist_destination) == 0,
"Number of list elements is not as expected, Aborting");
curlErrCode = Curl_llist_move(llist, llist->head, llist_destination, NULL);
abort_unless(curlErrCode == 1,
"Curl_llist_move returned an error, Can't move on with test");
fail_unless(Curl_llist_count(llist) == 0,
"moving element from llist didn't decrement the size");
fail_unless(Curl_llist_count(llist_destination) == 1,
"moving element to llist_destination didn't increment the size");
fail_unless(llist->head == NULL,
"llist head not set to null after moving the head");
fail_unless(llist_destination->head != NULL,
"llist_destination head set to null after moving an element");
fail_unless(llist_destination->tail != NULL,
"llist_destination tail set to null after moving an element");
fail_unless(llist_destination->tail == llist_destination->tail,
"llist_destination tail doesn't equal llist_destination head");
UNITTEST_STOP