]> git.ozlabs.org Git - ccan/blob - ccan/strmap/test/run-order.c
base64: fix for unsigned chars (e.g. ARM).
[ccan] / ccan / strmap / test / run-order.c
1 #include <ccan/strmap/strmap.h>
2 #include <ccan/strmap/strmap.c>
3 #include <ccan/tap/tap.h>
4 #include <stdio.h>
5
6 #define NUM 1000
7
8 static bool in_order(const char *member, char *value, unsigned int *count)
9 {
10         int i = atoi(member);
11         ok1(i == atoi(value));
12         ok1(*count == i);
13         (*count)++;
14         return true;
15 }
16
17 static bool in_order_by_2(const char *member, char *value, unsigned int *count)
18 {
19         int i = atoi(member);
20         ok1(i == atoi(value));
21         ok1(*count == i);
22         (*count) += 2;
23         return true;
24 }
25
26 static bool dump(const char *member, char *value, bool *ok)
27 {
28         diag("%s=>%s", member, value);
29         if (value != member + 1)
30                 *ok = false;
31         return true;
32 }
33
34 int main(void)
35 {
36         STRMAP(char *) map;
37         unsigned int i;
38         char *str[NUM];
39         bool dump_ok;
40
41         plan_tests(1 + NUM * 4 + 3 * NUM);
42         strmap_init(&map);
43
44         for (i = 0; i < NUM; i++) {
45                 char template[10];
46                 sprintf(template, "%08u", i);
47                 str[i] = strdup(template);
48         }
49
50         for (i = 0; i < NUM; i++)
51                 strmap_add(&map, str[i], str[i]+1);
52
53         dump_ok = true;
54         strmap_iterate(&map, dump, &dump_ok);
55         ok1(dump_ok);
56
57         /* Iterate. */
58         i = 0;
59         strmap_iterate(&map, in_order, &i);
60
61         /* Preserve order after deletion. */
62         for (i = 0; i < NUM; i += 2) {
63                 char *v;
64                 ok1(strmap_del(&map, str[i], &v) == str[i]);
65                 ok1(v == str[i] + 1);
66         }
67
68         i = 1;
69         strmap_iterate(&map, in_order_by_2, &i);
70
71         for (i = 1; i < NUM; i += 2) {
72                 char *v;
73                 ok1(strmap_del(&map, str[i], &v) == str[i]);
74                 ok1(v == str[i] + 1);
75         }
76
77         /* empty traverse. */
78         strmap_iterate(&map, in_order_by_2, (unsigned int *)NULL);
79
80         /* insert backwards, should be fine. */
81         for (i = 0; i < NUM; i++)
82                 strmap_add(&map, str[NUM-1-i], str[NUM-1-i]+1);
83
84         i = 0;
85         strmap_iterate(&map, in_order, &i);
86
87         strmap_clear(&map);
88
89         for (i = 0; i < NUM; i++)
90                 free(str[i]);
91
92         /* This exits depending on whether all tests passed */
93         return exit_status();
94 }