1240116Smarcel// Copyright (c) 2007 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 24240116Smarcel// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25240116Smarcel 26275988Sngie#include "atf-c++/detail/text.hpp" 27275988Sngie 28240116Smarcel#include <cstring> 29240116Smarcel#include <set> 30240116Smarcel#include <vector> 31240116Smarcel 32275988Sngie#include <atf-c++.hpp> 33240116Smarcel 34240116Smarcel// ------------------------------------------------------------------------ 35240116Smarcel// Test cases for the free functions. 36240116Smarcel// ------------------------------------------------------------------------ 37240116Smarcel 38240116SmarcelATF_TEST_CASE(duplicate); 39240116SmarcelATF_TEST_CASE_HEAD(duplicate) 40240116Smarcel{ 41240116Smarcel set_md_var("descr", "Tests the duplicate function"); 42240116Smarcel} 43240116SmarcelATF_TEST_CASE_BODY(duplicate) 44240116Smarcel{ 45240116Smarcel using atf::text::duplicate; 46240116Smarcel 47240116Smarcel const char* orig = "foo"; 48240116Smarcel 49240116Smarcel char* copy = duplicate(orig); 50240116Smarcel ATF_REQUIRE_EQ(std::strlen(copy), 3); 51240116Smarcel ATF_REQUIRE(std::strcmp(copy, "foo") == 0); 52240116Smarcel 53240116Smarcel std::strcpy(copy, "bar"); 54240116Smarcel ATF_REQUIRE(std::strcmp(copy, "bar") == 0); 55240116Smarcel ATF_REQUIRE(std::strcmp(orig, "foo") == 0); 56240116Smarcel} 57240116Smarcel 58240116SmarcelATF_TEST_CASE(join); 59240116SmarcelATF_TEST_CASE_HEAD(join) 60240116Smarcel{ 61240116Smarcel set_md_var("descr", "Tests the join function"); 62240116Smarcel} 63240116SmarcelATF_TEST_CASE_BODY(join) 64240116Smarcel{ 65240116Smarcel using atf::text::join; 66240116Smarcel 67240116Smarcel // First set of tests using a non-sorted collection, std::vector. 68240116Smarcel { 69240116Smarcel std::vector< std::string > words; 70240116Smarcel std::string str; 71240116Smarcel 72240116Smarcel words.clear(); 73240116Smarcel str = join(words, ","); 74240116Smarcel ATF_REQUIRE_EQ(str, ""); 75240116Smarcel 76240116Smarcel words.clear(); 77240116Smarcel words.push_back(""); 78240116Smarcel str = join(words, ","); 79240116Smarcel ATF_REQUIRE_EQ(str, ""); 80240116Smarcel 81240116Smarcel words.clear(); 82240116Smarcel words.push_back(""); 83240116Smarcel words.push_back(""); 84240116Smarcel str = join(words, ","); 85240116Smarcel ATF_REQUIRE_EQ(str, ","); 86240116Smarcel 87240116Smarcel words.clear(); 88240116Smarcel words.push_back("foo"); 89240116Smarcel words.push_back(""); 90240116Smarcel words.push_back("baz"); 91240116Smarcel str = join(words, ","); 92240116Smarcel ATF_REQUIRE_EQ(str, "foo,,baz"); 93240116Smarcel 94240116Smarcel words.clear(); 95240116Smarcel words.push_back("foo"); 96240116Smarcel words.push_back("bar"); 97240116Smarcel words.push_back("baz"); 98240116Smarcel str = join(words, ","); 99240116Smarcel ATF_REQUIRE_EQ(str, "foo,bar,baz"); 100240116Smarcel } 101240116Smarcel 102240116Smarcel // Second set of tests using a sorted collection, std::set. 103240116Smarcel { 104240116Smarcel std::set< std::string > words; 105240116Smarcel std::string str; 106240116Smarcel 107240116Smarcel words.clear(); 108240116Smarcel str = join(words, ","); 109240116Smarcel ATF_REQUIRE_EQ(str, ""); 110240116Smarcel 111240116Smarcel words.clear(); 112240116Smarcel words.insert(""); 113240116Smarcel str = join(words, ","); 114240116Smarcel ATF_REQUIRE_EQ(str, ""); 115240116Smarcel 116240116Smarcel words.clear(); 117240116Smarcel words.insert("foo"); 118240116Smarcel words.insert(""); 119240116Smarcel words.insert("baz"); 120240116Smarcel str = join(words, ","); 121240116Smarcel ATF_REQUIRE_EQ(str, ",baz,foo"); 122240116Smarcel 123240116Smarcel words.clear(); 124240116Smarcel words.insert("foo"); 125240116Smarcel words.insert("bar"); 126240116Smarcel words.insert("baz"); 127240116Smarcel str = join(words, ","); 128240116Smarcel ATF_REQUIRE_EQ(str, "bar,baz,foo"); 129240116Smarcel } 130240116Smarcel} 131240116Smarcel 132240116SmarcelATF_TEST_CASE(match); 133240116SmarcelATF_TEST_CASE_HEAD(match) 134240116Smarcel{ 135240116Smarcel set_md_var("descr", "Tests the match function"); 136240116Smarcel} 137240116SmarcelATF_TEST_CASE_BODY(match) 138240116Smarcel{ 139240116Smarcel using atf::text::match; 140240116Smarcel 141240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, match("", "[")); 142240116Smarcel 143240116Smarcel ATF_REQUIRE(match("", "")); 144240116Smarcel ATF_REQUIRE(!match("foo", "")); 145240116Smarcel 146240116Smarcel ATF_REQUIRE(match("", ".*")); 147240116Smarcel ATF_REQUIRE(match("", "[a-z]*")); 148240116Smarcel 149240116Smarcel ATF_REQUIRE(match("hello", "hello")); 150240116Smarcel ATF_REQUIRE(match("hello", "[a-z]+")); 151240116Smarcel ATF_REQUIRE(match("hello", "^[a-z]+$")); 152240116Smarcel 153240116Smarcel ATF_REQUIRE(!match("hello", "helooo")); 154240116Smarcel ATF_REQUIRE(!match("hello", "[a-z]+5")); 155240116Smarcel ATF_REQUIRE(!match("hello", "^ [a-z]+$")); 156240116Smarcel} 157240116Smarcel 158240116SmarcelATF_TEST_CASE(split); 159240116SmarcelATF_TEST_CASE_HEAD(split) 160240116Smarcel{ 161240116Smarcel set_md_var("descr", "Tests the split function"); 162240116Smarcel} 163240116SmarcelATF_TEST_CASE_BODY(split) 164240116Smarcel{ 165240116Smarcel using atf::text::split; 166240116Smarcel 167240116Smarcel std::vector< std::string > words; 168240116Smarcel 169240116Smarcel words = split("", " "); 170240116Smarcel ATF_REQUIRE_EQ(words.size(), 0); 171240116Smarcel 172240116Smarcel words = split(" ", " "); 173240116Smarcel ATF_REQUIRE_EQ(words.size(), 0); 174240116Smarcel 175240116Smarcel words = split(" ", " "); 176240116Smarcel ATF_REQUIRE_EQ(words.size(), 0); 177240116Smarcel 178240116Smarcel words = split("a b", " "); 179240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 180240116Smarcel ATF_REQUIRE_EQ(words[0], "a"); 181240116Smarcel ATF_REQUIRE_EQ(words[1], "b"); 182240116Smarcel 183240116Smarcel words = split("a b c d", " "); 184240116Smarcel ATF_REQUIRE_EQ(words.size(), 4); 185240116Smarcel ATF_REQUIRE_EQ(words[0], "a"); 186240116Smarcel ATF_REQUIRE_EQ(words[1], "b"); 187240116Smarcel ATF_REQUIRE_EQ(words[2], "c"); 188240116Smarcel ATF_REQUIRE_EQ(words[3], "d"); 189240116Smarcel 190240116Smarcel words = split("foo bar", " "); 191240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 192240116Smarcel ATF_REQUIRE_EQ(words[0], "foo"); 193240116Smarcel ATF_REQUIRE_EQ(words[1], "bar"); 194240116Smarcel 195240116Smarcel words = split("foo bar baz foobar", " "); 196240116Smarcel ATF_REQUIRE_EQ(words.size(), 4); 197240116Smarcel ATF_REQUIRE_EQ(words[0], "foo"); 198240116Smarcel ATF_REQUIRE_EQ(words[1], "bar"); 199240116Smarcel ATF_REQUIRE_EQ(words[2], "baz"); 200240116Smarcel ATF_REQUIRE_EQ(words[3], "foobar"); 201240116Smarcel 202240116Smarcel words = split(" foo bar", " "); 203240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 204240116Smarcel ATF_REQUIRE_EQ(words[0], "foo"); 205240116Smarcel ATF_REQUIRE_EQ(words[1], "bar"); 206240116Smarcel 207240116Smarcel words = split("foo bar", " "); 208240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 209240116Smarcel ATF_REQUIRE_EQ(words[0], "foo"); 210240116Smarcel ATF_REQUIRE_EQ(words[1], "bar"); 211240116Smarcel 212240116Smarcel words = split("foo bar ", " "); 213240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 214240116Smarcel ATF_REQUIRE_EQ(words[0], "foo"); 215240116Smarcel ATF_REQUIRE_EQ(words[1], "bar"); 216240116Smarcel 217240116Smarcel words = split(" foo bar ", " "); 218240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 219240116Smarcel ATF_REQUIRE_EQ(words[0], "foo"); 220240116Smarcel ATF_REQUIRE_EQ(words[1], "bar"); 221240116Smarcel} 222240116Smarcel 223240116SmarcelATF_TEST_CASE(split_delims); 224240116SmarcelATF_TEST_CASE_HEAD(split_delims) 225240116Smarcel{ 226240116Smarcel set_md_var("descr", "Tests the split function using different delimiters"); 227240116Smarcel} 228240116SmarcelATF_TEST_CASE_BODY(split_delims) 229240116Smarcel{ 230240116Smarcel using atf::text::split; 231240116Smarcel 232240116Smarcel std::vector< std::string > words; 233240116Smarcel 234240116Smarcel words = split("", "/"); 235240116Smarcel ATF_REQUIRE_EQ(words.size(), 0); 236240116Smarcel 237240116Smarcel words = split(" ", "/"); 238240116Smarcel ATF_REQUIRE_EQ(words.size(), 1); 239240116Smarcel ATF_REQUIRE_EQ(words[0], " "); 240240116Smarcel 241240116Smarcel words = split(" ", "/"); 242240116Smarcel ATF_REQUIRE_EQ(words.size(), 1); 243240116Smarcel ATF_REQUIRE_EQ(words[0], " "); 244240116Smarcel 245240116Smarcel words = split("a/b", "/"); 246240116Smarcel ATF_REQUIRE_EQ(words.size(), 2); 247240116Smarcel ATF_REQUIRE_EQ(words[0], "a"); 248240116Smarcel ATF_REQUIRE_EQ(words[1], "b"); 249240116Smarcel 250240116Smarcel words = split("aLONGDELIMbcdLONGDELIMef", "LONGDELIM"); 251240116Smarcel ATF_REQUIRE_EQ(words.size(), 3); 252240116Smarcel ATF_REQUIRE_EQ(words[0], "a"); 253240116Smarcel ATF_REQUIRE_EQ(words[1], "bcd"); 254240116Smarcel ATF_REQUIRE_EQ(words[2], "ef"); 255240116Smarcel} 256240116Smarcel 257240116SmarcelATF_TEST_CASE(trim); 258240116SmarcelATF_TEST_CASE_HEAD(trim) 259240116Smarcel{ 260240116Smarcel set_md_var("descr", "Tests the trim function"); 261240116Smarcel} 262240116SmarcelATF_TEST_CASE_BODY(trim) 263240116Smarcel{ 264240116Smarcel using atf::text::trim; 265240116Smarcel 266240116Smarcel ATF_REQUIRE_EQ(trim(""), ""); 267240116Smarcel ATF_REQUIRE_EQ(trim(" "), ""); 268240116Smarcel ATF_REQUIRE_EQ(trim("\t"), ""); 269240116Smarcel 270240116Smarcel ATF_REQUIRE_EQ(trim(" foo"), "foo"); 271240116Smarcel ATF_REQUIRE_EQ(trim("\t foo"), "foo"); 272240116Smarcel ATF_REQUIRE_EQ(trim(" \tfoo"), "foo"); 273240116Smarcel ATF_REQUIRE_EQ(trim("foo\t "), "foo"); 274240116Smarcel ATF_REQUIRE_EQ(trim("foo \t"), "foo"); 275240116Smarcel 276240116Smarcel ATF_REQUIRE_EQ(trim("foo bar"), "foo bar"); 277240116Smarcel ATF_REQUIRE_EQ(trim("\t foo bar"), "foo bar"); 278240116Smarcel ATF_REQUIRE_EQ(trim(" \tfoo bar"), "foo bar"); 279240116Smarcel ATF_REQUIRE_EQ(trim("foo bar\t "), "foo bar"); 280240116Smarcel ATF_REQUIRE_EQ(trim("foo bar \t"), "foo bar"); 281240116Smarcel} 282240116Smarcel 283240116SmarcelATF_TEST_CASE(to_bool); 284240116SmarcelATF_TEST_CASE_HEAD(to_bool) 285240116Smarcel{ 286240116Smarcel set_md_var("descr", "Tests the to_string function"); 287240116Smarcel} 288240116SmarcelATF_TEST_CASE_BODY(to_bool) 289240116Smarcel{ 290240116Smarcel using atf::text::to_bool; 291240116Smarcel 292240116Smarcel ATF_REQUIRE(to_bool("true")); 293240116Smarcel ATF_REQUIRE(to_bool("TRUE")); 294240116Smarcel ATF_REQUIRE(to_bool("yes")); 295240116Smarcel ATF_REQUIRE(to_bool("YES")); 296240116Smarcel 297240116Smarcel ATF_REQUIRE(!to_bool("false")); 298240116Smarcel ATF_REQUIRE(!to_bool("FALSE")); 299240116Smarcel ATF_REQUIRE(!to_bool("no")); 300240116Smarcel ATF_REQUIRE(!to_bool("NO")); 301240116Smarcel 302240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bool("")); 303240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bool("tru")); 304240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bool("true2")); 305240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bool("fals")); 306240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bool("false2")); 307240116Smarcel} 308240116Smarcel 309240116SmarcelATF_TEST_CASE(to_bytes); 310240116SmarcelATF_TEST_CASE_HEAD(to_bytes) 311240116Smarcel{ 312240116Smarcel set_md_var("descr", "Tests the to_bytes function"); 313240116Smarcel} 314240116SmarcelATF_TEST_CASE_BODY(to_bytes) 315240116Smarcel{ 316240116Smarcel using atf::text::to_bytes; 317240116Smarcel 318240116Smarcel ATF_REQUIRE_EQ(0, to_bytes("0")); 319240116Smarcel ATF_REQUIRE_EQ(12345, to_bytes("12345")); 320240116Smarcel ATF_REQUIRE_EQ(2 * 1024, to_bytes("2k")); 321240116Smarcel ATF_REQUIRE_EQ(4 * 1024 * 1024, to_bytes("4m")); 322240116Smarcel ATF_REQUIRE_EQ(int64_t(8) * 1024 * 1024 * 1024, to_bytes("8g")); 323240116Smarcel ATF_REQUIRE_EQ(int64_t(16) * 1024 * 1024 * 1024 * 1024, to_bytes("16t")); 324240116Smarcel 325240116Smarcel ATF_REQUIRE_THROW_RE(std::runtime_error, "Empty", to_bytes("")); 326240116Smarcel ATF_REQUIRE_THROW_RE(std::runtime_error, "Unknown size unit 'd'", 327240116Smarcel to_bytes("12d")); 328240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bytes(" ")); 329240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_bytes(" k")); 330240116Smarcel} 331240116Smarcel 332240116SmarcelATF_TEST_CASE(to_string); 333240116SmarcelATF_TEST_CASE_HEAD(to_string) 334240116Smarcel{ 335240116Smarcel set_md_var("descr", "Tests the to_string function"); 336240116Smarcel} 337240116SmarcelATF_TEST_CASE_BODY(to_string) 338240116Smarcel{ 339240116Smarcel using atf::text::to_string; 340240116Smarcel 341240116Smarcel ATF_REQUIRE_EQ(to_string('a'), "a"); 342240116Smarcel ATF_REQUIRE_EQ(to_string("a"), "a"); 343240116Smarcel ATF_REQUIRE_EQ(to_string(5), "5"); 344240116Smarcel} 345240116Smarcel 346240116SmarcelATF_TEST_CASE(to_type); 347240116SmarcelATF_TEST_CASE_HEAD(to_type) 348240116Smarcel{ 349240116Smarcel set_md_var("descr", "Tests the to_type function"); 350240116Smarcel} 351240116SmarcelATF_TEST_CASE_BODY(to_type) 352240116Smarcel{ 353240116Smarcel using atf::text::to_type; 354240116Smarcel 355240116Smarcel ATF_REQUIRE_EQ(to_type< int >("0"), 0); 356240116Smarcel ATF_REQUIRE_EQ(to_type< int >("1234"), 1234); 357240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_type< int >(" ")); 358240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_type< int >("0 a")); 359240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_type< int >("a")); 360240116Smarcel 361240116Smarcel ATF_REQUIRE_EQ(to_type< float >("0.5"), 0.5); 362240116Smarcel ATF_REQUIRE_EQ(to_type< float >("1234.5"), 1234.5); 363240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_type< float >("0.5 a")); 364240116Smarcel ATF_REQUIRE_THROW(std::runtime_error, to_type< float >("a")); 365240116Smarcel 366240116Smarcel ATF_REQUIRE_EQ(to_type< std::string >("a"), "a"); 367240116Smarcel} 368240116Smarcel 369240116Smarcel// ------------------------------------------------------------------------ 370240116Smarcel// Main. 371240116Smarcel// ------------------------------------------------------------------------ 372240116Smarcel 373240116SmarcelATF_INIT_TEST_CASES(tcs) 374240116Smarcel{ 375240116Smarcel // Add the test cases for the free functions. 376240116Smarcel ATF_ADD_TEST_CASE(tcs, duplicate); 377240116Smarcel ATF_ADD_TEST_CASE(tcs, join); 378240116Smarcel ATF_ADD_TEST_CASE(tcs, match); 379240116Smarcel ATF_ADD_TEST_CASE(tcs, split); 380240116Smarcel ATF_ADD_TEST_CASE(tcs, split_delims); 381240116Smarcel ATF_ADD_TEST_CASE(tcs, trim); 382240116Smarcel ATF_ADD_TEST_CASE(tcs, to_bool); 383240116Smarcel ATF_ADD_TEST_CASE(tcs, to_bytes); 384240116Smarcel ATF_ADD_TEST_CASE(tcs, to_string); 385240116Smarcel ATF_ADD_TEST_CASE(tcs, to_type); 386240116Smarcel} 387