diff options
| -rw-r--r-- | include/test.h | 23 | ||||
| -rw-r--r-- | tests/linked_list.c | 146 | 
2 files changed, 96 insertions, 73 deletions
diff --git a/include/test.h b/include/test.h new file mode 100644 index 0000000..64716cc --- /dev/null +++ b/include/test.h @@ -0,0 +1,23 @@ +#ifndef _TEST_H +#define _TEST_H + +char *__curtestname = "<none>"; + +#define test_run(func)                      \ +	do {                                \ +		char *orig = __curtestname; \ +		__curtestname = #func;      \ +		func();                     \ +		__curtestname = orig;       \ +	} while (0) + +#define test_assert(cond)                                                                          \ +	do {                                                                                       \ +		if (!(cond)) {                                                                     \ +			fprintf(stderr, "%s:%d: %s: test_assert failed: %s\n", __FILE__, __LINE__, \ +				__curtestname, #cond);                                             \ +			abort();                                                                   \ +		}                                                                                  \ +	} while (0) + +#endif diff --git a/tests/linked_list.c b/tests/linked_list.c index 71322b8..6d7a995 100644 --- a/tests/linked_list.c +++ b/tests/linked_list.c @@ -1,9 +1,9 @@ -#include <assert.h>  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include "linked_list.h" +#include "test.h"  struct list_elem {  	struct linked_list link; @@ -15,10 +15,10 @@ static void test_linked_list_init(void) {  	linked_list_init(&list);  	// Both next and prev should point to self -	assert(list.next == &list && list.prev == &list); +	test_assert(list.next == &list && list.prev == &list);  	// The list should be empty -	assert(linked_list_empty(&list)); +	test_assert(linked_list_empty(&list));  }  static void test_linked_list_single_insert(void) { @@ -29,14 +29,14 @@ static void test_linked_list_single_insert(void) {  	linked_list_insert(&list, &elem1.link);  	// Both next and prev on list should point to the elem -	assert(list.next == &elem1.link && list.prev == &elem1.link); +	test_assert(list.next == &elem1.link && list.prev == &elem1.link);  	// Both next and prev on elem should point to the list -	assert(elem1.link.next == &list && elem1.link.prev == &list); +	test_assert(elem1.link.next == &list && elem1.link.prev == &list);  	// The list and element should not be empty -	assert(!linked_list_empty(&list)); -	assert(!linked_list_empty(&elem1.link)); +	test_assert(!linked_list_empty(&list)); +	test_assert(!linked_list_empty(&elem1.link));  }  static void test_linked_list_single_remove(void) { @@ -48,13 +48,13 @@ static void test_linked_list_single_remove(void) {  	linked_list_remove(&elem1.link);  	// Both next and prev on elem be NULL -	assert(elem1.link.next == NULL && elem1.link.prev == NULL); +	test_assert(elem1.link.next == NULL && elem1.link.prev == NULL);  	// Both next and prev should point to self -	assert(list.next == &list && list.prev == &list); +	test_assert(list.next == &list && list.prev == &list);  	// The list should be empty -	assert(linked_list_empty(&list)); +	test_assert(linked_list_empty(&list));  }  static void test_linked_list_alternate_remove(void) { @@ -66,13 +66,13 @@ static void test_linked_list_alternate_remove(void) {  	linked_list_remove(&list);  	// Both next and prev on list be NULL -	assert(list.next == NULL && list.prev == NULL); +	test_assert(list.next == NULL && list.prev == NULL);  	// Both next and prev should point to self -	assert(elem1.link.next == &elem1.link && elem1.link.prev == &elem1.link); +	test_assert(elem1.link.next == &elem1.link && elem1.link.prev == &elem1.link);  	// The elem should be empty -	assert(linked_list_empty(&elem1.link)); +	test_assert(linked_list_empty(&elem1.link));  }  static void test_linked_list_sequential_remove(void) { @@ -85,35 +85,35 @@ static void test_linked_list_sequential_remove(void) {  	linked_list_insert(&elem2.link, &elem3.link);  	// The order should now be list→elem1→elem2→elem3→list -	assert(list.next == &elem1.link && list.prev == &elem3.link); -	assert(elem1.link.next == &elem2.link && elem1.link.prev == &list); -	assert(elem2.link.next == &elem3.link && elem2.link.prev == &elem1.link); -	assert(elem3.link.next == &list && elem3.link.prev == &elem2.link); +	test_assert(list.next == &elem1.link && list.prev == &elem3.link); +	test_assert(elem1.link.next == &elem2.link && elem1.link.prev == &list); +	test_assert(elem2.link.next == &elem3.link && elem2.link.prev == &elem1.link); +	test_assert(elem3.link.next == &list && elem3.link.prev == &elem2.link);  	linked_list_remove(list.next);  	// The order should now be list→elem2→elem3→list -	assert(list.next == &elem2.link && list.prev == &elem3.link); -	assert(elem2.link.next == &elem3.link && elem2.link.prev == &list); -	assert(elem3.link.next == &list && elem3.link.prev == &elem2.link); -	assert(elem1.link.next == NULL && elem1.link.prev == NULL); +	test_assert(list.next == &elem2.link && list.prev == &elem3.link); +	test_assert(elem2.link.next == &elem3.link && elem2.link.prev == &list); +	test_assert(elem3.link.next == &list && elem3.link.prev == &elem2.link); +	test_assert(elem1.link.next == NULL && elem1.link.prev == NULL);  	linked_list_remove(list.next);  	// The order should now be list→elem3→list -	assert(list.next == &elem3.link && list.prev == &elem3.link); -	assert(elem3.link.next == &list && elem3.link.prev == &list); -	assert(elem1.link.next == NULL && elem1.link.prev == NULL); -	assert(elem2.link.next == NULL && elem2.link.prev == NULL); +	test_assert(list.next == &elem3.link && list.prev == &elem3.link); +	test_assert(elem3.link.next == &list && elem3.link.prev == &list); +	test_assert(elem1.link.next == NULL && elem1.link.prev == NULL); +	test_assert(elem2.link.next == NULL && elem2.link.prev == NULL);  	linked_list_remove(list.next);  	// The list should now be empty -	assert(elem1.link.next == NULL && elem1.link.prev == NULL); -	assert(elem2.link.next == NULL && elem2.link.prev == NULL); -	assert(elem3.link.next == NULL && elem3.link.prev == NULL); -	assert(list.next == &list && list.prev == &list); -	assert(linked_list_empty(&list)); +	test_assert(elem1.link.next == NULL && elem1.link.prev == NULL); +	test_assert(elem2.link.next == NULL && elem2.link.prev == NULL); +	test_assert(elem3.link.next == NULL && elem3.link.prev == NULL); +	test_assert(list.next == &list && list.prev == &list); +	test_assert(linked_list_empty(&list));  }  static void test_linked_list_insert_after(void) { @@ -126,10 +126,10 @@ static void test_linked_list_insert_after(void) {  	linked_list_insert(&elem1.link, &elem2.link);  	// The order should now be list→elem1→elem2→elem3→list -	assert(list.next == &elem1.link && list.prev == &elem3.link); -	assert(elem1.link.next == &elem2.link && elem1.link.prev == &list); -	assert(elem2.link.next == &elem3.link && elem2.link.prev == &elem1.link); -	assert(elem3.link.next == &list && elem3.link.prev == &elem2.link); +	test_assert(list.next == &elem1.link && list.prev == &elem3.link); +	test_assert(elem1.link.next == &elem2.link && elem1.link.prev == &list); +	test_assert(elem2.link.next == &elem3.link && elem2.link.prev == &elem1.link); +	test_assert(elem3.link.next == &list && elem3.link.prev == &elem2.link);  }  static void test_linked_list_remove_loop(void) { @@ -147,13 +147,13 @@ static void test_linked_list_remove_loop(void) {  		linked_list_remove(&elem->link);  		cnt++;  	} -	assert(cnt == 3); +	test_assert(cnt == 3);  	// Link should now be empty, and next and prev on all elements hsould be NULL -	assert(linked_list_empty(&list)); -	assert(elem1.link.next == NULL && elem1.link.prev == NULL); -	assert(elem2.link.next == NULL && elem2.link.prev == NULL); -	assert(elem3.link.next == NULL && elem3.link.prev == NULL); +	test_assert(linked_list_empty(&list)); +	test_assert(elem1.link.next == NULL && elem1.link.prev == NULL); +	test_assert(elem2.link.next == NULL && elem2.link.prev == NULL); +	test_assert(elem3.link.next == NULL && elem3.link.prev == NULL);  }  static void test_linked_list_manual_iterate(void) { @@ -170,15 +170,15 @@ static void test_linked_list_manual_iterate(void) {  	struct list_elem *ptr = NULL;  	ptr = (struct list_elem *)list.next; -	assert(strcmp("elem1", ptr->content) == 0); +	test_assert(strcmp("elem1", ptr->content) == 0);  	ptr = (struct list_elem *)ptr->link.next; -	assert(strcmp("elem2", ptr->content) == 0); +	test_assert(strcmp("elem2", ptr->content) == 0);  	ptr = (struct list_elem *)ptr->link.next; -	assert(strcmp("elem3", ptr->content) == 0); +	test_assert(strcmp("elem3", ptr->content) == 0); -	assert(ptr->link.next == &list); +	test_assert(ptr->link.next == &list);  }  static void test_linked_list_loop_iterate(void) { @@ -195,10 +195,10 @@ static void test_linked_list_loop_iterate(void) {  	size_t cnt = 0;  	for (struct linked_list *ptr = list.next; ptr != &list; ptr = ptr->next) {  		struct list_elem *elem = (struct list_elem *)ptr; -		assert(strcmp("elem", elem->content) == 0); +		test_assert(strcmp("elem", elem->content) == 0);  		cnt++;  	} -	assert(cnt == 3); +	test_assert(cnt == 3);  }  static void test_linked_list_take_empty(void) { @@ -208,8 +208,8 @@ static void test_linked_list_take_empty(void) {  	linked_list_take(&list2, &list1); -	assert(linked_list_empty(&list1)); -	assert(linked_list_empty(&list2)); +	test_assert(linked_list_empty(&list1)); +	test_assert(linked_list_empty(&list2));  }  static void test_linked_list_take_single(void) { @@ -222,9 +222,9 @@ static void test_linked_list_take_single(void) {  	linked_list_take(&list2, &list1); -	assert(linked_list_empty(&list1)); -	assert(list2.next == &elem1.link && list2.prev == &elem1.link); -	assert(elem1.link.next == &list2 && elem1.link.prev == &list2); +	test_assert(linked_list_empty(&list1)); +	test_assert(list2.next == &elem1.link && list2.prev == &elem1.link); +	test_assert(elem1.link.next == &list2 && elem1.link.prev == &list2);  }  static void test_linked_list_take_many(void) { @@ -239,10 +239,10 @@ static void test_linked_list_take_many(void) {  	linked_list_take(&list2, &list1); -	assert(linked_list_empty(&list1)); -	assert(list2.next == &elem1.link && list2.prev == &elem2.link); -	assert(elem1.link.next == &elem2.link && elem1.link.prev == &list2); -	assert(elem2.link.next == &list2 && elem2.link.prev == &elem1.link); +	test_assert(linked_list_empty(&list1)); +	test_assert(list2.next == &elem1.link && list2.prev == &elem2.link); +	test_assert(elem1.link.next == &elem2.link && elem1.link.prev == &list2); +	test_assert(elem2.link.next == &list2 && elem2.link.prev == &elem1.link);  }  static void test_linked_list_take_concat(void) { @@ -261,31 +261,31 @@ static void test_linked_list_take_concat(void) {  	linked_list_take(&list2, &list1); -	assert(linked_list_empty(&list1)); -	assert(list2.next == &elem1.link && list2.prev == &elem4.link); -	assert(elem1.link.next == &elem2.link && elem1.link.prev == &list2); -	assert(elem2.link.next == &elem3.link && elem2.link.prev == &elem1.link); -	assert(elem3.link.next == &elem4.link && elem3.link.prev == &elem2.link); -	assert(elem4.link.next == &list2 && elem4.link.prev == &elem3.link); +	test_assert(linked_list_empty(&list1)); +	test_assert(list2.next == &elem1.link && list2.prev == &elem4.link); +	test_assert(elem1.link.next == &elem2.link && elem1.link.prev == &list2); +	test_assert(elem2.link.next == &elem3.link && elem2.link.prev == &elem1.link); +	test_assert(elem3.link.next == &elem4.link && elem3.link.prev == &elem2.link); +	test_assert(elem4.link.next == &list2 && elem4.link.prev == &elem3.link);  }  int main(int argc, char *argv[]) {  	(void)argc;  	(void)argv; -	test_linked_list_init(); -	test_linked_list_single_insert(); -	test_linked_list_single_remove(); -	test_linked_list_alternate_remove(); -	test_linked_list_sequential_remove(); -	test_linked_list_insert_after(); -	test_linked_list_remove_loop(); -	test_linked_list_manual_iterate(); -	test_linked_list_loop_iterate(); -	test_linked_list_take_empty(); -	test_linked_list_take_single(); -	test_linked_list_take_many(); -	test_linked_list_take_concat(); +	test_run(test_linked_list_init); +	test_run(test_linked_list_single_insert); +	test_run(test_linked_list_single_remove); +	test_run(test_linked_list_alternate_remove); +	test_run(test_linked_list_sequential_remove); +	test_run(test_linked_list_insert_after); +	test_run(test_linked_list_remove_loop); +	test_run(test_linked_list_manual_iterate); +	test_run(test_linked_list_loop_iterate); +	test_run(test_linked_list_take_empty); +	test_run(test_linked_list_take_single); +	test_run(test_linked_list_take_many); +	test_run(test_linked_list_take_concat);  	return 0;  }  | 
