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