endian: add constant versions.
[ccan] / ccan / jmap / test / run.c
1 #include <ccan/tap/tap.h>
2 #define CCAN_JMAP_DEBUG
3 #include <ccan/jmap/jmap.c>
4
5 struct map {
6         JMAP_MEMBERS(unsigned long, unsigned long);
7 };
8
9 int main(int argc, char *argv[])
10 {
11         struct map *map;
12         unsigned long i, *value;
13         const char *err;
14
15         plan_tests(51);
16
17         map = jmap_new(struct map);
18         ok1(jmap_error(map) == NULL);
19
20         ok1(jmap_test(map, 0) == false);
21         ok1(jmap_del(map, 0) == false);
22         ok1(jmap_add(map, 0, 1) == true);
23         ok1(jmap_test(map, 0) == true);
24         ok1(jmap_get(map, 0) == 1);
25         ok1(jmap_get(map, 1) == 0);
26         ok1(jmap_del(map, 0) == true);
27
28         ok1(jmap_popcount(map, 0, -1) == 0);
29         ok1(jmap_nth(map, 0, 0) == 0);
30         ok1(jmap_nth(map, 0, -1) == (size_t)-1);
31         ok1(jmap_first(map) == 0);
32         ok1(jmap_last(map) == 0);
33
34         ok1(jmap_getval(map, 0) == NULL);
35
36         /* Map a million indices, 16 apart. */
37         for (i = 0; i < 1000000; i++)
38                 jmap_add(map, (i << 4) + 1, (i << 5) + 1);
39
40         /* This only take 6.3MB on my 32-bit system. */
41         diag("%u bytes memory used\n", (unsigned)JudyLMemUsed(map->raw.judy));
42
43         ok1(jmap_get(map, 1) == 1);
44         ok1(jmap_get(map, (999999 << 4) + 1) == (999999 << 5) + 1);
45         ok1(jmap_popcount(map, 0, -1) == 1000000);
46         ok1(jmap_nth(map, 0, -1) == 1);
47         ok1(jmap_nth(map, 999999, -1) == (999999 << 4) + 1);
48         ok1(jmap_nth(map, 1000000, -1) == (size_t)-1);
49         ok1(jmap_first(map) == 1);
50         ok1(jmap_last(map) == (999999 << 4) + 1);
51         ok1(jmap_next(map, 1) == (1 << 4) + 1);
52         ok1(jmap_next(map, (999999 << 4) + 1) == 0);
53         ok1(jmap_prev(map, 2) == 1);
54         ok1(jmap_prev(map, 0) == 0);
55         ok1(jmap_error(map) == NULL);
56
57         /* Accessors. */
58         value = jmap_getval(map, 1);
59         ok1(value && *value == 1);
60         *value = 2;
61         ok1(jmap_get(map, 1) == 2);
62         jmap_putval(map, &value);
63         ok1(jmap_get(map, 1) == 2);
64         ok1(jmap_set(map, 1, 1));
65
66         value = jmap_getval(map, (999999 << 4) + 1);
67         ok1(value && *value == (999999 << 5) + 1);
68         jmap_putval(map, &value);
69
70         value = jmap_nthval(map, 0, &i);
71         ok1(i == 1);
72         ok1(value && *value == 1);
73         jmap_putval(map, &value);
74         value = jmap_nthval(map, 999999, &i);
75         ok1(i == (999999 << 4) + 1);
76         ok1(value && *value == (999999 << 5) + 1);
77         jmap_putval(map, &value);
78         ok1(jmap_nthval(map, 1000000, &i) == NULL);
79
80         value = jmap_firstval(map, &i);
81         ok1(i == 1);
82         ok1(value && *value == 1);
83         jmap_putval(map, &value);
84         ok1(jmap_prevval(map, &i) == NULL);
85
86         i = 1;
87         value = jmap_nextval(map, &i);
88         ok1(i == (1 << 4) + 1);
89         ok1(value && *value == (1 << 5) + 1);
90         jmap_putval(map, &value);
91
92         value = jmap_lastval(map, &i);
93         ok1(i == (999999 << 4) + 1);
94         ok1(value && *value == (999999 << 5) + 1);
95         jmap_putval(map, &value);
96         ok1(jmap_nextval(map, &i) == NULL);
97
98         i = (999999 << 4) + 1;
99         value = jmap_prevval(map, &i);
100         ok1(i == (999998 << 4) + 1);
101         ok1(value && *value == (999998 << 5) + 1);
102         jmap_putval(map, &value);
103
104         /* Test error handling */
105         JU_ERRNO(&map->raw.err) = 100;
106         JU_ERRID(&map->raw.err) = 991;
107         err = jmap_error(map);
108         ok1(err);
109         ok1(strstr(err, "100"));
110         ok1(strstr(err, "991"));
111         ok1(err == map->raw.errstr);
112         jmap_free(map);
113
114         return exit_status();
115 }