summaryrefslogtreecommitdiff
path: root/ccan/jmap/test/run.c
blob: 3a4249dc4ae5372327f294b11e916a19391b5f82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <ccan/tap/tap.h>
#define CCAN_JMAP_DEBUG
#include <ccan/jmap/jmap.c>

struct map {
	JMAP_MEMBERS(unsigned long, unsigned long);
};

int main(int argc, char *argv[])
{
	struct map *map;
	unsigned long i, *value;
	const char *err;

	plan_tests(51);

	map = jmap_new(struct map);
	ok1(jmap_error(map) == NULL);

	ok1(jmap_test(map, 0) == false);
	ok1(jmap_del(map, 0) == false);
	ok1(jmap_add(map, 0, 1) == true);
	ok1(jmap_test(map, 0) == true);
	ok1(jmap_get(map, 0) == 1);
	ok1(jmap_get(map, 1) == 0);
	ok1(jmap_del(map, 0) == true);

	ok1(jmap_popcount(map, 0, -1) == 0);
	ok1(jmap_nth(map, 0, 0) == 0);
	ok1(jmap_nth(map, 0, -1) == (size_t)-1);
	ok1(jmap_first(map) == 0);
	ok1(jmap_last(map) == 0);

	ok1(jmap_getval(map, 0) == NULL);

	/* Map a million indices, 16 apart. */
	for (i = 0; i < 1000000; i++)
		jmap_add(map, (i << 4) + 1, (i << 5) + 1);

	/* This only take 6.3MB on my 32-bit system. */
	diag("%u bytes memory used\n", (unsigned)JudyLMemUsed(map->raw.judy));

	ok1(jmap_get(map, 1) == 1);
	ok1(jmap_get(map, (999999 << 4) + 1) == (999999 << 5) + 1);
	ok1(jmap_popcount(map, 0, -1) == 1000000);
	ok1(jmap_nth(map, 0, -1) == 1);
	ok1(jmap_nth(map, 999999, -1) == (999999 << 4) + 1);
	ok1(jmap_nth(map, 1000000, -1) == (size_t)-1);
	ok1(jmap_first(map) == 1);
	ok1(jmap_last(map) == (999999 << 4) + 1);
	ok1(jmap_next(map, 1) == (1 << 4) + 1);
	ok1(jmap_next(map, (999999 << 4) + 1) == 0);
	ok1(jmap_prev(map, 2) == 1);
	ok1(jmap_prev(map, 0) == 0);
	ok1(jmap_error(map) == NULL);

	/* Accessors. */
	value = jmap_getval(map, 1);
	ok1(value && *value == 1);
	*value = 2;
	ok1(jmap_get(map, 1) == 2);
	jmap_putval(map, &value);
	ok1(jmap_get(map, 1) == 2);
	ok1(jmap_set(map, 1, 1));

	value = jmap_getval(map, (999999 << 4) + 1);
	ok1(value && *value == (999999 << 5) + 1);
	jmap_putval(map, &value);

	value = jmap_nthval(map, 0, &i);
	ok1(i == 1);
	ok1(value && *value == 1);
	jmap_putval(map, &value);
	value = jmap_nthval(map, 999999, &i);
	ok1(i == (999999 << 4) + 1);
	ok1(value && *value == (999999 << 5) + 1);
	jmap_putval(map, &value);
	ok1(jmap_nthval(map, 1000000, &i) == NULL);

	value = jmap_firstval(map, &i);
	ok1(i == 1);
	ok1(value && *value == 1);
	jmap_putval(map, &value);
	ok1(jmap_prevval(map, &i) == NULL);

	i = 1;
	value = jmap_nextval(map, &i);
	ok1(i == (1 << 4) + 1);
	ok1(value && *value == (1 << 5) + 1);
	jmap_putval(map, &value);

	value = jmap_lastval(map, &i);
	ok1(i == (999999 << 4) + 1);
	ok1(value && *value == (999999 << 5) + 1);
	jmap_putval(map, &value);
	ok1(jmap_nextval(map, &i) == NULL);

	i = (999999 << 4) + 1;
	value = jmap_prevval(map, &i);
	ok1(i == (999998 << 4) + 1);
	ok1(value && *value == (999998 << 5) + 1);
	jmap_putval(map, &value);

	/* Test error handling */
	JU_ERRNO(&map->raw.err) = 100;
	JU_ERRID(&map->raw.err) = 991;
	err = jmap_error(map);
	ok1(err);
	ok1(strstr(err, "100"));
	ok1(strstr(err, "991"));
	ok1(err == map->raw.errstr);
	jmap_free(map);

	return exit_status();
}