summaryrefslogtreecommitdiff
path: root/ccan/tal/str/test/run.c
blob: 4b9cf1fb5581e2a1596733f098f1bbc33e3540b0 (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <ccan/tal/str/str.h>
#include <stdlib.h>
#include <stdio.h>
#include <ccan/tal/str/str.c>
#include <ccan/tap/tap.h>
#include "helper.h"

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))

static const char *substrings[]
= { "far", "bar", "baz", "b", "ba", "z", "ar", NULL };

int main(int argc, char *argv[])
{
	char **split, *str;
	void *ctx;

	plan_tests(69);
	split = tal_strsplit(NULL, "hello  world", " ", STR_EMPTY_OK);
	ok1(!strcmp(split[0], "hello"));
	ok1(!strcmp(split[1], ""));
	ok1(!strcmp(split[2], "world"));
	ok1(split[3] == NULL);
	ok1(tal_count(split) == 4);
	tal_free(split);

	split = tal_strsplit(NULL, "hello  world", " ", STR_NO_EMPTY);
	ok1(!strcmp(split[0], "hello"));
	ok1(!strcmp(split[1], "world"));
	ok1(split[2] == NULL);
	ok1(tal_count(split) == 3);
	tal_free(split);

	split = tal_strsplit(NULL, "  hello  world", " ", STR_NO_EMPTY);
	ok1(!strcmp(split[0], "hello"));
	ok1(!strcmp(split[1], "world"));
	ok1(split[2] == NULL);
	ok1(tal_count(split) == 3);
	tal_free(split);

	split = tal_strsplit(NULL, "hello  world", "o ", STR_EMPTY_OK);
	ok1(!strcmp(split[0], "hell"));
	ok1(!strcmp(split[1], ""));
	ok1(!strcmp(split[2], ""));
	ok1(!strcmp(split[3], "w"));
	ok1(!strcmp(split[4], "rld"));
	ok1(split[5] == NULL);
	ok1(tal_count(split) == 6);

	ctx = split;
	split = tal_strsplit(ctx, "hello  world", "o ", STR_EMPTY_OK);
	ok1(tal_parent(split) == ctx);
	tal_free(ctx);

	str = tal_strjoin(NULL, (char **)substrings, ", ", STR_TRAIL);
	ok1(!strcmp(str, "far, bar, baz, b, ba, z, ar, "));
	ctx = str;
	str = tal_strjoin(ctx, (char **)substrings, "", STR_TRAIL);
	ok1(!strcmp(str, "farbarbazbbazar"));
	ok1(tal_parent(str) == ctx);
	str = tal_strjoin(ctx, (char **)substrings, ", ", STR_NO_TRAIL);
	ok1(tal_parent(str) == ctx);
	ok1(!strcmp(str, "far, bar, baz, b, ba, z, ar"));
	str = tal_strjoin(ctx, (char **)substrings, "", STR_NO_TRAIL);
	ok1(!strcmp(str, "farbarbazbbazar"));
	ok1(tal_parent(str) == ctx);
	tal_free(ctx);

	ctx = tal_strdup(NULL, "context");
	/* Pass through NULLs from take. */
	ok1(tal_strsplit(NULL, take(NULL), " ", STR_EMPTY_OK) == NULL);
	ok1(tal_strsplit(NULL, "foo", take(NULL), STR_EMPTY_OK) == NULL);

	/* tal_strsplit take string.  It reallocs it to same size, but
	 * that sometimes causes a move, so we can't directly check
	 * that split[0] == str. */
	str = tal_strdup(ctx, "hello world");
	ok1(tal_check(ctx, NULL));
	ok1(tal_check(str, NULL));
	split = tal_strsplit(ctx, take(str), " ", STR_EMPTY_OK);
	ok1(tal_parent(split) == ctx);
	ok1(!strcmp(split[0], "hello"));
	ok1(!strcmp(split[1], "world"));
	ok1(split[2] == NULL);
	ok1(tal_check(split, NULL));
	ok1(tal_check(ctx, NULL));
	tal_free(split);
	/* Previous free should get rid of str */
	ok1(no_children(ctx));

	/* tal_strsplit take delims */
	str = tal_strdup(ctx, " ");
	split = tal_strsplit(ctx, "hello world", take(str), STR_EMPTY_OK);
	ok1(tal_parent(split) == ctx);
	ok1(!strcmp(split[0], "hello"));
	ok1(!strcmp(split[1], "world"));
	ok1(split[2] == NULL);
	ok1(tal_check(split, NULL));
	ok1(tal_check(ctx, NULL));
	tal_free(split);
	/* str is gone... */
	ok1(no_children(ctx));

	/* tal_strsplit takes both. */
	split = tal_strsplit(ctx, take(tal_strdup(NULL, "hello world")),
			     take(tal_strdup(NULL, " ")), STR_EMPTY_OK);
	ok1(tal_parent(split) == ctx);
	ok1(!strcmp(split[0], "hello"));
	ok1(!strcmp(split[1], "world"));
	ok1(split[2] == NULL);
	ok1(tal_check(split, NULL));
	ok1(tal_check(ctx, NULL));
	tal_free(split);
	/* temp allocs are gone... */
	ok1(no_children(ctx));

	/* tal_strjoin passthrough taken NULLs OK. */
	ok1(tal_strjoin(ctx, take(NULL), "", STR_TRAIL) == NULL);
	ok1(tal_strjoin(ctx, take(NULL), "", STR_NO_TRAIL) == NULL);
	ok1(tal_strjoin(ctx, split, take(NULL), STR_TRAIL) == NULL);
	ok1(tal_strjoin(ctx, split, take(NULL), STR_NO_TRAIL) == NULL);

	/* tal_strjoin take strings[] */
	split = tal_strsplit(ctx, "hello world", " ", STR_EMPTY_OK);
	str = tal_strjoin(ctx, take(split), " there ", STR_NO_TRAIL);
	ok1(!strcmp(str, "hello there world"));
	ok1(tal_parent(str) == ctx);
	/* split is gone... */
	ok1(single_child(ctx, str));
	tal_free(str);
	ok1(no_children(ctx));

	/* tal_strjoin take delim */
	split = tal_strsplit(ctx, "hello world", " ", STR_EMPTY_OK);
	str = tal_strjoin(ctx, split, take(tal_strdup(ctx, " there ")),
			  STR_NO_TRAIL);
	ok1(!strcmp(str, "hello there world"));
	ok1(tal_parent(str) == ctx);
	tal_free(split);
	/* tmp alloc is gone, str is only remainder. */
	ok1(single_child(ctx, str));
	tal_free(str);
	ok1(no_children(ctx));

	/* tal_strjoin take both. */
	str = tal_strjoin(ctx, take(tal_strsplit(ctx, "hello world", " ",
						 STR_EMPTY_OK)),
			  take(tal_strdup(ctx, " there ")), STR_NO_TRAIL);
	ok1(!strcmp(str, "hello there world"));
	ok1(tal_parent(str) == ctx);
	/* tmp allocs are gone, str is only remainder. */
	ok1(single_child(ctx, str));
	tal_free(str);
	ok1(no_children(ctx));
	tal_free(ctx);

	return exit_status();
}