X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fhtable%2Ftest%2Frun-type.c;h=e1a78f49616eee40d421994253b30b1c07a5aba7;hb=cedcaa1bbb44cad610973c449340c0fde9ae0280;hp=f97e7270b2fa65afd83e75cc9fcf33220d06d357;hpb=0c3590dc33d644f73bb8587db454c491830aaf26;p=ccan diff --git a/ccan/htable/test/run-type.c b/ccan/htable/test/run-type.c index f97e7270..e1a78f49 100644 --- a/ccan/htable/test/run-type.c +++ b/ccan/htable/test/run-type.c @@ -110,13 +110,13 @@ static bool check_mask(struct htable *ht, const struct obj val[], unsigned num) int main(int argc, char *argv[]) { unsigned int i; - struct htable_obj ht; - struct obj val[NUM_VALS]; + struct htable_obj ht, ht2; + struct obj val[NUM_VALS], *result; unsigned int dne; void *p; struct htable_obj_iter iter; - plan_tests(20); + plan_tests(29); for (i = 0; i < NUM_VALS; i++) val[i].key = i; dne = i; @@ -147,6 +147,10 @@ int main(int argc, char *argv[]) for (p = htable_obj_first(&ht,&iter); p; p = htable_obj_next(&ht, &iter)) i++; ok1(i == NUM_VALS); + i = 0; + for (p = htable_obj_prev(&ht,&iter); p; p = htable_obj_prev(&ht, &iter)) + i++; + ok1(i == NUM_VALS); /* Delete all. */ del_vals(&ht, val, NUM_VALS); @@ -167,9 +171,40 @@ int main(int argc, char *argv[]) find_vals(&ht, val, NUM_VALS); ok1(!htable_obj_get(&ht, &dne)); + /* Check copy. */ + ok1(htable_obj_copy(&ht2, &ht)); + /* Delete them all by key. */ del_vals_bykey(&ht, val, NUM_VALS); - htable_obj_clear(&ht); + del_vals_bykey(&ht2, val, NUM_VALS); + /* Write two of the same value. */ + val[1] = val[0]; + htable_obj_add(&ht, &val[0]); + htable_obj_add(&ht, &val[1]); + i = 0; + + result = htable_obj_getfirst(&ht, &i, &iter); + ok1(result == &val[0] || result == &val[1]); + if (result == &val[0]) { + ok1(htable_obj_getnext(&ht, &i, &iter) == &val[1]); + ok1(htable_obj_getnext(&ht, &i, &iter) == NULL); + + /* Deleting first should make us iterate over the other. */ + ok1(htable_obj_del(&ht, &val[0])); + ok1(htable_obj_getfirst(&ht, &i, &iter) == &val[1]); + ok1(htable_obj_getnext(&ht, &i, &iter) == NULL); + } else { + ok1(htable_obj_getnext(&ht, &i, &iter) == &val[0]); + ok1(htable_obj_getnext(&ht, &i, &iter) == NULL); + + /* Deleting first should make us iterate over the other. */ + ok1(htable_obj_del(&ht, &val[1])); + ok1(htable_obj_getfirst(&ht, &i, &iter) == &val[0]); + ok1(htable_obj_getnext(&ht, &i, &iter) == NULL); + } + + htable_obj_clear(&ht); + htable_obj_clear(&ht2); return exit_status(); }