summaryrefslogtreecommitdiff
path: root/libmisc/tests/test_map.c
blob: 855daceaf00968dcaa7b54e18fe45fc0e3e11241 (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
/* libmisc/tests/test_map.c - Tests for <libmisc/map.h>
 *
 * Copyright (C) 2025  Luke T. Shumaker <lukeshu@lukeshu.com>
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

#include <libmisc/map.h>

#include "test.h"

MAP_DECLARE(intmap, int, int);

int main() {
	struct intmap m = {};
	test_assert(map_len(&m) == 0);

	int *v = map_store(&m, 3, 8);
	test_assert(v && *v == 8);
	test_assert(map_len(&m) == 1);

	v = map_load(&m, 3);
	test_assert(v);
	test_assert(*v == 8);

	v = NULL;

	test_assert(map_del(&m, 3));
	test_assert(map_len(&m) == 0);
	test_assert(!map_del(&m, 3));

	map_store(&m, 1, 11);
	map_store(&m, 2, 12);
	map_store(&m, 3, 13);
	test_assert(map_len(&m) == 3);
	bool seen_1 = false, seen_2 = false, seen_3 = false;
	MAP_FOREACH(&m, ik, iv) {
		switch (ik) {
		case 1: seen_1 = true; break;
		case 2: seen_2 = true; break;
		case 3: seen_3 = true; break;
		}
		switch (ik) {
		case 1: case 2: case 3:
			map_store(&m, ik+20, (*iv)+20);
			test_assert(map_del(&m, ik));
			test_assert(!map_del(&m, ik));
			test_assert(map_load(&m, ik) == NULL);
			break;
		}
	}
	test_assert(map_len(&m) == 3);
	test_assert(seen_1); v = map_load(&m, 21); test_assert(v && *v == 31); v = map_load(&m, 1); test_assert(!v);
	test_assert(seen_2); v = map_load(&m, 22); test_assert(v && *v == 32); v = map_load(&m, 2); test_assert(!v);
	test_assert(seen_3); v = map_load(&m, 23); test_assert(v && *v == 33); v = map_load(&m, 3); test_assert(!v);

	map_free(&m);
	test_assert(map_len(&m) == 0);

	return 0;
}