Types: Added SilcCompare generic comparison function
[runtime.git] / lib / silcutil / tests / test_silclist.c
index f0783f37473774c858a1b01a22332c6bd07a14b2..d56a482ac02c2ad184aac1e5ea291275c9752f2e 100644 (file)
@@ -1,6 +1,6 @@
 /* SilcList tests */
 
-#include "silc.h"
+#include "silcruntime.h"
 
 struct foo {
   int i;
@@ -8,11 +8,25 @@ struct foo {
   struct foo *prev;
 };
 
+static SilcCompareValue compare(void *e1, void *e2, void *context)
+{
+  struct foo *ee1 = e1, *ee2 = e2;
+  SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", ee1->i, ee1, ee1->next,
+                  ee1->prev));
+  SILC_LOG_DEBUG(("> entry %d, %p, next=%p, prev=%p", ee2->i, ee2, ee2->next,
+                  ee2->prev));
+  if (ee1->i > ee2->i)
+    return SILC_COMPARE_GREATER_THAN;
+  if (ee1->i < ee2->i)
+    return SILC_COMPARE_LESS_THAN;
+  return SILC_COMPARE_EQUAL_TO;
+}
+
 int main(int argc, char **argv)
 {
   SilcBool success = FALSE;
   SilcList list;
-  struct foo *f, *f1, *f2, *f3, *f4;
+  struct foo *f, *f1, *f2, *f3, *f4, *f5, *f6, *f7;
 
   if (argc > 1 && !strcmp(argv[1], "-d")) {
     silc_log_debug(TRUE);
@@ -37,16 +51,28 @@ int main(int argc, char **argv)
   if (!f4)
     goto err;
   f4->i = 4;
+  f5 = silc_calloc(1, sizeof(*f4));
+  if (!f5)
+    goto err;
+  f5->i = 5;
+  f6 = silc_calloc(1, sizeof(*f4));
+  if (!f6)
+    goto err;
+  f6->i = 6;
+  f7 = silc_calloc(1, sizeof(*f4));
+  if (!f7)
+    goto err;
+  f7->i = 7;
 
   SILC_LOG_DEBUG(("Add one entry"));
   silc_list_add(list, f1);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
   SILC_LOG_DEBUG(("Delete the entry"));
-  silc_list_del(list, f1);  
+  silc_list_del(list, f1);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END)
     goto err;
@@ -55,11 +81,11 @@ int main(int argc, char **argv)
   silc_list_add(list, f1);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
   SILC_LOG_DEBUG(("Delete the entry"));
-  silc_list_del(list, f1);  
+  silc_list_del(list, f1);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END)
     goto err;
@@ -68,7 +94,7 @@ int main(int argc, char **argv)
   silc_list_insert(list, NULL, f4);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
@@ -86,7 +112,7 @@ int main(int argc, char **argv)
 
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
@@ -94,7 +120,7 @@ int main(int argc, char **argv)
   silc_list_insert(list, f1, f4);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
@@ -105,7 +131,7 @@ int main(int argc, char **argv)
   silc_list_insert(list, f3, f4);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
@@ -116,24 +142,24 @@ int main(int argc, char **argv)
   silc_list_insert(list, NULL, f4);
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
   silc_list_start(list);
   silc_list_del(list, f1);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
   silc_list_del(list, f3);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
   silc_list_del(list, f2);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
@@ -143,7 +169,7 @@ int main(int argc, char **argv)
 
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
 
@@ -151,9 +177,41 @@ int main(int argc, char **argv)
 
   silc_list_start(list);
   while ((f = silc_list_get(list)) != SILC_LIST_END) {
-    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+                  f->prev));
+  }
+
+  while ((f = silc_list_pop(list)) != SILC_LIST_END) {
+    SILC_LOG_DEBUG(("POPPED entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
                   f->prev));
   }
+  if (silc_list_count(list))
+    goto err;
+
+  /* Sort */
+  silc_list_init_prev(list, struct foo, next, prev);
+  silc_list_add(list, f2);
+  silc_list_add(list, f7);
+  silc_list_add(list, f4);
+  silc_list_add(list, f6);
+  silc_list_add(list, f5);
+  silc_list_add(list, f1);
+  silc_list_add(list, f3);
+
+  SILC_LOG_DEBUG(("Unsorted list"));
+  silc_list_start(list);
+  while ((f = silc_list_get(list)) != SILC_LIST_END)
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+                  f->prev));
+
+  SILC_LOG_DEBUG(("Sorting"));
+  silc_list_sort(list, compare, NULL);
+
+  SILC_LOG_DEBUG(("Sorted list"));
+  silc_list_start(list);
+  while ((f = silc_list_get(list)) != SILC_LIST_END)
+    SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
+                  f->prev));
 
   success = TRUE;
 
@@ -161,5 +219,5 @@ int main(int argc, char **argv)
   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
 
-  return success;
+  return !success;
 }