1 #include <ccan/tal/str/str.h>
4 #include <ccan/tal/str/str.c>
5 #include <ccan/tap/tap.h>
8 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
10 static const char *substrings[]
11 = { "far", "bar", "baz", "b", "ba", "z", "ar", NULL };
19 split = tal_strsplit(NULL, "hello world", " ", STR_EMPTY_OK);
20 ok1(!strcmp(split[0], "hello"));
21 ok1(!strcmp(split[1], ""));
22 ok1(!strcmp(split[2], "world"));
23 ok1(split[3] == NULL);
24 ok1(tal_count(split) == 4);
27 split = tal_strsplit(NULL, "hello world", " ", STR_NO_EMPTY);
28 ok1(!strcmp(split[0], "hello"));
29 ok1(!strcmp(split[1], "world"));
30 ok1(split[2] == NULL);
31 ok1(tal_count(split) == 3);
34 split = tal_strsplit(NULL, " hello world", " ", STR_NO_EMPTY);
35 ok1(!strcmp(split[0], "hello"));
36 ok1(!strcmp(split[1], "world"));
37 ok1(split[2] == NULL);
38 ok1(tal_count(split) == 3);
41 split = tal_strsplit(NULL, "hello world", "o ", STR_EMPTY_OK);
42 ok1(!strcmp(split[0], "hell"));
43 ok1(!strcmp(split[1], ""));
44 ok1(!strcmp(split[2], ""));
45 ok1(!strcmp(split[3], "w"));
46 ok1(!strcmp(split[4], "rld"));
47 ok1(split[5] == NULL);
48 ok1(tal_count(split) == 6);
51 split = tal_strsplit(ctx, "hello world", "o ", STR_EMPTY_OK);
52 ok1(tal_parent(split) == ctx);
55 str = tal_strjoin(NULL, (char **)substrings, ", ", STR_TRAIL);
56 ok1(!strcmp(str, "far, bar, baz, b, ba, z, ar, "));
57 ok1(tal_count(str) == strlen(str) + 1);
59 str = tal_strjoin(ctx, (char **)substrings, "", STR_TRAIL);
60 ok1(!strcmp(str, "farbarbazbbazar"));
61 ok1(tal_count(str) == strlen(str) + 1);
62 ok1(tal_parent(str) == ctx);
63 str = tal_strjoin(ctx, (char **)substrings, ", ", STR_NO_TRAIL);
64 ok1(tal_parent(str) == ctx);
65 ok1(!strcmp(str, "far, bar, baz, b, ba, z, ar"));
66 ok1(tal_count(str) == strlen(str) + 1);
67 str = tal_strjoin(ctx, (char **)substrings, "", STR_NO_TRAIL);
68 ok1(!strcmp(str, "farbarbazbbazar"));
69 ok1(tal_parent(str) == ctx);
70 ok1(tal_count(str) == strlen(str) + 1);
73 ctx = tal_strdup(NULL, "context");
74 /* Pass through NULLs from take. */
75 ok1(tal_strsplit(NULL, take(NULL), " ", STR_EMPTY_OK) == NULL);
76 ok1(tal_strsplit(NULL, "foo", take(NULL), STR_EMPTY_OK) == NULL);
78 /* tal_strsplit take string. It reallocs it to same size, but
79 * that sometimes causes a move, so we can't directly check
80 * that split[0] == str. */
81 str = tal_strdup(ctx, "hello world");
82 ok1(tal_check(ctx, NULL));
83 ok1(tal_check(str, NULL));
84 ok1(tal_count(str) == strlen(str) + 1);
85 split = tal_strsplit(ctx, take(str), " ", STR_EMPTY_OK);
86 ok1(tal_parent(split) == ctx);
87 ok1(!strcmp(split[0], "hello"));
88 ok1(!strcmp(split[1], "world"));
89 ok1(split[2] == NULL);
90 ok1(tal_check(split, NULL));
91 ok1(tal_check(ctx, NULL));
93 /* Previous free should get rid of str */
94 ok1(no_children(ctx));
96 /* tal_strsplit take delims */
97 str = tal_strdup(ctx, " ");
98 ok1(tal_count(str) == strlen(str) + 1);
99 split = tal_strsplit(ctx, "hello world", take(str), STR_EMPTY_OK);
100 ok1(tal_parent(split) == ctx);
101 ok1(!strcmp(split[0], "hello"));
102 ok1(!strcmp(split[1], "world"));
103 ok1(split[2] == NULL);
104 ok1(tal_check(split, NULL));
105 ok1(tal_check(ctx, NULL));
108 ok1(no_children(ctx));
110 /* tal_strsplit takes both. */
111 split = tal_strsplit(ctx, take(tal_strdup(NULL, "hello world")),
112 take(tal_strdup(NULL, " ")), STR_EMPTY_OK);
113 ok1(tal_parent(split) == ctx);
114 ok1(!strcmp(split[0], "hello"));
115 ok1(!strcmp(split[1], "world"));
116 ok1(split[2] == NULL);
117 ok1(tal_check(split, NULL));
118 ok1(tal_check(ctx, NULL));
120 /* temp allocs are gone... */
121 ok1(no_children(ctx));
123 /* tal_strjoin passthrough taken NULLs OK. */
124 ok1(tal_strjoin(ctx, take(NULL), "", STR_TRAIL) == NULL);
125 ok1(tal_strjoin(ctx, take(NULL), "", STR_NO_TRAIL) == NULL);
126 ok1(tal_strjoin(ctx, split, take(NULL), STR_TRAIL) == NULL);
127 ok1(tal_strjoin(ctx, split, take(NULL), STR_NO_TRAIL) == NULL);
129 /* tal_strjoin take strings[] */
130 split = tal_strsplit(ctx, "hello world", " ", STR_EMPTY_OK);
131 str = tal_strjoin(ctx, take(split), " there ", STR_NO_TRAIL);
132 ok1(!strcmp(str, "hello there world"));
133 ok1(tal_count(str) == strlen(str) + 1);
134 ok1(tal_parent(str) == ctx);
135 /* split is gone... */
136 ok1(single_child(ctx, str));
138 ok1(no_children(ctx));
140 /* tal_strjoin take delim */
141 split = tal_strsplit(ctx, "hello world", " ", STR_EMPTY_OK);
142 str = tal_strjoin(ctx, split, take(tal_strdup(ctx, " there ")),
144 ok1(!strcmp(str, "hello there world"));
145 ok1(tal_parent(str) == ctx);
146 ok1(tal_count(str) == strlen(str) + 1);
148 /* tmp alloc is gone, str is only remainder. */
149 ok1(single_child(ctx, str));
151 ok1(no_children(ctx));
153 /* tal_strjoin take both. */
154 str = tal_strjoin(ctx, take(tal_strsplit(ctx, "hello world", " ",
156 take(tal_strdup(ctx, " there ")), STR_NO_TRAIL);
157 ok1(!strcmp(str, "hello there world"));
158 ok1(tal_count(str) == strlen(str) + 1);
159 ok1(tal_parent(str) == ctx);
160 /* tmp allocs are gone, str is only remainder. */
161 ok1(single_child(ctx, str));
163 ok1(no_children(ctx));
166 return exit_status();