1*0677dfd1SJulio Merino /* Copyright (c) 2008 The NetBSD Foundation, Inc. 2c243e490SMarcel Moolenaar * All rights reserved. 3c243e490SMarcel Moolenaar * 4c243e490SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 5c243e490SMarcel Moolenaar * modification, are permitted provided that the following conditions 6c243e490SMarcel Moolenaar * are met: 7c243e490SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 8c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 9c243e490SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 10c243e490SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 11c243e490SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 12c243e490SMarcel Moolenaar * 13c243e490SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 14c243e490SMarcel Moolenaar * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 15c243e490SMarcel Moolenaar * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 16c243e490SMarcel Moolenaar * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17c243e490SMarcel Moolenaar * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 18c243e490SMarcel Moolenaar * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19c243e490SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 20c243e490SMarcel Moolenaar * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21c243e490SMarcel Moolenaar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 22c243e490SMarcel Moolenaar * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23c243e490SMarcel Moolenaar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 24*0677dfd1SJulio Merino * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 25*0677dfd1SJulio Merino 26*0677dfd1SJulio Merino #include "atf-c/detail/map.h" 27c243e490SMarcel Moolenaar 28c243e490SMarcel Moolenaar #include <stdio.h> 29c243e490SMarcel Moolenaar #include <string.h> 30c243e490SMarcel Moolenaar 31c243e490SMarcel Moolenaar #include <atf-c.h> 32c243e490SMarcel Moolenaar 33*0677dfd1SJulio Merino #include "atf-c/detail/test_helpers.h" 34c243e490SMarcel Moolenaar #include "atf-c/utils.h" 35c243e490SMarcel Moolenaar 36c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 37c243e490SMarcel Moolenaar * Tests for the "atf_map" type. 38c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 39c243e490SMarcel Moolenaar 40c243e490SMarcel Moolenaar /* 41c243e490SMarcel Moolenaar * Constructors and destructors. 42c243e490SMarcel Moolenaar */ 43c243e490SMarcel Moolenaar 44c243e490SMarcel Moolenaar ATF_TC(map_init); 45c243e490SMarcel Moolenaar ATF_TC_HEAD(map_init, tc) 46c243e490SMarcel Moolenaar { 47c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the atf_map_init function"); 48c243e490SMarcel Moolenaar } 49c243e490SMarcel Moolenaar ATF_TC_BODY(map_init, tc) 50c243e490SMarcel Moolenaar { 51c243e490SMarcel Moolenaar atf_map_t map; 52c243e490SMarcel Moolenaar 53c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 54c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 0); 55c243e490SMarcel Moolenaar atf_map_fini(&map); 56c243e490SMarcel Moolenaar } 57c243e490SMarcel Moolenaar 58c243e490SMarcel Moolenaar ATF_TC_WITHOUT_HEAD(map_init_charpp_null); 59c243e490SMarcel Moolenaar ATF_TC_BODY(map_init_charpp_null, tc) 60c243e490SMarcel Moolenaar { 61c243e490SMarcel Moolenaar atf_map_t map; 62c243e490SMarcel Moolenaar 63c243e490SMarcel Moolenaar RE(atf_map_init_charpp(&map, NULL)); 64c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 0); 65c243e490SMarcel Moolenaar atf_map_fini(&map); 66c243e490SMarcel Moolenaar } 67c243e490SMarcel Moolenaar 68c243e490SMarcel Moolenaar ATF_TC_WITHOUT_HEAD(map_init_charpp_empty); 69c243e490SMarcel Moolenaar ATF_TC_BODY(map_init_charpp_empty, tc) 70c243e490SMarcel Moolenaar { 71c243e490SMarcel Moolenaar const char *const array[] = { NULL }; 72c243e490SMarcel Moolenaar atf_map_t map; 73c243e490SMarcel Moolenaar 74c243e490SMarcel Moolenaar RE(atf_map_init_charpp(&map, array)); 75c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 0); 76c243e490SMarcel Moolenaar atf_map_fini(&map); 77c243e490SMarcel Moolenaar } 78c243e490SMarcel Moolenaar 79c243e490SMarcel Moolenaar ATF_TC_WITHOUT_HEAD(map_init_charpp_some); 80c243e490SMarcel Moolenaar ATF_TC_BODY(map_init_charpp_some, tc) 81c243e490SMarcel Moolenaar { 82c243e490SMarcel Moolenaar const char *const array[] = { "K1", "V1", "K2", "V2", NULL }; 83c243e490SMarcel Moolenaar atf_map_t map; 84c243e490SMarcel Moolenaar atf_map_citer_t iter; 85c243e490SMarcel Moolenaar 86c243e490SMarcel Moolenaar RE(atf_map_init_charpp(&map, array)); 87c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 2); 88c243e490SMarcel Moolenaar 89c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K1"); 90c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 91c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); 92c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); 93c243e490SMarcel Moolenaar 94c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K2"); 95c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 96c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); 97c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); 98c243e490SMarcel Moolenaar 99c243e490SMarcel Moolenaar atf_map_fini(&map); 100c243e490SMarcel Moolenaar } 101c243e490SMarcel Moolenaar 102c243e490SMarcel Moolenaar ATF_TC_WITHOUT_HEAD(map_init_charpp_short); 103c243e490SMarcel Moolenaar ATF_TC_BODY(map_init_charpp_short, tc) 104c243e490SMarcel Moolenaar { 105c243e490SMarcel Moolenaar const char *const array[] = { "K1", "V1", "K2", NULL }; 106c243e490SMarcel Moolenaar atf_map_t map; 107c243e490SMarcel Moolenaar 108c243e490SMarcel Moolenaar atf_error_t err = atf_map_init_charpp(&map, array); 109c243e490SMarcel Moolenaar ATF_REQUIRE(atf_is_error(err)); 110c243e490SMarcel Moolenaar ATF_REQUIRE(atf_error_is(err, "libc")); 111c243e490SMarcel Moolenaar } 112c243e490SMarcel Moolenaar 113c243e490SMarcel Moolenaar /* 114c243e490SMarcel Moolenaar * Getters. 115c243e490SMarcel Moolenaar */ 116c243e490SMarcel Moolenaar 117c243e490SMarcel Moolenaar ATF_TC(find); 118c243e490SMarcel Moolenaar ATF_TC_HEAD(find, tc) 119c243e490SMarcel Moolenaar { 120c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find function"); 121c243e490SMarcel Moolenaar } 122c243e490SMarcel Moolenaar ATF_TC_BODY(find, tc) 123c243e490SMarcel Moolenaar { 124c243e490SMarcel Moolenaar atf_map_t map; 125c243e490SMarcel Moolenaar char val1[] = "V1"; 126c243e490SMarcel Moolenaar char val2[] = "V2"; 127c243e490SMarcel Moolenaar atf_map_iter_t iter; 128c243e490SMarcel Moolenaar 129c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 130c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K1", val1, false)); 131c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K2", val2, false)); 132c243e490SMarcel Moolenaar 133c243e490SMarcel Moolenaar iter = atf_map_find(&map, "K0"); 134c243e490SMarcel Moolenaar ATF_REQUIRE(atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 135c243e490SMarcel Moolenaar 136c243e490SMarcel Moolenaar iter = atf_map_find(&map, "K1"); 137c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 138c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); 139c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V1") == 0); 140c243e490SMarcel Moolenaar strcpy(atf_map_iter_data(iter), "Z1"); 141c243e490SMarcel Moolenaar 142c243e490SMarcel Moolenaar iter = atf_map_find(&map, "K1"); 143c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 144c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); 145c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "Z1") == 0); 146c243e490SMarcel Moolenaar 147c243e490SMarcel Moolenaar iter = atf_map_find(&map, "K2"); 148c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 149c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K2") == 0); 150c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V2") == 0); 151c243e490SMarcel Moolenaar 152c243e490SMarcel Moolenaar atf_map_fini(&map); 153c243e490SMarcel Moolenaar } 154c243e490SMarcel Moolenaar 155c243e490SMarcel Moolenaar ATF_TC(find_c); 156c243e490SMarcel Moolenaar ATF_TC_HEAD(find_c, tc) 157c243e490SMarcel Moolenaar { 158c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find_c function"); 159c243e490SMarcel Moolenaar } 160c243e490SMarcel Moolenaar ATF_TC_BODY(find_c, tc) 161c243e490SMarcel Moolenaar { 162c243e490SMarcel Moolenaar atf_map_t map; 163c243e490SMarcel Moolenaar char val1[] = "V1"; 164c243e490SMarcel Moolenaar char val2[] = "V2"; 165c243e490SMarcel Moolenaar atf_map_citer_t iter; 166c243e490SMarcel Moolenaar 167c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 168c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K1", val1, false)); 169c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K2", val2, false)); 170c243e490SMarcel Moolenaar 171c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K0"); 172c243e490SMarcel Moolenaar ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 173c243e490SMarcel Moolenaar 174c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K1"); 175c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 176c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); 177c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); 178c243e490SMarcel Moolenaar 179c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K2"); 180c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 181c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); 182c243e490SMarcel Moolenaar ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); 183c243e490SMarcel Moolenaar 184c243e490SMarcel Moolenaar atf_map_fini(&map); 185c243e490SMarcel Moolenaar } 186c243e490SMarcel Moolenaar 187c243e490SMarcel Moolenaar ATF_TC_WITHOUT_HEAD(to_charpp_empty); 188c243e490SMarcel Moolenaar ATF_TC_BODY(to_charpp_empty, tc) 189c243e490SMarcel Moolenaar { 190c243e490SMarcel Moolenaar atf_map_t map; 191c243e490SMarcel Moolenaar char **array; 192c243e490SMarcel Moolenaar 193c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 194c243e490SMarcel Moolenaar ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); 195c243e490SMarcel Moolenaar atf_map_fini(&map); 196c243e490SMarcel Moolenaar 197c243e490SMarcel Moolenaar ATF_CHECK_EQ(NULL, array[0]); 198c243e490SMarcel Moolenaar atf_utils_free_charpp(array); 199c243e490SMarcel Moolenaar } 200c243e490SMarcel Moolenaar 201c243e490SMarcel Moolenaar ATF_TC_WITHOUT_HEAD(to_charpp_some); 202c243e490SMarcel Moolenaar ATF_TC_BODY(to_charpp_some, tc) 203c243e490SMarcel Moolenaar { 204c243e490SMarcel Moolenaar atf_map_t map; 205c243e490SMarcel Moolenaar char **array; 206c243e490SMarcel Moolenaar 207c243e490SMarcel Moolenaar char s1[] = "one"; 208c243e490SMarcel Moolenaar char s2[] = "two"; 209c243e490SMarcel Moolenaar char s3[] = "three"; 210c243e490SMarcel Moolenaar 211c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 212c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K1", s1, false)); 213c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K2", s2, false)); 214c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K3", s3, false)); 215c243e490SMarcel Moolenaar ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); 216c243e490SMarcel Moolenaar atf_map_fini(&map); 217c243e490SMarcel Moolenaar 218c243e490SMarcel Moolenaar ATF_CHECK_STREQ("K1", array[0]); 219c243e490SMarcel Moolenaar ATF_CHECK_STREQ("one", array[1]); 220c243e490SMarcel Moolenaar ATF_CHECK_STREQ("K2", array[2]); 221c243e490SMarcel Moolenaar ATF_CHECK_STREQ("two", array[3]); 222c243e490SMarcel Moolenaar ATF_CHECK_STREQ("K3", array[4]); 223c243e490SMarcel Moolenaar ATF_CHECK_STREQ("three", array[5]); 224c243e490SMarcel Moolenaar ATF_CHECK_EQ(NULL, array[6]); 225c243e490SMarcel Moolenaar atf_utils_free_charpp(array); 226c243e490SMarcel Moolenaar } 227c243e490SMarcel Moolenaar 228c243e490SMarcel Moolenaar /* 229c243e490SMarcel Moolenaar * Modifiers. 230c243e490SMarcel Moolenaar */ 231c243e490SMarcel Moolenaar 232c243e490SMarcel Moolenaar ATF_TC(map_insert); 233c243e490SMarcel Moolenaar ATF_TC_HEAD(map_insert, tc) 234c243e490SMarcel Moolenaar { 235c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the atf_map_insert function"); 236c243e490SMarcel Moolenaar } 237c243e490SMarcel Moolenaar ATF_TC_BODY(map_insert, tc) 238c243e490SMarcel Moolenaar { 239c243e490SMarcel Moolenaar atf_map_t map; 240c243e490SMarcel Moolenaar char buf[] = "1st test string"; 241c243e490SMarcel Moolenaar char buf2[] = "2nd test string"; 242c243e490SMarcel Moolenaar const char *ptr; 243c243e490SMarcel Moolenaar atf_map_citer_t iter; 244c243e490SMarcel Moolenaar 245c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 246c243e490SMarcel Moolenaar 247c243e490SMarcel Moolenaar printf("Inserting some values\n"); 248c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 0); 249c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K1", buf, false)); 250c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 1); 251c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K2", buf, false)); 252c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 2); 253c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K3", buf, false)); 254c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 3); 255c243e490SMarcel Moolenaar 256c243e490SMarcel Moolenaar printf("Replacing a value\n"); 257c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K3"); 258c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 259c243e490SMarcel Moolenaar ptr = atf_map_citer_data(iter); 260c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(ptr, buf); 261c243e490SMarcel Moolenaar RE(atf_map_insert(&map, "K3", buf2, false)); 262c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(atf_map_size(&map), 3); 263c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K3"); 264c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 265c243e490SMarcel Moolenaar ptr = atf_map_citer_data(iter); 266c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(ptr, buf2); 267c243e490SMarcel Moolenaar 268c243e490SMarcel Moolenaar atf_map_fini(&map); 269c243e490SMarcel Moolenaar } 270c243e490SMarcel Moolenaar 271c243e490SMarcel Moolenaar /* 272c243e490SMarcel Moolenaar * Macros. 273c243e490SMarcel Moolenaar */ 274c243e490SMarcel Moolenaar 275c243e490SMarcel Moolenaar ATF_TC(map_for_each); 276c243e490SMarcel Moolenaar ATF_TC_HEAD(map_for_each, tc) 277c243e490SMarcel Moolenaar { 278c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each macro"); 279c243e490SMarcel Moolenaar } 280c243e490SMarcel Moolenaar ATF_TC_BODY(map_for_each, tc) 281c243e490SMarcel Moolenaar { 282c243e490SMarcel Moolenaar atf_map_t map; 283c243e490SMarcel Moolenaar atf_map_iter_t iter; 284c243e490SMarcel Moolenaar size_t count, i, size; 285c243e490SMarcel Moolenaar char keys[10][5]; 286c243e490SMarcel Moolenaar int nums[10]; 287c243e490SMarcel Moolenaar 288c243e490SMarcel Moolenaar printf("Iterating over empty map\n"); 289c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 290c243e490SMarcel Moolenaar count = 0; 291c243e490SMarcel Moolenaar atf_map_for_each(iter, &map) { 292c243e490SMarcel Moolenaar count++; 293c243e490SMarcel Moolenaar printf("Item count is now %zd\n", count); 294c243e490SMarcel Moolenaar } 295c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(count, 0); 296c243e490SMarcel Moolenaar atf_map_fini(&map); 297c243e490SMarcel Moolenaar 298c243e490SMarcel Moolenaar for (size = 0; size <= 10; size++) { 299c243e490SMarcel Moolenaar printf("Iterating over map of %zd elements\n", size); 300c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 301c243e490SMarcel Moolenaar for (i = 0; i < size; i++) { 302c243e490SMarcel Moolenaar nums[i] = i + 1; 303c243e490SMarcel Moolenaar snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); 304c243e490SMarcel Moolenaar RE(atf_map_insert(&map, keys[i], &nums[i], false)); 305c243e490SMarcel Moolenaar } 306c243e490SMarcel Moolenaar count = 0; 307c243e490SMarcel Moolenaar atf_map_for_each(iter, &map) { 308c243e490SMarcel Moolenaar printf("Retrieved item: %d\n", *(int *)atf_map_iter_data(iter)); 309c243e490SMarcel Moolenaar count++; 310c243e490SMarcel Moolenaar } 311c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(count, size); 312c243e490SMarcel Moolenaar atf_map_fini(&map); 313c243e490SMarcel Moolenaar } 314c243e490SMarcel Moolenaar } 315c243e490SMarcel Moolenaar 316c243e490SMarcel Moolenaar ATF_TC(map_for_each_c); 317c243e490SMarcel Moolenaar ATF_TC_HEAD(map_for_each_c, tc) 318c243e490SMarcel Moolenaar { 319c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each_c macro"); 320c243e490SMarcel Moolenaar } 321c243e490SMarcel Moolenaar ATF_TC_BODY(map_for_each_c, tc) 322c243e490SMarcel Moolenaar { 323c243e490SMarcel Moolenaar atf_map_t map; 324c243e490SMarcel Moolenaar atf_map_citer_t iter; 325c243e490SMarcel Moolenaar size_t count, i, size; 326c243e490SMarcel Moolenaar char keys[10][5]; 327c243e490SMarcel Moolenaar int nums[10]; 328c243e490SMarcel Moolenaar 329c243e490SMarcel Moolenaar printf("Iterating over empty map\n"); 330c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 331c243e490SMarcel Moolenaar count = 0; 332c243e490SMarcel Moolenaar atf_map_for_each_c(iter, &map) { 333c243e490SMarcel Moolenaar count++; 334c243e490SMarcel Moolenaar printf("Item count is now %zd\n", count); 335c243e490SMarcel Moolenaar } 336c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(count, 0); 337c243e490SMarcel Moolenaar atf_map_fini(&map); 338c243e490SMarcel Moolenaar 339c243e490SMarcel Moolenaar for (size = 0; size <= 10; size++) { 340c243e490SMarcel Moolenaar printf("Iterating over map of %zd elements\n", size); 341c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 342c243e490SMarcel Moolenaar for (i = 0; i < size; i++) { 343c243e490SMarcel Moolenaar nums[i] = i + 1; 344c243e490SMarcel Moolenaar snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); 345c243e490SMarcel Moolenaar RE(atf_map_insert(&map, keys[i], &nums[i], false)); 346c243e490SMarcel Moolenaar } 347c243e490SMarcel Moolenaar count = 0; 348c243e490SMarcel Moolenaar atf_map_for_each_c(iter, &map) { 349c243e490SMarcel Moolenaar printf("Retrieved item: %d\n", 350c243e490SMarcel Moolenaar *(const int *)atf_map_citer_data(iter)); 351c243e490SMarcel Moolenaar count++; 352c243e490SMarcel Moolenaar } 353c243e490SMarcel Moolenaar ATF_REQUIRE_EQ(count, size); 354c243e490SMarcel Moolenaar atf_map_fini(&map); 355c243e490SMarcel Moolenaar } 356c243e490SMarcel Moolenaar } 357c243e490SMarcel Moolenaar 358c243e490SMarcel Moolenaar /* 359c243e490SMarcel Moolenaar * Other. 360c243e490SMarcel Moolenaar */ 361c243e490SMarcel Moolenaar 362c243e490SMarcel Moolenaar ATF_TC(stable_keys); 363c243e490SMarcel Moolenaar ATF_TC_HEAD(stable_keys, tc) 364c243e490SMarcel Moolenaar { 365c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks that the keys do not change " 366c243e490SMarcel Moolenaar "even if their original values do"); 367c243e490SMarcel Moolenaar } 368c243e490SMarcel Moolenaar ATF_TC_BODY(stable_keys, tc) 369c243e490SMarcel Moolenaar { 370c243e490SMarcel Moolenaar atf_map_t map; 371c243e490SMarcel Moolenaar atf_map_citer_t iter; 372c243e490SMarcel Moolenaar char key[] = "K1"; 373c243e490SMarcel Moolenaar 374c243e490SMarcel Moolenaar RE(atf_map_init(&map)); 375c243e490SMarcel Moolenaar 376c243e490SMarcel Moolenaar RE(atf_map_insert(&map, key, strdup("test-value"), true)); 377c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K1"); 378c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 379c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K2"); 380c243e490SMarcel Moolenaar ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 381c243e490SMarcel Moolenaar 382c243e490SMarcel Moolenaar strcpy(key, "K2"); 383c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K1"); 384c243e490SMarcel Moolenaar ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 385c243e490SMarcel Moolenaar iter = atf_map_find_c(&map, "K2"); 386c243e490SMarcel Moolenaar ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 387c243e490SMarcel Moolenaar 388c243e490SMarcel Moolenaar atf_map_fini(&map); 389c243e490SMarcel Moolenaar } 390c243e490SMarcel Moolenaar 391c243e490SMarcel Moolenaar /* --------------------------------------------------------------------- 392c243e490SMarcel Moolenaar * Main. 393c243e490SMarcel Moolenaar * --------------------------------------------------------------------- */ 394c243e490SMarcel Moolenaar 395c243e490SMarcel Moolenaar ATF_TP_ADD_TCS(tp) 396c243e490SMarcel Moolenaar { 397c243e490SMarcel Moolenaar /* Constructors and destructors. */ 398c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_init); 399c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_init_charpp_null); 400c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_init_charpp_empty); 401c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_init_charpp_some); 402c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_init_charpp_short); 403c243e490SMarcel Moolenaar 404c243e490SMarcel Moolenaar /* Getters. */ 405c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, find); 406c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, find_c); 407c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, to_charpp_empty); 408c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, to_charpp_some); 409c243e490SMarcel Moolenaar 410c243e490SMarcel Moolenaar /* Modifiers. */ 411c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_insert); 412c243e490SMarcel Moolenaar 413c243e490SMarcel Moolenaar /* Macros. */ 414c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_for_each); 415c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, map_for_each_c); 416c243e490SMarcel Moolenaar 417c243e490SMarcel Moolenaar /* Other. */ 418c243e490SMarcel Moolenaar ATF_TP_ADD_TC(tp, stable_keys); 419c243e490SMarcel Moolenaar 420c243e490SMarcel Moolenaar return atf_no_error(); 421c243e490SMarcel Moolenaar } 422