1275988Sngie/* Copyright (c) 2008 The NetBSD Foundation, Inc. 2240116Smarcel * All rights reserved. 3240116Smarcel * 4240116Smarcel * Redistribution and use in source and binary forms, with or without 5240116Smarcel * modification, are permitted provided that the following conditions 6240116Smarcel * are met: 7240116Smarcel * 1. Redistributions of source code must retain the above copyright 8240116Smarcel * notice, this list of conditions and the following disclaimer. 9240116Smarcel * 2. Redistributions in binary form must reproduce the above copyright 10240116Smarcel * notice, this list of conditions and the following disclaimer in the 11240116Smarcel * documentation and/or other materials provided with the distribution. 12240116Smarcel * 13240116Smarcel * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 14240116Smarcel * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 15240116Smarcel * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 16240116Smarcel * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17240116Smarcel * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 18240116Smarcel * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19240116Smarcel * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 20240116Smarcel * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21240116Smarcel * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 22240116Smarcel * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23240116Smarcel * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 24275988Sngie * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 25240116Smarcel 26275988Sngie#include "atf-c/detail/map.h" 27275988Sngie 28240116Smarcel#include <stdio.h> 29240116Smarcel#include <string.h> 30240116Smarcel 31240116Smarcel#include <atf-c.h> 32240116Smarcel 33275988Sngie#include "atf-c/detail/test_helpers.h" 34240116Smarcel#include "atf-c/utils.h" 35240116Smarcel 36240116Smarcel/* --------------------------------------------------------------------- 37240116Smarcel * Tests for the "atf_map" type. 38240116Smarcel * --------------------------------------------------------------------- */ 39240116Smarcel 40240116Smarcel/* 41240116Smarcel * Constructors and destructors. 42240116Smarcel */ 43240116Smarcel 44240116SmarcelATF_TC(map_init); 45240116SmarcelATF_TC_HEAD(map_init, tc) 46240116Smarcel{ 47240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_init function"); 48240116Smarcel} 49240116SmarcelATF_TC_BODY(map_init, tc) 50240116Smarcel{ 51240116Smarcel atf_map_t map; 52240116Smarcel 53240116Smarcel RE(atf_map_init(&map)); 54240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 55240116Smarcel atf_map_fini(&map); 56240116Smarcel} 57240116Smarcel 58240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_null); 59240116SmarcelATF_TC_BODY(map_init_charpp_null, tc) 60240116Smarcel{ 61240116Smarcel atf_map_t map; 62240116Smarcel 63240116Smarcel RE(atf_map_init_charpp(&map, NULL)); 64240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 65240116Smarcel atf_map_fini(&map); 66240116Smarcel} 67240116Smarcel 68240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_empty); 69240116SmarcelATF_TC_BODY(map_init_charpp_empty, tc) 70240116Smarcel{ 71240116Smarcel const char *const array[] = { NULL }; 72240116Smarcel atf_map_t map; 73240116Smarcel 74240116Smarcel RE(atf_map_init_charpp(&map, array)); 75240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 76240116Smarcel atf_map_fini(&map); 77240116Smarcel} 78240116Smarcel 79240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_some); 80240116SmarcelATF_TC_BODY(map_init_charpp_some, tc) 81240116Smarcel{ 82240116Smarcel const char *const array[] = { "K1", "V1", "K2", "V2", NULL }; 83240116Smarcel atf_map_t map; 84240116Smarcel atf_map_citer_t iter; 85240116Smarcel 86240116Smarcel RE(atf_map_init_charpp(&map, array)); 87240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 2); 88240116Smarcel 89240116Smarcel iter = atf_map_find_c(&map, "K1"); 90240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 91240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); 92240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); 93240116Smarcel 94240116Smarcel iter = atf_map_find_c(&map, "K2"); 95240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 96240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); 97240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); 98240116Smarcel 99240116Smarcel atf_map_fini(&map); 100240116Smarcel} 101240116Smarcel 102240116SmarcelATF_TC_WITHOUT_HEAD(map_init_charpp_short); 103240116SmarcelATF_TC_BODY(map_init_charpp_short, tc) 104240116Smarcel{ 105240116Smarcel const char *const array[] = { "K1", "V1", "K2", NULL }; 106240116Smarcel atf_map_t map; 107240116Smarcel 108240116Smarcel atf_error_t err = atf_map_init_charpp(&map, array); 109240116Smarcel ATF_REQUIRE(atf_is_error(err)); 110240116Smarcel ATF_REQUIRE(atf_error_is(err, "libc")); 111240116Smarcel} 112240116Smarcel 113240116Smarcel/* 114240116Smarcel * Getters. 115240116Smarcel */ 116240116Smarcel 117240116SmarcelATF_TC(find); 118240116SmarcelATF_TC_HEAD(find, tc) 119240116Smarcel{ 120240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find function"); 121240116Smarcel} 122240116SmarcelATF_TC_BODY(find, tc) 123240116Smarcel{ 124240116Smarcel atf_map_t map; 125240116Smarcel char val1[] = "V1"; 126240116Smarcel char val2[] = "V2"; 127240116Smarcel atf_map_iter_t iter; 128240116Smarcel 129240116Smarcel RE(atf_map_init(&map)); 130240116Smarcel RE(atf_map_insert(&map, "K1", val1, false)); 131240116Smarcel RE(atf_map_insert(&map, "K2", val2, false)); 132240116Smarcel 133240116Smarcel iter = atf_map_find(&map, "K0"); 134240116Smarcel ATF_REQUIRE(atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 135240116Smarcel 136240116Smarcel iter = atf_map_find(&map, "K1"); 137240116Smarcel ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 138240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); 139240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V1") == 0); 140240116Smarcel strcpy(atf_map_iter_data(iter), "Z1"); 141240116Smarcel 142240116Smarcel iter = atf_map_find(&map, "K1"); 143240116Smarcel ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 144240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K1") == 0); 145240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "Z1") == 0); 146240116Smarcel 147240116Smarcel iter = atf_map_find(&map, "K2"); 148240116Smarcel ATF_REQUIRE(!atf_equal_map_iter_map_iter(iter, atf_map_end(&map))); 149240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_key(iter), "K2") == 0); 150240116Smarcel ATF_REQUIRE(strcmp(atf_map_iter_data(iter), "V2") == 0); 151240116Smarcel 152240116Smarcel atf_map_fini(&map); 153240116Smarcel} 154240116Smarcel 155240116SmarcelATF_TC(find_c); 156240116SmarcelATF_TC_HEAD(find_c, tc) 157240116Smarcel{ 158240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_find_c function"); 159240116Smarcel} 160240116SmarcelATF_TC_BODY(find_c, tc) 161240116Smarcel{ 162240116Smarcel atf_map_t map; 163240116Smarcel char val1[] = "V1"; 164240116Smarcel char val2[] = "V2"; 165240116Smarcel atf_map_citer_t iter; 166240116Smarcel 167240116Smarcel RE(atf_map_init(&map)); 168240116Smarcel RE(atf_map_insert(&map, "K1", val1, false)); 169240116Smarcel RE(atf_map_insert(&map, "K2", val2, false)); 170240116Smarcel 171240116Smarcel iter = atf_map_find_c(&map, "K0"); 172240116Smarcel ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 173240116Smarcel 174240116Smarcel iter = atf_map_find_c(&map, "K1"); 175240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 176240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K1") == 0); 177240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V1") == 0); 178240116Smarcel 179240116Smarcel iter = atf_map_find_c(&map, "K2"); 180240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 181240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_key(iter), "K2") == 0); 182240116Smarcel ATF_REQUIRE(strcmp(atf_map_citer_data(iter), "V2") == 0); 183240116Smarcel 184240116Smarcel atf_map_fini(&map); 185240116Smarcel} 186240116Smarcel 187240116SmarcelATF_TC_WITHOUT_HEAD(to_charpp_empty); 188240116SmarcelATF_TC_BODY(to_charpp_empty, tc) 189240116Smarcel{ 190240116Smarcel atf_map_t map; 191240116Smarcel char **array; 192240116Smarcel 193240116Smarcel RE(atf_map_init(&map)); 194240116Smarcel ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); 195240116Smarcel atf_map_fini(&map); 196240116Smarcel 197240116Smarcel ATF_CHECK_EQ(NULL, array[0]); 198240116Smarcel atf_utils_free_charpp(array); 199240116Smarcel} 200240116Smarcel 201240116SmarcelATF_TC_WITHOUT_HEAD(to_charpp_some); 202240116SmarcelATF_TC_BODY(to_charpp_some, tc) 203240116Smarcel{ 204240116Smarcel atf_map_t map; 205240116Smarcel char **array; 206240116Smarcel 207240116Smarcel char s1[] = "one"; 208240116Smarcel char s2[] = "two"; 209240116Smarcel char s3[] = "three"; 210240116Smarcel 211240116Smarcel RE(atf_map_init(&map)); 212240116Smarcel RE(atf_map_insert(&map, "K1", s1, false)); 213240116Smarcel RE(atf_map_insert(&map, "K2", s2, false)); 214240116Smarcel RE(atf_map_insert(&map, "K3", s3, false)); 215240116Smarcel ATF_REQUIRE((array = atf_map_to_charpp(&map)) != NULL); 216240116Smarcel atf_map_fini(&map); 217240116Smarcel 218240116Smarcel ATF_CHECK_STREQ("K1", array[0]); 219240116Smarcel ATF_CHECK_STREQ("one", array[1]); 220240116Smarcel ATF_CHECK_STREQ("K2", array[2]); 221240116Smarcel ATF_CHECK_STREQ("two", array[3]); 222240116Smarcel ATF_CHECK_STREQ("K3", array[4]); 223240116Smarcel ATF_CHECK_STREQ("three", array[5]); 224240116Smarcel ATF_CHECK_EQ(NULL, array[6]); 225240116Smarcel atf_utils_free_charpp(array); 226240116Smarcel} 227240116Smarcel 228240116Smarcel/* 229240116Smarcel * Modifiers. 230240116Smarcel */ 231240116Smarcel 232240116SmarcelATF_TC(map_insert); 233240116SmarcelATF_TC_HEAD(map_insert, tc) 234240116Smarcel{ 235240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_insert function"); 236240116Smarcel} 237240116SmarcelATF_TC_BODY(map_insert, tc) 238240116Smarcel{ 239240116Smarcel atf_map_t map; 240240116Smarcel char buf[] = "1st test string"; 241240116Smarcel char buf2[] = "2nd test string"; 242240116Smarcel const char *ptr; 243240116Smarcel atf_map_citer_t iter; 244240116Smarcel 245240116Smarcel RE(atf_map_init(&map)); 246240116Smarcel 247240116Smarcel printf("Inserting some values\n"); 248240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 0); 249240116Smarcel RE(atf_map_insert(&map, "K1", buf, false)); 250240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 1); 251240116Smarcel RE(atf_map_insert(&map, "K2", buf, false)); 252240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 2); 253240116Smarcel RE(atf_map_insert(&map, "K3", buf, false)); 254240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 3); 255240116Smarcel 256240116Smarcel printf("Replacing a value\n"); 257240116Smarcel iter = atf_map_find_c(&map, "K3"); 258240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 259240116Smarcel ptr = atf_map_citer_data(iter); 260240116Smarcel ATF_REQUIRE_EQ(ptr, buf); 261240116Smarcel RE(atf_map_insert(&map, "K3", buf2, false)); 262240116Smarcel ATF_REQUIRE_EQ(atf_map_size(&map), 3); 263240116Smarcel iter = atf_map_find_c(&map, "K3"); 264240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 265240116Smarcel ptr = atf_map_citer_data(iter); 266240116Smarcel ATF_REQUIRE_EQ(ptr, buf2); 267240116Smarcel 268240116Smarcel atf_map_fini(&map); 269240116Smarcel} 270240116Smarcel 271240116Smarcel/* 272240116Smarcel * Macros. 273240116Smarcel */ 274240116Smarcel 275240116SmarcelATF_TC(map_for_each); 276240116SmarcelATF_TC_HEAD(map_for_each, tc) 277240116Smarcel{ 278240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each macro"); 279240116Smarcel} 280240116SmarcelATF_TC_BODY(map_for_each, tc) 281240116Smarcel{ 282240116Smarcel atf_map_t map; 283240116Smarcel atf_map_iter_t iter; 284240116Smarcel size_t count, i, size; 285240116Smarcel char keys[10][5]; 286240116Smarcel int nums[10]; 287240116Smarcel 288240116Smarcel printf("Iterating over empty map\n"); 289240116Smarcel RE(atf_map_init(&map)); 290240116Smarcel count = 0; 291240116Smarcel atf_map_for_each(iter, &map) { 292240116Smarcel count++; 293240116Smarcel printf("Item count is now %zd\n", count); 294240116Smarcel } 295240116Smarcel ATF_REQUIRE_EQ(count, 0); 296240116Smarcel atf_map_fini(&map); 297240116Smarcel 298240116Smarcel for (size = 0; size <= 10; size++) { 299240116Smarcel printf("Iterating over map of %zd elements\n", size); 300240116Smarcel RE(atf_map_init(&map)); 301240116Smarcel for (i = 0; i < size; i++) { 302240116Smarcel nums[i] = i + 1; 303240116Smarcel snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); 304240116Smarcel RE(atf_map_insert(&map, keys[i], &nums[i], false)); 305240116Smarcel } 306240116Smarcel count = 0; 307240116Smarcel atf_map_for_each(iter, &map) { 308240116Smarcel printf("Retrieved item: %d\n", *(int *)atf_map_iter_data(iter)); 309240116Smarcel count++; 310240116Smarcel } 311240116Smarcel ATF_REQUIRE_EQ(count, size); 312240116Smarcel atf_map_fini(&map); 313240116Smarcel } 314240116Smarcel} 315240116Smarcel 316240116SmarcelATF_TC(map_for_each_c); 317240116SmarcelATF_TC_HEAD(map_for_each_c, tc) 318240116Smarcel{ 319240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks the atf_map_for_each_c macro"); 320240116Smarcel} 321240116SmarcelATF_TC_BODY(map_for_each_c, tc) 322240116Smarcel{ 323240116Smarcel atf_map_t map; 324240116Smarcel atf_map_citer_t iter; 325240116Smarcel size_t count, i, size; 326240116Smarcel char keys[10][5]; 327240116Smarcel int nums[10]; 328240116Smarcel 329240116Smarcel printf("Iterating over empty map\n"); 330240116Smarcel RE(atf_map_init(&map)); 331240116Smarcel count = 0; 332240116Smarcel atf_map_for_each_c(iter, &map) { 333240116Smarcel count++; 334240116Smarcel printf("Item count is now %zd\n", count); 335240116Smarcel } 336240116Smarcel ATF_REQUIRE_EQ(count, 0); 337240116Smarcel atf_map_fini(&map); 338240116Smarcel 339240116Smarcel for (size = 0; size <= 10; size++) { 340240116Smarcel printf("Iterating over map of %zd elements\n", size); 341240116Smarcel RE(atf_map_init(&map)); 342240116Smarcel for (i = 0; i < size; i++) { 343240116Smarcel nums[i] = i + 1; 344240116Smarcel snprintf(keys[i], sizeof(keys[i]), "%d", nums[i]); 345240116Smarcel RE(atf_map_insert(&map, keys[i], &nums[i], false)); 346240116Smarcel } 347240116Smarcel count = 0; 348240116Smarcel atf_map_for_each_c(iter, &map) { 349240116Smarcel printf("Retrieved item: %d\n", 350240116Smarcel *(const int *)atf_map_citer_data(iter)); 351240116Smarcel count++; 352240116Smarcel } 353240116Smarcel ATF_REQUIRE_EQ(count, size); 354240116Smarcel atf_map_fini(&map); 355240116Smarcel } 356240116Smarcel} 357240116Smarcel 358240116Smarcel/* 359240116Smarcel * Other. 360240116Smarcel */ 361240116Smarcel 362240116SmarcelATF_TC(stable_keys); 363240116SmarcelATF_TC_HEAD(stable_keys, tc) 364240116Smarcel{ 365240116Smarcel atf_tc_set_md_var(tc, "descr", "Checks that the keys do not change " 366240116Smarcel "even if their original values do"); 367240116Smarcel} 368240116SmarcelATF_TC_BODY(stable_keys, tc) 369240116Smarcel{ 370240116Smarcel atf_map_t map; 371240116Smarcel atf_map_citer_t iter; 372240116Smarcel char key[] = "K1"; 373240116Smarcel 374240116Smarcel RE(atf_map_init(&map)); 375240116Smarcel 376240116Smarcel RE(atf_map_insert(&map, key, strdup("test-value"), true)); 377240116Smarcel iter = atf_map_find_c(&map, "K1"); 378240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 379240116Smarcel iter = atf_map_find_c(&map, "K2"); 380240116Smarcel ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 381240116Smarcel 382240116Smarcel strcpy(key, "K2"); 383240116Smarcel iter = atf_map_find_c(&map, "K1"); 384240116Smarcel ATF_REQUIRE(!atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 385240116Smarcel iter = atf_map_find_c(&map, "K2"); 386240116Smarcel ATF_REQUIRE(atf_equal_map_citer_map_citer(iter, atf_map_end_c(&map))); 387240116Smarcel 388240116Smarcel atf_map_fini(&map); 389240116Smarcel} 390240116Smarcel 391240116Smarcel/* --------------------------------------------------------------------- 392240116Smarcel * Main. 393240116Smarcel * --------------------------------------------------------------------- */ 394240116Smarcel 395240116SmarcelATF_TP_ADD_TCS(tp) 396240116Smarcel{ 397240116Smarcel /* Constructors and destructors. */ 398240116Smarcel ATF_TP_ADD_TC(tp, map_init); 399240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_null); 400240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_empty); 401240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_some); 402240116Smarcel ATF_TP_ADD_TC(tp, map_init_charpp_short); 403240116Smarcel 404240116Smarcel /* Getters. */ 405240116Smarcel ATF_TP_ADD_TC(tp, find); 406240116Smarcel ATF_TP_ADD_TC(tp, find_c); 407240116Smarcel ATF_TP_ADD_TC(tp, to_charpp_empty); 408240116Smarcel ATF_TP_ADD_TC(tp, to_charpp_some); 409240116Smarcel 410240116Smarcel /* Modifiers. */ 411240116Smarcel ATF_TP_ADD_TC(tp, map_insert); 412240116Smarcel 413240116Smarcel /* Macros. */ 414240116Smarcel ATF_TP_ADD_TC(tp, map_for_each); 415240116Smarcel ATF_TP_ADD_TC(tp, map_for_each_c); 416240116Smarcel 417240116Smarcel /* Other. */ 418240116Smarcel ATF_TP_ADD_TC(tp, stable_keys); 419240116Smarcel 420240116Smarcel return atf_no_error(); 421240116Smarcel} 422