X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fhtable%2Ftest%2Frun-type.c;h=a3616a5a37b8fb1f2588d9d8e369136c6436665e;hb=04bcddcc084cf0ef05945c7a9d609e08e30387be;hp=f97e7270b2fa65afd83e75cc9fcf33220d06d357;hpb=0c3590dc33d644f73bb8587db454c491830aaf26;p=ccan diff --git a/ccan/htable/test/run-type.c b/ccan/htable/test/run-type.c index f97e7270..a3616a5a 100644 --- a/ccan/htable/test/run-type.c +++ b/ccan/htable/test/run-type.c @@ -83,7 +83,7 @@ static void del_vals(struct htable_obj *ht, } static void del_vals_bykey(struct htable_obj *ht, - const struct obj val[], unsigned int num) + const struct obj val[] UNNEEDED, unsigned int num) { unsigned int i; @@ -107,16 +107,16 @@ static bool check_mask(struct htable *ht, const struct obj val[], unsigned num) return true; } -int main(int argc, char *argv[]) +int main(void) { 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(); }