summaryrefslogtreecommitdiff
path: root/ccan/strset/test/run-prefix.c
blob: e88f2dd0c141ae185b576b93750a50dd335a6f43 (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
#include <ccan/strset/strset.h>
#include <ccan/strset/strset.c>
#include <ccan/tap/tap.h>
#include <stdio.h>

/* Must be > 100, see below. */
#define NUM 200

static bool in_order(const char *value, unsigned int *count)
{
	int i = atoi(value);
	ok1(*count == i);
	(*count)++;
	return true;
}

static bool find_empty(const char *value, char *empty)
{
	if (value == empty)
		pass("Found empty entry!");
	return true;
}

int main(void)
{
	struct strset set;
	const struct strset *sub;
	unsigned int i;
	char *str[NUM], *empty;

	plan_tests(7 + 1 + 10 + 100);
	strset_init(&set);

	for (i = 0; i < NUM; i++) {
		char template[10];
		sprintf(template, "%08u", i);
		str[i] = strdup(template);
	}

	for (i = 0; i < NUM; i++)
		strset_add(&set, str[i]);

	/* Nothing */
	sub = strset_prefix(&set, "a");
	ok1(strset_empty(sub));

	/* Everything */
	sub = strset_prefix(&set, "0");
	ok1(sub->u.n == set.u.n);
	sub = strset_prefix(&set, "");
	ok1(sub->u.n == set.u.n);

	/* Singleton. */
	sub = strset_prefix(&set, "00000000");
	i = 0;
	strset_iterate(sub, in_order, &i);
	ok1(i == 1);

	/* First 10. */
	sub = strset_prefix(&set, "0000000");
	i = 0;
	strset_iterate(sub, in_order, &i);
	ok1(i == 10);

	/* First 100. */
	sub = strset_prefix(&set, "000000");
	i = 0;
	strset_iterate(sub, in_order, &i);
	ok1(i == 100);

	/* Everything, *plus* empty string. */
	empty = strdup("");
	strset_add(&set, empty);

	sub = strset_prefix(&set, "");
	/* Check we get *our* empty string back! */
	strset_iterate(sub, find_empty, empty);

	strset_clear(&set);

	for (i = 0; i < NUM; i++)
		free(str[i]);
	free(empty);

	/* This exits depending on whether all tests passed */
	return exit_status();
}