X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fstrmap%2Ftest%2Frun-order.c;fp=ccan%2Fstrmap%2Ftest%2Frun-order.c;h=417a7406b537a173d3b5b99701c60505e2bcc94b;hp=0000000000000000000000000000000000000000;hb=20f3b260313fb4d5566aeb0d0c5439574e914e2d;hpb=3dda2c8bfc6430ea97cbb3bc1040df2b793dab91 diff --git a/ccan/strmap/test/run-order.c b/ccan/strmap/test/run-order.c new file mode 100644 index 00000000..417a7406 --- /dev/null +++ b/ccan/strmap/test/run-order.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +#define NUM 1000 + +static bool in_order(const char *member, char *value, unsigned int *count) +{ + int i = atoi(member); + ok1(i == atoi(value)); + ok1(*count == i); + (*count)++; + return false; +} + +static bool in_order_by_2(const char *member, char *value, unsigned int *count) +{ + int i = atoi(member); + ok1(i == atoi(value)); + ok1(*count == i); + (*count) += 2; + return false; +} + +static bool dump(const char *member, char *value, bool *ok) +{ + diag("%s=>%s", member, value); + if (value != member + 1) + *ok = false; + return false; +} + +int main(void) +{ + struct strmap_charp { + STRMAP_MEMBERS(char *); + } map; + unsigned int i; + char *str[NUM]; + bool dump_ok; + + plan_tests(1 + NUM * 4 + 3 * NUM); + strmap_init(&map); + + for (i = 0; i < NUM; i++) { + char template[10]; + sprintf(template, "%08u", i); + str[i] = strdup(template); + } + + for (i = 0; i < NUM; i++) + strmap_add(&map, str[i], str[i]+1); + + dump_ok = true; + strmap_iterate(&map, dump, &dump_ok); + ok1(dump_ok); + + /* Iterate. */ + i = 0; + strmap_iterate(&map, in_order, &i); + + /* Preserve order after deletion. */ + for (i = 0; i < NUM; i += 2) { + char *v; + ok1(strmap_del(&map, str[i], &v) == str[i]); + ok1(v == str[i] + 1); + } + + i = 1; + strmap_iterate(&map, in_order_by_2, &i); + + for (i = 1; i < NUM; i += 2) { + char *v; + ok1(strmap_del(&map, str[i], &v) == str[i]); + ok1(v == str[i] + 1); + } + + /* empty traverse. */ + strmap_iterate(&map, in_order_by_2, (unsigned int *)NULL); + + /* insert backwards, should be fine. */ + for (i = 0; i < NUM; i++) + strmap_add(&map, str[NUM-1-i], str[NUM-1-i]+1); + + i = 0; + strmap_iterate(&map, in_order, &i); + + strmap_clear(&map); + + for (i = 0; i < NUM; i++) + free(str[i]); + + /* This exits depending on whether all tests passed */ + return exit_status(); +}