1 #include <ccan/tap/tap.h>
2 #define CCAN_JMAP_DEBUG
3 #include <ccan/jmap/jmap.c>
5 int main(int argc, char *argv[])
8 unsigned long i, *value;
14 ok1(jmap_error(map) == NULL);
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);
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);
32 ok1(jmap_getval(map, 0) == NULL);
34 /* Map a million indices, 16 apart. */
35 for (i = 0; i < 1000000; i++)
36 jmap_add(map, i << 4, (i << 5) + 1);
38 /* This only take 6.3MB on my 32-bit system. */
39 diag("%u bytes memory used\n", (unsigned)JudyLMemUsed(map->judy));
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);
56 value = jmap_getval(map, 0);
57 ok1(value && *value == 1);
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));
64 value = jmap_getval(map, 999999 << 4);
65 ok1(value && *value == (999999 << 5) + 1);
66 jmap_putval(map, &value);
68 value = jmap_nthval(map, 0, &i);
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);
78 value = jmap_firstval(map, &i);
80 ok1(value && *value == 1);
81 jmap_putval(map, &value);
82 ok1(jmap_prevval(map, &i) == NULL);
85 value = jmap_nextval(map, &i);
87 ok1(value && *value == (1 << 5) + 1);
88 jmap_putval(map, &value);
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);
97 value = jmap_prevval(map, &i);
98 ok1(i == 999998 << 4);
99 ok1(value && *value == (999998 << 5) + 1);
100 jmap_putval(map, &value);
102 /* Test error handling */
103 JU_ERRNO(&map->err) = 100;
104 JU_ERRID(&map->err) = 991;
105 err = jmap_error(map);
107 ok1(strstr(err, "100"));
108 ok1(strstr(err, "991"));
109 ok1(err == map->errstr);
112 return exit_status();