Path: blob/main/contrib/atf/atf-c++/detail/text_test.cpp
39563 views
// Copyright (c) 2007 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/text.hpp"2627#include <cstring>28#include <set>29#include <vector>3031#include <atf-c++.hpp>3233// ------------------------------------------------------------------------34// Test cases for the free functions.35// ------------------------------------------------------------------------3637ATF_TEST_CASE(duplicate);38ATF_TEST_CASE_HEAD(duplicate)39{40set_md_var("descr", "Tests the duplicate function");41}42ATF_TEST_CASE_BODY(duplicate)43{44using atf::text::duplicate;4546const char* orig = "foo";4748char* copy = duplicate(orig);49ATF_REQUIRE_EQ(std::strlen(copy), 3);50ATF_REQUIRE(std::strcmp(copy, "foo") == 0);5152std::strcpy(copy, "bar");53ATF_REQUIRE(std::strcmp(copy, "bar") == 0);54ATF_REQUIRE(std::strcmp(orig, "foo") == 0);55}5657ATF_TEST_CASE(join);58ATF_TEST_CASE_HEAD(join)59{60set_md_var("descr", "Tests the join function");61}62ATF_TEST_CASE_BODY(join)63{64using atf::text::join;6566// First set of tests using a non-sorted collection, std::vector.67{68std::vector< std::string > words;69std::string str;7071words.clear();72str = join(words, ",");73ATF_REQUIRE_EQ(str, "");7475words.clear();76words.push_back("");77str = join(words, ",");78ATF_REQUIRE_EQ(str, "");7980words.clear();81words.push_back("");82words.push_back("");83str = join(words, ",");84ATF_REQUIRE_EQ(str, ",");8586words.clear();87words.push_back("foo");88words.push_back("");89words.push_back("baz");90str = join(words, ",");91ATF_REQUIRE_EQ(str, "foo,,baz");9293words.clear();94words.push_back("foo");95words.push_back("bar");96words.push_back("baz");97str = join(words, ",");98ATF_REQUIRE_EQ(str, "foo,bar,baz");99}100101// Second set of tests using a sorted collection, std::set.102{103std::set< std::string > words;104std::string str;105106words.clear();107str = join(words, ",");108ATF_REQUIRE_EQ(str, "");109110words.clear();111words.insert("");112str = join(words, ",");113ATF_REQUIRE_EQ(str, "");114115words.clear();116words.insert("foo");117words.insert("");118words.insert("baz");119str = join(words, ",");120ATF_REQUIRE_EQ(str, ",baz,foo");121122words.clear();123words.insert("foo");124words.insert("bar");125words.insert("baz");126str = join(words, ",");127ATF_REQUIRE_EQ(str, "bar,baz,foo");128}129}130131ATF_TEST_CASE(match);132ATF_TEST_CASE_HEAD(match)133{134set_md_var("descr", "Tests the match function");135}136ATF_TEST_CASE_BODY(match)137{138using atf::text::match;139140ATF_REQUIRE_THROW(std::runtime_error, match("", "["));141142ATF_REQUIRE(match("", ""));143ATF_REQUIRE(!match("foo", ""));144145ATF_REQUIRE(match("", ".*"));146ATF_REQUIRE(match("", "[a-z]*"));147148ATF_REQUIRE(match("hello", "hello"));149ATF_REQUIRE(match("hello", "[a-z]+"));150ATF_REQUIRE(match("hello", "^[a-z]+$"));151152ATF_REQUIRE(!match("hello", "helooo"));153ATF_REQUIRE(!match("hello", "[a-z]+5"));154ATF_REQUIRE(!match("hello", "^ [a-z]+$"));155}156157ATF_TEST_CASE(split);158ATF_TEST_CASE_HEAD(split)159{160set_md_var("descr", "Tests the split function");161}162ATF_TEST_CASE_BODY(split)163{164using atf::text::split;165166std::vector< std::string > words;167168words = split("", " ");169ATF_REQUIRE_EQ(words.size(), 0);170171words = split(" ", " ");172ATF_REQUIRE_EQ(words.size(), 0);173174words = split(" ", " ");175ATF_REQUIRE_EQ(words.size(), 0);176177words = split("a b", " ");178ATF_REQUIRE_EQ(words.size(), 2);179ATF_REQUIRE_EQ(words[0], "a");180ATF_REQUIRE_EQ(words[1], "b");181182words = split("a b c d", " ");183ATF_REQUIRE_EQ(words.size(), 4);184ATF_REQUIRE_EQ(words[0], "a");185ATF_REQUIRE_EQ(words[1], "b");186ATF_REQUIRE_EQ(words[2], "c");187ATF_REQUIRE_EQ(words[3], "d");188189words = split("foo bar", " ");190ATF_REQUIRE_EQ(words.size(), 2);191ATF_REQUIRE_EQ(words[0], "foo");192ATF_REQUIRE_EQ(words[1], "bar");193194words = split("foo bar baz foobar", " ");195ATF_REQUIRE_EQ(words.size(), 4);196ATF_REQUIRE_EQ(words[0], "foo");197ATF_REQUIRE_EQ(words[1], "bar");198ATF_REQUIRE_EQ(words[2], "baz");199ATF_REQUIRE_EQ(words[3], "foobar");200201words = split(" foo bar", " ");202ATF_REQUIRE_EQ(words.size(), 2);203ATF_REQUIRE_EQ(words[0], "foo");204ATF_REQUIRE_EQ(words[1], "bar");205206words = split("foo bar", " ");207ATF_REQUIRE_EQ(words.size(), 2);208ATF_REQUIRE_EQ(words[0], "foo");209ATF_REQUIRE_EQ(words[1], "bar");210211words = split("foo bar ", " ");212ATF_REQUIRE_EQ(words.size(), 2);213ATF_REQUIRE_EQ(words[0], "foo");214ATF_REQUIRE_EQ(words[1], "bar");215216words = split(" foo bar ", " ");217ATF_REQUIRE_EQ(words.size(), 2);218ATF_REQUIRE_EQ(words[0], "foo");219ATF_REQUIRE_EQ(words[1], "bar");220}221222ATF_TEST_CASE(split_delims);223ATF_TEST_CASE_HEAD(split_delims)224{225set_md_var("descr", "Tests the split function using different delimiters");226}227ATF_TEST_CASE_BODY(split_delims)228{229using atf::text::split;230231std::vector< std::string > words;232233words = split("", "/");234ATF_REQUIRE_EQ(words.size(), 0);235236words = split(" ", "/");237ATF_REQUIRE_EQ(words.size(), 1);238ATF_REQUIRE_EQ(words[0], " ");239240words = split(" ", "/");241ATF_REQUIRE_EQ(words.size(), 1);242ATF_REQUIRE_EQ(words[0], " ");243244words = split("a/b", "/");245ATF_REQUIRE_EQ(words.size(), 2);246ATF_REQUIRE_EQ(words[0], "a");247ATF_REQUIRE_EQ(words[1], "b");248249words = split("aLONGDELIMbcdLONGDELIMef", "LONGDELIM");250ATF_REQUIRE_EQ(words.size(), 3);251ATF_REQUIRE_EQ(words[0], "a");252ATF_REQUIRE_EQ(words[1], "bcd");253ATF_REQUIRE_EQ(words[2], "ef");254}255256ATF_TEST_CASE(trim);257ATF_TEST_CASE_HEAD(trim)258{259set_md_var("descr", "Tests the trim function");260}261ATF_TEST_CASE_BODY(trim)262{263using atf::text::trim;264265ATF_REQUIRE_EQ(trim(""), "");266ATF_REQUIRE_EQ(trim(" "), "");267ATF_REQUIRE_EQ(trim("\t"), "");268269ATF_REQUIRE_EQ(trim(" foo"), "foo");270ATF_REQUIRE_EQ(trim("\t foo"), "foo");271ATF_REQUIRE_EQ(trim(" \tfoo"), "foo");272ATF_REQUIRE_EQ(trim("foo\t "), "foo");273ATF_REQUIRE_EQ(trim("foo \t"), "foo");274275ATF_REQUIRE_EQ(trim("foo bar"), "foo bar");276ATF_REQUIRE_EQ(trim("\t foo bar"), "foo bar");277ATF_REQUIRE_EQ(trim(" \tfoo bar"), "foo bar");278ATF_REQUIRE_EQ(trim("foo bar\t "), "foo bar");279ATF_REQUIRE_EQ(trim("foo bar \t"), "foo bar");280}281282ATF_TEST_CASE(to_bool);283ATF_TEST_CASE_HEAD(to_bool)284{285set_md_var("descr", "Tests the to_string function");286}287ATF_TEST_CASE_BODY(to_bool)288{289using atf::text::to_bool;290291ATF_REQUIRE(to_bool("true"));292ATF_REQUIRE(to_bool("TRUE"));293ATF_REQUIRE(to_bool("yes"));294ATF_REQUIRE(to_bool("YES"));295296ATF_REQUIRE(!to_bool("false"));297ATF_REQUIRE(!to_bool("FALSE"));298ATF_REQUIRE(!to_bool("no"));299ATF_REQUIRE(!to_bool("NO"));300301ATF_REQUIRE_THROW(std::runtime_error, to_bool(""));302ATF_REQUIRE_THROW(std::runtime_error, to_bool("tru"));303ATF_REQUIRE_THROW(std::runtime_error, to_bool("true2"));304ATF_REQUIRE_THROW(std::runtime_error, to_bool("fals"));305ATF_REQUIRE_THROW(std::runtime_error, to_bool("false2"));306}307308ATF_TEST_CASE(to_bytes);309ATF_TEST_CASE_HEAD(to_bytes)310{311set_md_var("descr", "Tests the to_bytes function");312}313ATF_TEST_CASE_BODY(to_bytes)314{315using atf::text::to_bytes;316317ATF_REQUIRE_EQ(0, to_bytes("0"));318ATF_REQUIRE_EQ(12345, to_bytes("12345"));319ATF_REQUIRE_EQ(2 * 1024, to_bytes("2k"));320ATF_REQUIRE_EQ(4 * 1024 * 1024, to_bytes("4m"));321ATF_REQUIRE_EQ(int64_t(8) * 1024 * 1024 * 1024, to_bytes("8g"));322ATF_REQUIRE_EQ(int64_t(16) * 1024 * 1024 * 1024 * 1024, to_bytes("16t"));323324ATF_REQUIRE_THROW_RE(std::runtime_error, "Empty", to_bytes(""));325ATF_REQUIRE_THROW_RE(std::runtime_error, "Unknown size unit 'd'",326to_bytes("12d"));327ATF_REQUIRE_THROW(std::runtime_error, to_bytes(" "));328ATF_REQUIRE_THROW(std::runtime_error, to_bytes(" k"));329}330331ATF_TEST_CASE(to_string);332ATF_TEST_CASE_HEAD(to_string)333{334set_md_var("descr", "Tests the to_string function");335}336ATF_TEST_CASE_BODY(to_string)337{338using atf::text::to_string;339340ATF_REQUIRE_EQ(to_string('a'), "a");341ATF_REQUIRE_EQ(to_string("a"), "a");342ATF_REQUIRE_EQ(to_string(5), "5");343}344345ATF_TEST_CASE(to_type);346ATF_TEST_CASE_HEAD(to_type)347{348set_md_var("descr", "Tests the to_type function");349}350ATF_TEST_CASE_BODY(to_type)351{352using atf::text::to_type;353354ATF_REQUIRE_EQ(to_type< int >("0"), 0);355ATF_REQUIRE_EQ(to_type< int >("1234"), 1234);356ATF_REQUIRE_THROW(std::runtime_error, to_type< int >(" "));357ATF_REQUIRE_THROW(std::runtime_error, to_type< int >("0 a"));358ATF_REQUIRE_THROW(std::runtime_error, to_type< int >("a"));359360ATF_REQUIRE_EQ(to_type< float >("0.5"), 0.5);361ATF_REQUIRE_EQ(to_type< float >("1234.5"), 1234.5);362ATF_REQUIRE_THROW(std::runtime_error, to_type< float >("0.5 a"));363ATF_REQUIRE_THROW(std::runtime_error, to_type< float >("a"));364365ATF_REQUIRE_EQ(to_type< std::string >("a"), "a");366}367368// ------------------------------------------------------------------------369// Main.370// ------------------------------------------------------------------------371372ATF_INIT_TEST_CASES(tcs)373{374// Add the test cases for the free functions.375ATF_ADD_TEST_CASE(tcs, duplicate);376ATF_ADD_TEST_CASE(tcs, join);377ATF_ADD_TEST_CASE(tcs, match);378ATF_ADD_TEST_CASE(tcs, split);379ATF_ADD_TEST_CASE(tcs, split_delims);380ATF_ADD_TEST_CASE(tcs, trim);381ATF_ADD_TEST_CASE(tcs, to_bool);382ATF_ADD_TEST_CASE(tcs, to_bytes);383ATF_ADD_TEST_CASE(tcs, to_string);384ATF_ADD_TEST_CASE(tcs, to_type);385}386387388