strset: new module using critbit trees.
[ccan] / ccan / strset / test / run-prefix.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 /* Must be > 100, see below. */
7 #define NUM 200
8
9 static bool in_order(const char *value, unsigned int *count)
10 {
11         int i = atoi(value);
12         ok1(*count == i);
13         (*count)++;
14         return false;
15 }
16
17 static bool find_empty(const char *value, char *empty)
18 {
19         if (value == empty)
20                 pass("Found empty entry!");
21         return false;
22 }
23
24 int main(void)
25 {
26         struct strset set;
27         const struct strset *sub;
28         unsigned int i;
29         char *str[NUM], *empty;
30
31         plan_tests(7 + 1 + 10 + 100);
32         strset_init(&set);
33
34         for (i = 0; i < NUM; i++) {
35                 char template[10];
36                 sprintf(template, "%08u", i);
37                 str[i] = strdup(template);
38         }
39
40         for (i = 0; i < NUM; i++)
41                 strset_set(&set, str[i]);
42
43         /* Nothing */
44         sub = strset_prefix(&set, "a");
45         ok1(strset_empty(sub));
46
47         /* Everything */
48         sub = strset_prefix(&set, "0");
49         ok1(sub->u.n == set.u.n);
50         sub = strset_prefix(&set, "");
51         ok1(sub->u.n == set.u.n);
52
53         /* Singleton. */
54         sub = strset_prefix(&set, "00000000");
55         i = 0;
56         strset_iterate(sub, in_order, &i);
57         ok1(i == 1);
58
59         /* First 10. */
60         sub = strset_prefix(&set, "0000000");
61         i = 0;
62         strset_iterate(sub, in_order, &i);
63         ok1(i == 10);
64
65         /* First 100. */
66         sub = strset_prefix(&set, "000000");
67         i = 0;
68         strset_iterate(sub, in_order, &i);
69         ok1(i == 100);
70
71         /* Everything, *plus* empty string. */
72         empty = strdup("");
73         strset_set(&set, empty);
74
75         sub = strset_prefix(&set, "");
76         /* Check we get *our* empty string back! */
77         strset_iterate(sub, find_empty, empty);
78
79         strset_destroy(&set);
80
81         for (i = 0; i < NUM; i++)
82                 free(str[i]);
83         free(empty);
84
85         /* This exits depending on whether all tests passed */
86         return exit_status();
87 }