xref: /netbsd-src/external/bsd/atf/dist/atf-c/detail/map_test.c (revision a551a20f66d65b75aa4c2dddf3e2e6f08dbfaf61)
1895f502bSjmmv /*
2895f502bSjmmv  * Automated Testing Framework (atf)
3895f502bSjmmv  *
4*a551a20fSjmmv  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5895f502bSjmmv  * All rights reserved.
6895f502bSjmmv  *
7895f502bSjmmv  * Redistribution and use in source and binary forms, with or without
8895f502bSjmmv  * modification, are permitted provided that the following conditions
9895f502bSjmmv  * are met:
10895f502bSjmmv  * 1. Redistributions of source code must retain the above copyright
11895f502bSjmmv  *    notice, this list of conditions and the following disclaimer.
12895f502bSjmmv  * 2. Redistributions in binary form must reproduce the above copyright
13895f502bSjmmv  *    notice, this list of conditions and the following disclaimer in the
14895f502bSjmmv  *    documentation and/or other materials provided with the distribution.
15895f502bSjmmv  *
16895f502bSjmmv  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17895f502bSjmmv  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18895f502bSjmmv  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19895f502bSjmmv  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20895f502bSjmmv  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21895f502bSjmmv  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22895f502bSjmmv  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23895f502bSjmmv  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24895f502bSjmmv  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25895f502bSjmmv  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26895f502bSjmmv  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27895f502bSjmmv  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28895f502bSjmmv  */
29895f502bSjmmv 
30895f502bSjmmv #include <stdio.h>
31895f502bSjmmv #include <string.h>
32895f502bSjmmv 
33895f502bSjmmv #include <atf-c.h>
34895f502bSjmmv 
35895f502bSjmmv #include "atf-c/utils.h"
36895f502bSjmmv 
37895f502bSjmmv #include "map.h"
38895f502bSjmmv #include "test_helpers.h"
39895f502bSjmmv 
40895f502bSjmmv /* ---------------------------------------------------------------------
41895f502bSjmmv  * Tests for the "atf_map" type.
42895f502bSjmmv  * --------------------------------------------------------------------- */
43895f502bSjmmv 
44895f502bSjmmv /*
45895f502bSjmmv  * Constructors and destructors.
46895f502bSjmmv  */
47895f502bSjmmv 
48895f502bSjmmv ATF_TC(map_init);
ATF_TC_HEAD(map_init,tc)49895f502bSjmmv ATF_TC_HEAD(map_init, tc)
50895f502bSjmmv {
51895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the atf_map_init function");
52895f502bSjmmv }
ATF_TC_BODY(map_init,tc)53895f502bSjmmv ATF_TC_BODY(map_init, tc)
54895f502bSjmmv {
55895f502bSjmmv     atf_map_t map;
56895f502bSjmmv 
57895f502bSjmmv     RE(atf_map_init(&map));
58895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 0);
59895f502bSjmmv     atf_map_fini(&map);
60895f502bSjmmv }
61895f502bSjmmv 
62895f502bSjmmv ATF_TC_WITHOUT_HEAD(map_init_charpp_null);
ATF_TC_BODY(map_init_charpp_null,tc)63895f502bSjmmv ATF_TC_BODY(map_init_charpp_null, tc)
64895f502bSjmmv {
65895f502bSjmmv     atf_map_t map;
66895f502bSjmmv 
67895f502bSjmmv     RE(atf_map_init_charpp(&map, NULL));
68895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 0);
69895f502bSjmmv     atf_map_fini(&map);
70895f502bSjmmv }
71895f502bSjmmv 
72895f502bSjmmv ATF_TC_WITHOUT_HEAD(map_init_charpp_empty);
ATF_TC_BODY(map_init_charpp_empty,tc)73895f502bSjmmv ATF_TC_BODY(map_init_charpp_empty, tc)
74895f502bSjmmv {
75895f502bSjmmv     const char *const array[] = { NULL };
76895f502bSjmmv     atf_map_t map;
77895f502bSjmmv 
78895f502bSjmmv     RE(atf_map_init_charpp(&map, array));
79895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 0);
80895f502bSjmmv     atf_map_fini(&map);
81895f502bSjmmv }
82895f502bSjmmv 
83895f502bSjmmv ATF_TC_WITHOUT_HEAD(map_init_charpp_some);
ATF_TC_BODY(map_init_charpp_some,tc)84895f502bSjmmv ATF_TC_BODY(map_init_charpp_some, tc)
85895f502bSjmmv {
86895f502bSjmmv     const char *const array[] = { "K1", "V1", "K2", "V2", NULL };
87895f502bSjmmv     atf_map_t map;
88895f502bSjmmv     atf_map_citer_t iter;
89895f502bSjmmv 
90895f502bSjmmv     RE(atf_map_init_charpp(&map, array));
91895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 2);
92895f502bSjmmv 
93895f502bSjmmv     iter = atf_map_find_c(&map, "K1");
94895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
95895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0);
96895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0);
97895f502bSjmmv 
98895f502bSjmmv     iter = atf_map_find_c(&map, "K2");
99895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
100895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0);
101895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0);
102895f502bSjmmv 
103895f502bSjmmv     atf_map_fini(&map);
104895f502bSjmmv }
105895f502bSjmmv 
106895f502bSjmmv ATF_TC_WITHOUT_HEAD(map_init_charpp_short);
ATF_TC_BODY(map_init_charpp_short,tc)107895f502bSjmmv ATF_TC_BODY(map_init_charpp_short, tc)
108895f502bSjmmv {
109895f502bSjmmv     const char *const array[] = { "K1", "V1", "K2", NULL };
110895f502bSjmmv     atf_map_t map;
111895f502bSjmmv 
112895f502bSjmmv     atf_error_t err = atf_map_init_charpp(&map, array);
113895f502bSjmmv     ATF_REQUIRE(atf_is_error(err));
114895f502bSjmmv     ATF_REQUIRE(atf_error_is(err, "libc"));
115895f502bSjmmv }
116895f502bSjmmv 
117895f502bSjmmv /*
118895f502bSjmmv  * Getters.
119895f502bSjmmv  */
120895f502bSjmmv 
121895f502bSjmmv ATF_TC(find);
ATF_TC_HEAD(find,tc)122895f502bSjmmv ATF_TC_HEAD(find, tc)
123895f502bSjmmv {
124895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find function");
125895f502bSjmmv }
ATF_TC_BODY(find,tc)126895f502bSjmmv ATF_TC_BODY(find, tc)
127895f502bSjmmv {
128895f502bSjmmv     atf_map_t map;
129895f502bSjmmv     char val1[] = "V1";
130895f502bSjmmv     char val2[] = "V2";
131895f502bSjmmv     atf_map_iter_t iter;
132895f502bSjmmv 
133895f502bSjmmv     RE(atf_map_init(&map));
134895f502bSjmmv     RE(atf_map_insert(&map, "K1", val1, false));
135895f502bSjmmv     RE(atf_map_insert(&map, "K2", val2, false));
136895f502bSjmmv 
137895f502bSjmmv     iter = atf_map_find(&map, "K0");
138895f502bSjmmv     ATF_REQUIRE(atf_equal_map_iter_map_iter(iter, atf_map_end(&map)));
139895f502bSjmmv 
140895f502bSjmmv     iter = atf_map_find(&map, "K1");
141895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map)));
142895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0);
143895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V1") == 0);
144895f502bSjmmv     strcpy(atf_map_iter_data(iter), "Z1");
145895f502bSjmmv 
146895f502bSjmmv     iter = atf_map_find(&map, "K1");
147895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map)));
148895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0);
149895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "Z1") == 0);
150895f502bSjmmv 
151895f502bSjmmv     iter = atf_map_find(&map, "K2");
152895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map)));
153895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K2") == 0);
154895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V2") == 0);
155895f502bSjmmv 
156895f502bSjmmv     atf_map_fini(&map);
157895f502bSjmmv }
158895f502bSjmmv 
159895f502bSjmmv ATF_TC(find_c);
ATF_TC_HEAD(find_c,tc)160895f502bSjmmv ATF_TC_HEAD(find_c, tc)
161895f502bSjmmv {
162895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find_c function");
163895f502bSjmmv }
ATF_TC_BODY(find_c,tc)164895f502bSjmmv ATF_TC_BODY(find_c, tc)
165895f502bSjmmv {
166895f502bSjmmv     atf_map_t map;
167895f502bSjmmv     char val1[] = "V1";
168895f502bSjmmv     char val2[] = "V2";
169895f502bSjmmv     atf_map_citer_t iter;
170895f502bSjmmv 
171895f502bSjmmv     RE(atf_map_init(&map));
172895f502bSjmmv     RE(atf_map_insert(&map, "K1", val1, false));
173895f502bSjmmv     RE(atf_map_insert(&map, "K2", val2, false));
174895f502bSjmmv 
175895f502bSjmmv     iter = atf_map_find_c(&map, "K0");
176895f502bSjmmv     ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
177895f502bSjmmv 
178895f502bSjmmv     iter = atf_map_find_c(&map, "K1");
179895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
180895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0);
181895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0);
182895f502bSjmmv 
183895f502bSjmmv     iter = atf_map_find_c(&map, "K2");
184895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
185895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0);
186895f502bSjmmv     ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0);
187895f502bSjmmv 
188895f502bSjmmv     atf_map_fini(&map);
189895f502bSjmmv }
190895f502bSjmmv 
191895f502bSjmmv ATF_TC_WITHOUT_HEAD(to_charpp_empty);
ATF_TC_BODY(to_charpp_empty,tc)192895f502bSjmmv ATF_TC_BODY(to_charpp_empty, tc)
193895f502bSjmmv {
194895f502bSjmmv     atf_map_t map;
195895f502bSjmmv     char **array;
196895f502bSjmmv 
197895f502bSjmmv     RE(atf_map_init(&map));
198895f502bSjmmv     ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL);
199895f502bSjmmv     atf_map_fini(&map);
200895f502bSjmmv 
201895f502bSjmmv     ATF_CHECK_EQ(NULL, array[0]);
202895f502bSjmmv     atf_utils_free_charpp(array);
203895f502bSjmmv }
204895f502bSjmmv 
205895f502bSjmmv ATF_TC_WITHOUT_HEAD(to_charpp_some);
ATF_TC_BODY(to_charpp_some,tc)206895f502bSjmmv ATF_TC_BODY(to_charpp_some, tc)
207895f502bSjmmv {
208895f502bSjmmv     atf_map_t map;
209895f502bSjmmv     char **array;
210895f502bSjmmv 
211895f502bSjmmv     char s1[] = "one";
212895f502bSjmmv     char s2[] = "two";
213895f502bSjmmv     char s3[] = "three";
214895f502bSjmmv 
215895f502bSjmmv     RE(atf_map_init(&map));
216895f502bSjmmv     RE(atf_map_insert(&map, "K1", s1, false));
217895f502bSjmmv     RE(atf_map_insert(&map, "K2", s2, false));
218895f502bSjmmv     RE(atf_map_insert(&map, "K3", s3, false));
219895f502bSjmmv     ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL);
220895f502bSjmmv     atf_map_fini(&map);
221895f502bSjmmv 
222895f502bSjmmv     ATF_CHECK_STREQ("K1", array[0]);
223895f502bSjmmv     ATF_CHECK_STREQ("one", array[1]);
224895f502bSjmmv     ATF_CHECK_STREQ("K2", array[2]);
225895f502bSjmmv     ATF_CHECK_STREQ("two", array[3]);
226895f502bSjmmv     ATF_CHECK_STREQ("K3", array[4]);
227895f502bSjmmv     ATF_CHECK_STREQ("three", array[5]);
228895f502bSjmmv     ATF_CHECK_EQ(NULL, array[6]);
229895f502bSjmmv     atf_utils_free_charpp(array);
230895f502bSjmmv }
231895f502bSjmmv 
232895f502bSjmmv /*
233895f502bSjmmv  * Modifiers.
234895f502bSjmmv  */
235895f502bSjmmv 
236895f502bSjmmv ATF_TC(map_insert);
ATF_TC_HEAD(map_insert,tc)237895f502bSjmmv ATF_TC_HEAD(map_insert, tc)
238895f502bSjmmv {
239895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the atf_map_insert function");
240895f502bSjmmv }
ATF_TC_BODY(map_insert,tc)241895f502bSjmmv ATF_TC_BODY(map_insert, tc)
242895f502bSjmmv {
243895f502bSjmmv     atf_map_t map;
244895f502bSjmmv     char buf[] = "1st test string";
245895f502bSjmmv     char buf2[] = "2nd test string";
246895f502bSjmmv     const char *ptr;
247895f502bSjmmv     atf_map_citer_t iter;
248895f502bSjmmv 
249895f502bSjmmv     RE(atf_map_init(&map));
250895f502bSjmmv 
251895f502bSjmmv     printf("Inserting some values\n");
252895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 0);
253895f502bSjmmv     RE(atf_map_insert(&map, "K1", buf, false));
254895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 1);
255895f502bSjmmv     RE(atf_map_insert(&map, "K2", buf, false));
256895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 2);
257895f502bSjmmv     RE(atf_map_insert(&map, "K3", buf, false));
258895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 3);
259895f502bSjmmv 
260895f502bSjmmv     printf("Replacing a value\n");
261895f502bSjmmv     iter = atf_map_find_c(&map, "K3");
262895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
263895f502bSjmmv     ptr = atf_map_citer_data(iter);
264895f502bSjmmv     ATF_REQUIRE_EQ(ptr, buf);
265895f502bSjmmv     RE(atf_map_insert(&map, "K3", buf2, false));
266895f502bSjmmv     ATF_REQUIRE_EQ(atf_map_size(&map), 3);
267895f502bSjmmv     iter = atf_map_find_c(&map, "K3");
268895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
269895f502bSjmmv     ptr = atf_map_citer_data(iter);
270895f502bSjmmv     ATF_REQUIRE_EQ(ptr, buf2);
271895f502bSjmmv 
272895f502bSjmmv     atf_map_fini(&map);
273895f502bSjmmv }
274895f502bSjmmv 
275895f502bSjmmv /*
276895f502bSjmmv  * Macros.
277895f502bSjmmv  */
278895f502bSjmmv 
279895f502bSjmmv ATF_TC(map_for_each);
ATF_TC_HEAD(map_for_each,tc)280895f502bSjmmv ATF_TC_HEAD(map_for_each, tc)
281895f502bSjmmv {
282895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each macro");
283895f502bSjmmv }
ATF_TC_BODY(map_for_each,tc)284895f502bSjmmv ATF_TC_BODY(map_for_each, tc)
285895f502bSjmmv {
286895f502bSjmmv     atf_map_t map;
287895f502bSjmmv     atf_map_iter_t iter;
288895f502bSjmmv     size_t count, i, size;
289895f502bSjmmv     char keys[10][5];
290895f502bSjmmv     int nums[10];
291895f502bSjmmv 
292895f502bSjmmv     printf("Iterating over empty map\n");
293895f502bSjmmv     RE(atf_map_init(&map));
294895f502bSjmmv     count = 0;
295895f502bSjmmv     atf_map_for_each(iter, &map) {
296895f502bSjmmv         count++;
297895f502bSjmmv         printf("Item count is now %zd\n", count);
298895f502bSjmmv     }
299895f502bSjmmv     ATF_REQUIRE_EQ(count, 0);
300895f502bSjmmv     atf_map_fini(&map);
301895f502bSjmmv 
302895f502bSjmmv     for (size = 0; size <= 10; size++) {
303895f502bSjmmv         printf("Iterating over map of %zd elements\n", size);
304895f502bSjmmv         RE(atf_map_init(&map));
305895f502bSjmmv         for (i = 0; i < size; i++) {
306895f502bSjmmv             nums[i] = i + 1;
307895f502bSjmmv             snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]);
308895f502bSjmmv             RE(atf_map_insert(&map, keys[i], &nums[i], false));
309895f502bSjmmv         }
310895f502bSjmmv         count = 0;
311895f502bSjmmv         atf_map_for_each(iter, &map) {
312895f502bSjmmv             printf("Retrieved item: %d\n", *(int *)atf_map_iter_data(iter));
313895f502bSjmmv             count++;
314895f502bSjmmv         }
315895f502bSjmmv         ATF_REQUIRE_EQ(count, size);
316895f502bSjmmv         atf_map_fini(&map);
317895f502bSjmmv     }
318895f502bSjmmv }
319895f502bSjmmv 
320895f502bSjmmv ATF_TC(map_for_each_c);
ATF_TC_HEAD(map_for_each_c,tc)321895f502bSjmmv ATF_TC_HEAD(map_for_each_c, tc)
322895f502bSjmmv {
323895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each_c macro");
324895f502bSjmmv }
ATF_TC_BODY(map_for_each_c,tc)325895f502bSjmmv ATF_TC_BODY(map_for_each_c, tc)
326895f502bSjmmv {
327895f502bSjmmv     atf_map_t map;
328895f502bSjmmv     atf_map_citer_t iter;
329895f502bSjmmv     size_t count, i, size;
330895f502bSjmmv     char keys[10][5];
331895f502bSjmmv     int nums[10];
332895f502bSjmmv 
333895f502bSjmmv     printf("Iterating over empty map\n");
334895f502bSjmmv     RE(atf_map_init(&map));
335895f502bSjmmv     count = 0;
336895f502bSjmmv     atf_map_for_each_c(iter, &map) {
337895f502bSjmmv         count++;
338895f502bSjmmv         printf("Item count is now %zd\n", count);
339895f502bSjmmv     }
340895f502bSjmmv     ATF_REQUIRE_EQ(count, 0);
341895f502bSjmmv     atf_map_fini(&map);
342895f502bSjmmv 
343895f502bSjmmv     for (size = 0; size <= 10; size++) {
344895f502bSjmmv         printf("Iterating over map of %zd elements\n", size);
345895f502bSjmmv         RE(atf_map_init(&map));
346895f502bSjmmv         for (i = 0; i < size; i++) {
347895f502bSjmmv             nums[i] = i + 1;
348895f502bSjmmv             snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]);
349895f502bSjmmv             RE(atf_map_insert(&map, keys[i], &nums[i], false));
350895f502bSjmmv         }
351895f502bSjmmv         count = 0;
352895f502bSjmmv         atf_map_for_each_c(iter, &map) {
353895f502bSjmmv             printf("Retrieved item: %d\n",
354895f502bSjmmv                    *(const int *)atf_map_citer_data(iter));
355895f502bSjmmv             count++;
356895f502bSjmmv         }
357895f502bSjmmv         ATF_REQUIRE_EQ(count, size);
358895f502bSjmmv         atf_map_fini(&map);
359895f502bSjmmv     }
360895f502bSjmmv }
361895f502bSjmmv 
362895f502bSjmmv /*
363895f502bSjmmv  * Other.
364895f502bSjmmv  */
365895f502bSjmmv 
366895f502bSjmmv ATF_TC(stable_keys);
ATF_TC_HEAD(stable_keys,tc)367895f502bSjmmv ATF_TC_HEAD(stable_keys, tc)
368895f502bSjmmv {
369895f502bSjmmv     atf_tc_set_md_var(tc, "descr", "Checks that the keys do not change "
370895f502bSjmmv                       "even if their original values do");
371895f502bSjmmv }
ATF_TC_BODY(stable_keys,tc)372895f502bSjmmv ATF_TC_BODY(stable_keys, tc)
373895f502bSjmmv {
374895f502bSjmmv     atf_map_t map;
375895f502bSjmmv     atf_map_citer_t iter;
376895f502bSjmmv     char key[] = "K1";
377895f502bSjmmv 
378895f502bSjmmv     RE(atf_map_init(&map));
379895f502bSjmmv 
380895f502bSjmmv     RE(atf_map_insert(&map, key, strdup("test-value"), true));
381895f502bSjmmv     iter = atf_map_find_c(&map, "K1");
382895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
383895f502bSjmmv     iter = atf_map_find_c(&map, "K2");
384895f502bSjmmv     ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
385895f502bSjmmv 
386895f502bSjmmv     strcpy(key, "K2");
387895f502bSjmmv     iter = atf_map_find_c(&map, "K1");
388895f502bSjmmv     ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
389895f502bSjmmv     iter = atf_map_find_c(&map, "K2");
390895f502bSjmmv     ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map)));
391895f502bSjmmv 
392895f502bSjmmv     atf_map_fini(&map);
393895f502bSjmmv }
394895f502bSjmmv 
395895f502bSjmmv /* ---------------------------------------------------------------------
396895f502bSjmmv  * Main.
397895f502bSjmmv  * --------------------------------------------------------------------- */
398895f502bSjmmv 
ATF_TP_ADD_TCS(tp)399895f502bSjmmv ATF_TP_ADD_TCS(tp)
400895f502bSjmmv {
401895f502bSjmmv     /* Constructors and destructors. */
402895f502bSjmmv     ATF_TP_ADD_TC(tp, map_init);
403895f502bSjmmv     ATF_TP_ADD_TC(tp, map_init_charpp_null);
404895f502bSjmmv     ATF_TP_ADD_TC(tp, map_init_charpp_empty);
405895f502bSjmmv     ATF_TP_ADD_TC(tp, map_init_charpp_some);
406895f502bSjmmv     ATF_TP_ADD_TC(tp, map_init_charpp_short);
407895f502bSjmmv 
408895f502bSjmmv     /* Getters. */
409895f502bSjmmv     ATF_TP_ADD_TC(tp, find);
410895f502bSjmmv     ATF_TP_ADD_TC(tp, find_c);
411895f502bSjmmv     ATF_TP_ADD_TC(tp, to_charpp_empty);
412895f502bSjmmv     ATF_TP_ADD_TC(tp, to_charpp_some);
413895f502bSjmmv 
414895f502bSjmmv     /* Modifiers. */
415895f502bSjmmv     ATF_TP_ADD_TC(tp, map_insert);
416895f502bSjmmv 
417895f502bSjmmv     /* Macros. */
418895f502bSjmmv     ATF_TP_ADD_TC(tp, map_for_each);
419895f502bSjmmv     ATF_TP_ADD_TC(tp, map_for_each_c);
420895f502bSjmmv 
421895f502bSjmmv     /* Other. */
422895f502bSjmmv     ATF_TP_ADD_TC(tp, stable_keys);
423895f502bSjmmv 
424895f502bSjmmv     return atf_no_error();
425895f502bSjmmv }
426