73784e75c88575df194de741a3c21d0ee19956f4
[ccan] / ccan / strset / test / run-order.c
1 #include <ccan/strset/strset.h>
2 #include <ccan/strset/strset.c>
3 #include <ccan/tap/tap.h>
4 #include <stdio.h>
5
6 #define NUM 1000
7
8 static bool in_order(const char *value, unsigned int *count)
9 {
10         int i = atoi(value);
11         ok1(*count == i);
12         (*count)++;
13         return false;
14 }
15
16 static bool in_order_by_2(const char *value, unsigned int *count)
17 {
18         int i = atoi(value);
19         ok1(*count == i);
20         (*count) += 2;
21         return false;
22 }
23
24 static bool dump(const char *value, void *unused)
25 {
26         diag("%s", value);
27         return false;
28 }
29
30 int main(void)
31 {
32         struct strset set;
33         unsigned int i;
34         char *str[NUM];
35
36         plan_tests(NUM * 2 + 3 * NUM / 2);
37         strset_init(&set);
38
39         for (i = 0; i < NUM; i++) {
40                 char template[10];
41                 sprintf(template, "%08u", i);
42                 str[i] = strdup(template);
43         }
44
45         for (i = 0; i < NUM; i++)
46                 strset_set(&set, str[i]);
47
48         strset_iterate(&set, dump, NULL);
49
50         /* Iterate. */
51         i = 0;
52         strset_iterate(&set, in_order, &i);
53
54         /* Preserve order after deletion. */
55         for (i = 0; i < NUM; i += 2)
56                 ok1(strset_clear(&set, str[i]) == str[i]);
57
58         i = 1;
59         strset_iterate(&set, in_order_by_2, &i);
60
61         for (i = 1; i < NUM; i += 2)
62                 ok1(strset_clear(&set, str[i]) == str[i]);
63
64         /* empty traverse. */
65         strset_iterate(&set, in_order_by_2, (unsigned int *)NULL);
66
67         /* insert backwards, should be fine. */
68         for (i = 0; i < NUM; i++)
69                 strset_set(&set, str[NUM-1-i]);
70
71         i = 0;
72         strset_iterate(&set, in_order, &i);
73
74         strset_destroy(&set);
75
76         for (i = 0; i < NUM; i++)
77                 free(str[i]);
78
79         /* This exits depending on whether all tests passed */
80         return exit_status();
81 }