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