Path: blob/main/contrib/atf/atf-c/detail/list_test.c
39507 views
/* Copyright (c) 2008 The NetBSD Foundation, Inc.1* All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6* 1. Redistributions of source code must retain the above copyright7* notice, this list of conditions and the following disclaimer.8* 2. Redistributions in binary form must reproduce the above copyright9* notice, this list of conditions and the following disclaimer in the10* documentation and/or other materials provided with the distribution.11*12* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND13* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,14* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF15* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.16* IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY17* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE19* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS20* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER21* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR22* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN23* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */2425#include "atf-c/detail/list.h"2627#include <stdio.h>28#include <string.h>2930#include <atf-c.h>3132#include "atf-c/detail/test_helpers.h"33#include "atf-c/utils.h"3435/* ---------------------------------------------------------------------36* Tests for the "atf_list" type.37* --------------------------------------------------------------------- */3839/*40* Constructors and destructors.41*/4243ATF_TC(list_init);44ATF_TC_HEAD(list_init, tc)45{46atf_tc_set_md_var(tc, "descr", "Checks the atf_list_init function");47}48ATF_TC_BODY(list_init, tc)49{50atf_list_t list;5152RE(atf_list_init(&list));53ATF_REQUIRE_EQ(atf_list_size(&list), 0);54atf_list_fini(&list);55}5657/*58* Getters.59*/6061ATF_TC(list_index);62ATF_TC_HEAD(list_index, tc)63{64atf_tc_set_md_var(tc, "descr", "Checks the atf_list_index function");65}66ATF_TC_BODY(list_index, tc)67{68atf_list_t list;69int i1 = 1;70int i2 = 5;71int i3 = 9;7273RE(atf_list_init(&list));74RE(atf_list_append(&list, &i1, false));75RE(atf_list_append(&list, &i2, false));76RE(atf_list_append(&list, &i3, false));7778ATF_CHECK_EQ(*(int *)atf_list_index(&list, 0), 1);79ATF_CHECK_EQ(*(int *)atf_list_index(&list, 1), 5);80ATF_CHECK_EQ(*(int *)atf_list_index(&list, 2), 9);8182atf_list_fini(&list);83}8485ATF_TC(list_index_c);86ATF_TC_HEAD(list_index_c, tc)87{88atf_tc_set_md_var(tc, "descr", "Checks the atf_list_index_c function");89}90ATF_TC_BODY(list_index_c, tc)91{92atf_list_t list;93int i1 = 1;94int i2 = 5;95int i3 = 9;9697RE(atf_list_init(&list));98RE(atf_list_append(&list, &i1, false));99RE(atf_list_append(&list, &i2, false));100RE(atf_list_append(&list, &i3, false));101102ATF_CHECK_EQ(*(const int *)atf_list_index_c(&list, 0), 1);103ATF_CHECK_EQ(*(const int *)atf_list_index_c(&list, 1), 5);104ATF_CHECK_EQ(*(const int *)atf_list_index_c(&list, 2), 9);105106atf_list_fini(&list);107}108109ATF_TC_WITHOUT_HEAD(list_to_charpp_empty);110ATF_TC_BODY(list_to_charpp_empty, tc)111{112atf_list_t list;113char **array;114115RE(atf_list_init(&list));116ATF_REQUIRE((array = atf_list_to_charpp(&list)) != NULL);117atf_list_fini(&list);118119ATF_CHECK_EQ(NULL, array[0]);120atf_utils_free_charpp(array);121}122123ATF_TC_WITHOUT_HEAD(list_to_charpp_some);124ATF_TC_BODY(list_to_charpp_some, tc)125{126atf_list_t list;127char **array;128129char s1[] = "one";130char s2[] = "two";131char s3[] = "three";132133RE(atf_list_init(&list));134RE(atf_list_append(&list, s1, false));135RE(atf_list_append(&list, s2, false));136RE(atf_list_append(&list, s3, false));137ATF_REQUIRE((array = atf_list_to_charpp(&list)) != NULL);138atf_list_fini(&list);139140ATF_CHECK_STREQ("one", array[0]);141ATF_CHECK_STREQ("two", array[1]);142ATF_CHECK_STREQ("three", array[2]);143ATF_CHECK_EQ(NULL, array[3]);144atf_utils_free_charpp(array);145}146147/*148* Modifiers.149*/150151ATF_TC(list_append);152ATF_TC_HEAD(list_append, tc)153{154atf_tc_set_md_var(tc, "descr", "Checks the atf_list_append function");155}156ATF_TC_BODY(list_append, tc)157{158atf_list_t list;159size_t i;160char buf[] = "Test string";161162RE(atf_list_init(&list));163for (i = 0; i < 1024; i++) {164ATF_REQUIRE_EQ(atf_list_size(&list), i);165RE(atf_list_append(&list, buf, false));166}167atf_list_fini(&list);168}169170ATF_TC(list_append_list);171ATF_TC_HEAD(list_append_list, tc)172{173atf_tc_set_md_var(tc, "descr", "Checks the atf_list_append_list "174"function");175}176ATF_TC_BODY(list_append_list, tc)177{178{179atf_list_t l1, l2;180181RE(atf_list_init(&l1));182RE(atf_list_init(&l2));183184atf_list_append_list(&l1, &l2);185ATF_CHECK_EQ(atf_list_size(&l1), 0);186187atf_list_fini(&l1);188}189190{191atf_list_t l1, l2;192int item = 5;193194RE(atf_list_init(&l1));195RE(atf_list_append(&l1, &item, false));196RE(atf_list_init(&l2));197198atf_list_append_list(&l1, &l2);199ATF_CHECK_EQ(atf_list_size(&l1), 1);200ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 0), item);201202atf_list_fini(&l1);203}204205{206atf_list_t l1, l2;207int item = 5;208209RE(atf_list_init(&l1));210RE(atf_list_init(&l2));211RE(atf_list_append(&l2, &item, false));212213atf_list_append_list(&l1, &l2);214ATF_CHECK_EQ(atf_list_size(&l1), 1);215ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 0), item);216217atf_list_fini(&l1);218}219220{221atf_list_t l1, l2;222int item1 = 5;223int item2 = 9;224225RE(atf_list_init(&l1));226RE(atf_list_append(&l1, &item1, false));227RE(atf_list_init(&l2));228RE(atf_list_append(&l2, &item2, false));229230atf_list_append_list(&l1, &l2);231ATF_CHECK_EQ(atf_list_size(&l1), 2);232ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 0), item1);233ATF_CHECK_EQ(*(int *)atf_list_index(&l1, 1), item2);234235atf_list_fini(&l1);236}237238{239atf_list_t l1, l2;240atf_list_citer_t end1, end2;241242RE(atf_list_init(&l1));243RE(atf_list_init(&l2));244245end1 = atf_list_end_c(&l1);246end2 = atf_list_end_c(&l2);247/* XXX Shouldn't query m_entry here. */248ATF_CHECK(end1.m_entry != end2.m_entry);249250atf_list_append_list(&l1, &l2);251ATF_CHECK(atf_list_end_c(&l1).m_entry == end2.m_entry);252253atf_list_fini(&l1);254}255}256257/*258* Macros.259*/260261ATF_TC(list_for_each);262ATF_TC_HEAD(list_for_each, tc)263{264atf_tc_set_md_var(tc, "descr", "Checks the atf_list_for_each macro");265}266ATF_TC_BODY(list_for_each, tc)267{268atf_list_t list;269atf_list_iter_t iter;270size_t count, i, size;271int nums[10];272273printf("Iterating over empty list\n");274RE(atf_list_init(&list));275count = 0;276atf_list_for_each(iter, &list) {277count++;278printf("Item count is now %zd\n", count);279}280ATF_REQUIRE_EQ(count, 0);281atf_list_fini(&list);282283for (size = 0; size <= 10; size++) {284printf("Iterating over list of %zd elements\n", size);285RE(atf_list_init(&list));286for (i = 0; i < size; i++) {287nums[i] = i + 1;288RE(atf_list_append(&list, &nums[i], false));289}290count = 0;291atf_list_for_each(iter, &list) {292printf("Retrieved item: %d\n", *(int *)atf_list_iter_data(iter));293count++;294}295ATF_REQUIRE_EQ(count, size);296atf_list_fini(&list);297}298}299300ATF_TC(list_for_each_c);301ATF_TC_HEAD(list_for_each_c, tc)302{303atf_tc_set_md_var(tc, "descr", "Checks the atf_list_for_each_c macro");304}305ATF_TC_BODY(list_for_each_c, tc)306{307atf_list_t list;308atf_list_citer_t iter;309size_t count, i, size;310int nums[10];311312printf("Iterating over empty list\n");313RE(atf_list_init(&list));314count = 0;315atf_list_for_each_c(iter, &list) {316count++;317printf("Item count is now %zd\n", count);318}319ATF_REQUIRE_EQ(count, 0);320atf_list_fini(&list);321322for (size = 0; size <= 10; size++) {323printf("Iterating over list of %zd elements\n", size);324RE(atf_list_init(&list));325for (i = 0; i < size; i++) {326nums[i] = i + 1;327RE(atf_list_append(&list, &nums[i], false));328}329count = 0;330atf_list_for_each_c(iter, &list) {331printf("Retrieved item: %d\n",332*(const int *)atf_list_citer_data(iter));333count++;334}335ATF_REQUIRE_EQ(count, size);336atf_list_fini(&list);337}338}339340/* ---------------------------------------------------------------------341* Main.342* --------------------------------------------------------------------- */343344ATF_TP_ADD_TCS(tp)345{346/* Constructors and destructors. */347ATF_TP_ADD_TC(tp, list_init);348349/* Getters. */350ATF_TP_ADD_TC(tp, list_index);351ATF_TP_ADD_TC(tp, list_index_c);352ATF_TP_ADD_TC(tp, list_to_charpp_empty);353ATF_TP_ADD_TC(tp, list_to_charpp_some);354355/* Modifiers. */356ATF_TP_ADD_TC(tp, list_append);357ATF_TP_ADD_TC(tp, list_append_list);358359/* Macros. */360ATF_TP_ADD_TC(tp, list_for_each);361ATF_TP_ADD_TC(tp, list_for_each_c);362363return atf_no_error();364}365366367