aboutsummaryrefslogtreecommitdiffstats
path: root/test-list.c
diff options
context:
space:
mode:
Diffstat (limited to 'test-list.c')
-rw-r--r--test-list.c206
1 files changed, 206 insertions, 0 deletions
diff --git a/test-list.c b/test-list.c
new file mode 100644
index 0000000..71c26d3
--- /dev/null
+++ b/test-list.c
@@ -0,0 +1,206 @@
+/* vim: set sw=4 ts=4 sts=4 et: */
+#undef NDEBUG
+#define _POSIX_C_SOURCE 200809L
+#define _NETBSD_SOURCE
+
+#include <l4list.h>
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define INT_TO_PTR(x) ((void*)((intptr_t)(x)))
+#define PTR_TO_INT(x) ((int)((intptr_t)((void*)(x))))
+
+void test_list_empty (void) {
+ LbsListMeta* list = lbs_list_meta_new (NULL);
+ LbsList* node = NULL;
+
+ for (int i = 1; i <= 10; i++) {
+ node = lbs_list_insert_next (list, node, INT_TO_PTR (i), NULL);
+ }
+
+ assert (lbs_list_meta_get_len (list) == 10);
+
+ node = lbs_list_meta_goto (list, 5);
+ lbs_list_remove (list, node);
+ assert (lbs_list_meta_get_len (list) == 9);
+
+ node = lbs_list_meta_get_first (list);
+ for (int i = 1; i <= 10; i++) {
+ if (i == 6) {
+ continue;
+ }
+ assert (PTR_TO_INT (lbs_list_get_data (node)) == i);
+ node = node->next;
+ }
+
+ lbs_list_meta_free (list);
+
+ printf ("%s => PASS!\n", __func__);
+}
+
+void test_list_free_func (void) {
+ LbsListMeta* list = lbs_list_meta_new (free);
+ LbsList* node = NULL;
+ LbsList* node_next;
+ const char* a[] = {
+ "1 Good",
+ "2 Test",
+ "3 Free",
+ "4 Tree",
+ "5 Book",
+ "6 GGGGOOOOOOOODDDD",
+ "7 OOOOOOOOKKKKKKKKKKKK",
+ "8 QQQQQQQQAAAAAAAAAAAAAAAAAA",
+ "9 SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSHHHHHHHHHHHHHH",
+ "10 !!"
+ };
+
+ for (int i = 0; i < 10; i++) {
+ node = lbs_list_insert_next (list, node, strdup (a[i]), NULL);
+ }
+
+ assert (lbs_list_meta_get_len (list) == 10);
+
+ node = lbs_list_meta_goto (list, 5);
+ node_next = node->next;
+ lbs_list_remove (list, node);
+ assert (lbs_list_meta_get_len (list) == 9);
+
+ lbs_list_insert_prev (list, node_next, INT_TO_PTR (0), NULL);
+ assert (lbs_list_meta_get_len (list) == 10);
+
+ node = lbs_list_meta_get_first (list);
+ for (int i = 0; i < 10; i++) {
+ if (i == 5) {
+ assert (PTR_TO_INT (lbs_list_get_data (node)) == 0);
+ node = node->next;
+ continue;
+ }
+ assert (strcmp (lbs_list_get_data (node), a[i]) == 0);
+ node = node->next;
+ }
+
+ lbs_list_meta_free (list);
+ printf ("%s => PASS!\n", __func__);
+}
+
+void test_list_op (void) {
+ LbsListMeta* list = lbs_list_meta_new (NULL);
+ LbsList* node;
+
+ node = lbs_list_insert_next (list, NULL, INT_TO_PTR (2), NULL);
+ node = lbs_list_insert_prev (list, node, INT_TO_PTR (1), NULL);
+ lbs_list_push_back (list, INT_TO_PTR (2), NULL);
+ lbs_list_push_front (list, INT_TO_PTR (0), NULL);
+
+ lbs_list_insert_prev (list, lbs_list_meta_get_last (list),
+ INT_TO_PTR (3), NULL);
+ lbs_list_pop_back (list);
+ lbs_list_pop_front (list);
+
+ lbs_list_push_front (list, INT_TO_PTR (-1), NULL);
+ node = lbs_list_meta_goto (list, 0);
+ lbs_list_remove (list, node);
+ lbs_list_meta_set_free_func (list, NULL);
+
+ node = NULL;
+ for (int i = 1; node != NULL; i++, node = node->next) {
+ assert (PTR_TO_INT (lbs_list_get_data (node)) == i);
+ }
+
+ lbs_list_meta_free (list);
+ printf ("%s => PASS!\n", __func__);
+}
+
+void test_list_op_no_meta (void) {
+ LbsList* node_first;
+ LbsList* node_last;
+ LbsList* node;
+ LbsList* tmp;
+
+ node_last = lbs_list_insert_next (NULL, NULL, INT_TO_PTR (2), NULL);
+ node_first = lbs_list_insert_prev (NULL, node_last, INT_TO_PTR (1), NULL);
+ node_last = lbs_list_insert_next (NULL, node_last, INT_TO_PTR (2), NULL);
+ node_first = lbs_list_insert_prev (NULL, node_first, INT_TO_PTR (0), NULL);
+
+ lbs_list_insert_prev (NULL, node_last, INT_TO_PTR (3), NULL);
+ tmp = node_last->prev;
+ lbs_list_remove (NULL, node_last);
+ node_last = tmp;
+ tmp = node_first->next;
+ lbs_list_remove (NULL, node_first);
+ node_first = tmp;
+
+ lbs_list_insert_prev (NULL, node_first, INT_TO_PTR (-1), NULL);
+ node = lbs_list_goto (node_first, -1);
+ lbs_list_remove (NULL, node);
+
+ node = NULL;
+ for (int i = 1; node != NULL; i++, node = node->next) {
+ assert (PTR_TO_INT (lbs_list_get_data (node)) == i);
+ }
+
+ free (lbs_list_goto (node_first, 1));
+ free (node_first);
+ free (node_last);
+
+ printf ("%s => PASS!\n", __func__);
+}
+
+void test_stack (void) {
+ LbsStack* stk = lbs_stack_new (NULL);
+
+ lbs_stack_push (stk, INT_TO_PTR (1), NULL);
+ lbs_stack_push (stk, INT_TO_PTR (2), NULL);
+ lbs_stack_push (stk, INT_TO_PTR (3), NULL);
+
+ assert (lbs_stack_get_len (stk) == 3);
+ assert (lbs_stack_get_data (stk) == INT_TO_PTR (3));
+
+ lbs_stack_pop (stk);
+ assert (lbs_stack_get_len (stk) == 2);
+ assert (lbs_stack_get_data (stk) == INT_TO_PTR (2));
+
+ lbs_stack_pop (stk);
+ assert (lbs_stack_get_len (stk) == 1);
+ assert (lbs_stack_get_data (stk) == INT_TO_PTR (1));
+
+ lbs_stack_free (stk);
+ printf ("%s => PASS!\n", __func__);
+}
+
+void test_queue (void) {
+ LbsQueue* q = lbs_queue_new (NULL);
+
+ lbs_queue_enqueue (q, INT_TO_PTR (1), NULL);
+ lbs_queue_enqueue (q, INT_TO_PTR (2), NULL);
+ lbs_queue_enqueue (q, INT_TO_PTR (3), NULL);
+
+ assert (lbs_queue_get_len (q) == 3);
+ assert (lbs_queue_get_front (q) == INT_TO_PTR (1));
+ assert (lbs_queue_get_back (q) == INT_TO_PTR (3));
+ assert (lbs_queue_get_data (q) == INT_TO_PTR (1));
+
+ lbs_queue_dequeue (q);
+ assert (lbs_queue_get_len (q) == 2);
+ assert (lbs_queue_get_front (q) == INT_TO_PTR (2));
+ assert (lbs_queue_get_back (q) == INT_TO_PTR (3));
+ assert (lbs_queue_get_data (q) == INT_TO_PTR (2));
+
+ lbs_queue_free (q);
+ printf ("%s => PASS!\n", __func__);
+}
+
+int main () {
+ test_list_empty ();
+ test_list_free_func ();
+ test_list_op ();
+ test_list_op_no_meta ();
+ test_stack ();
+ test_queue ();
+ return 0;
+}