X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fstrset%2Ftest%2Frun-hibit.c;fp=ccan%2Fstrset%2Ftest%2Frun-hibit.c;h=2ea158dd9ad6ad77cb4d17866201b18f4d455e48;hb=ab83de953730f5e5e571dbf69ffb3cc685a102dc;hp=0000000000000000000000000000000000000000;hpb=0845e79650c9257aa0ddef8ff99fd815b5edffac;p=ccan diff --git a/ccan/strset/test/run-hibit.c b/ccan/strset/test/run-hibit.c new file mode 100644 index 00000000..2ea158dd --- /dev/null +++ b/ccan/strset/test/run-hibit.c @@ -0,0 +1,82 @@ +/* Test high bit handling. */ +#include +#include +#include + +#define NUM 1000 + +static void encode(char template[3], unsigned int val) +{ + assert(val < 255 * 255); + template[0] = (val / 255) + 1; + template[1] = (val % 255) + 1; + template[2] = '\0'; +} + +static bool in_order(const char *value, unsigned int *count) +{ + char template[3]; + encode(template, *count); + ok1(streq(value, template)); + (*count)++; + return false; +} + +static bool in_order_by_2(const char *value, unsigned int *count) +{ + char template[3]; + encode(template, *count); + ok1(streq(value, template)); + (*count) += 2; + return false; +} + +static bool dump(const char *value, void *unused) +{ + diag("%s", value); + return false; +} + +int main(void) +{ + struct strset set; + unsigned int i; + char *str[NUM]; + + plan_tests(NUM + 3 * NUM / 2); + strset_init(&set); + + for (i = 0; i < NUM; i++) { + char template[3]; + encode(template, i); + str[i] = strdup(template); + } + + for (i = 0; i < NUM; i++) + strset_set(&set, str[i]); + + strset_iterate(&set, dump, NULL); + + /* Iterate. */ + i = 0; + strset_iterate(&set, in_order, &i); + + /* Preserve order after deletion. */ + for (i = 0; i < NUM; i += 2) + ok1(strset_clear(&set, str[i]) == str[i]); + + i = 1; + strset_iterate(&set, in_order_by_2, &i); + + for (i = 1; i < NUM; i += 2) + ok1(strset_clear(&set, str[i]) == str[i]); + + /* empty traverse. */ + strset_iterate(&set, in_order_by_2, (unsigned int *)NULL); + + for (i = 0; i < NUM; i++) + free(str[i]); + + /* This exits depending on whether all tests passed */ + return exit_status(); +}