X-Git-Url: http://git.silc.fi/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Ftests%2Ftest_silclist.c;h=d56a482ac02c2ad184aac1e5ea291275c9752f2e;hb=0591a422cd4b71e5af6581bcd3d00d184d84a017;hp=da34e1b9a8d21cecbf10d28ac52f5606c01cdd07;hpb=c27a4ecc3e616e8a5ee09b8ca888ed6ff3e501f7;p=runtime.git diff --git a/lib/silcutil/tests/test_silclist.c b/lib/silcutil/tests/test_silclist.c index da34e1b9..d56a482a 100644 --- a/lib/silcutil/tests/test_silclist.c +++ b/lib/silcutil/tests/test_silclist.c @@ -1,6 +1,6 @@ /* SilcList tests */ -#include "silcincludes.h" +#include "silcruntime.h" struct foo { int i; @@ -8,16 +8,30 @@ 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); silc_log_debug_hexdump(TRUE); - silc_log_set_debug_string("*list*"); + silc_log_set_debug_string("*list*,*errno*"); } silc_list_init_prev(list, struct foo, next, prev); @@ -37,12 +51,50 @@ 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, + f->prev)); + } + SILC_LOG_DEBUG(("Delete the entry")); + silc_list_del(list, f1); + silc_list_start(list); + while ((f = silc_list_get(list)) != SILC_LIST_END) + goto err; + SILC_LOG_DEBUG(("head=%p", list.head)); + SILC_LOG_DEBUG(("Re-add the 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, + f->prev)); + } + SILC_LOG_DEBUG(("Delete the entry")); + silc_list_del(list, f1); + silc_list_start(list); + while ((f = silc_list_get(list)) != SILC_LIST_END) + goto err; SILC_LOG_DEBUG(("insert f4=%p at head")); 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)); } @@ -60,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)); } @@ -68,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)); } @@ -79,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)); } @@ -90,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)); } @@ -117,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)); } @@ -125,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; @@ -135,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; }