Home | History | Annotate | Download | only in tests
      1 /**
      2  * @file string_manip_tests.cpp
      3  *
      4  * @remark Copyright 2003 OProfile authors
      5  * @remark Read the file COPYING
      6  *
      7  * @author John Levon
      8  * @author Philippe Elie
      9  */
     10 
     11 #include <stdlib.h>
     12 
     13 #include <algorithm>
     14 #include <iterator>
     15 #include <iostream>
     16 #include <utility>
     17 
     18 #include "string_manip.h"
     19 
     20 using namespace std;
     21 
     22 template <typename Input, typename Output>
     23 struct input_output {
     24 	Input input;
     25 	Output output;
     26 };
     27 
     28 
     29 template <typename Input, typename Output, typename Result>
     30 static void check_result(char const * fct_name, Input const & input,
     31 		  Output const & output, Result const & result)
     32 {
     33 	if (result != output) {
     34 		cerr << fct_name << ": \n"
     35 		     << "for:\n\"" << input << "\"\n"
     36 		     << "expect:\n\"" << output << "\"\n"
     37 		     << "found:\n\"" << result << "\"\n";
     38 		exit(EXIT_FAILURE);
     39 	}
     40 }
     41 
     42 
     43 static input_output<char const*, char const*> expect_erase[] =
     44 {
     45 	{ "", "" },
     46 	{ ";;;", "" },
     47 	{ "ab;;;cd", "cd" },
     48 	{ ";;;cd", "cd" },
     49 	{ "ab;;;", "" },
     50 	{ 0, 0 }
     51 };
     52 
     53 static void erase_to_last_of_tests()
     54 {
     55 	input_output<char const *, char const*> const * cur;
     56 	for (cur = expect_erase; cur->input; ++cur) {
     57 		string result = erase_to_last_of(cur->input, ';');
     58 		check_result("erase_to_last_of()", cur->input, cur->output,
     59 			     result);
     60 	}
     61 }
     62 
     63 
     64 static input_output<char const *, pair<string, string> > expect_split[] =
     65 {
     66 #define MAKE_PAIR(a, b)  make_pair(string(a), string(b))
     67 	{ "ab;cd", MAKE_PAIR("ab", "cd") },
     68 	{ ";cd",   MAKE_PAIR("",   "cd") },
     69 	{ "ab;",   MAKE_PAIR("ab", "")   },
     70 	{ "b;d",   MAKE_PAIR("b",  "d")  },
     71 	{ ";d",    MAKE_PAIR("",   "d")  },
     72 	{ "a;",    MAKE_PAIR("a",  "")   },
     73 	{ ";",     MAKE_PAIR("",   "")   },
     74 	{ "",      MAKE_PAIR("",   "")   },
     75 	{ 0,       MAKE_PAIR("",   "")   }
     76 #undef MAKE_PAIR
     77 };
     78 
     79 static void split_tests()
     80 {
     81 	input_output<char const *, pair<string, string> > const * cur;
     82 	for (cur = expect_split; cur->input; ++cur) {
     83 		string temp = cur->input;
     84 		string result = split(temp, ';');
     85 		check_result("split()", cur->input, cur->output.first, temp);
     86 		check_result("split()", cur->input, cur->output.second, result);
     87 	}
     88 }
     89 
     90 static input_output<char const *, pair<string, bool> > expect_is_prefix[] =
     91 {
     92 #define MAKE_PAIR(a, b)  make_pair(string(a), b)
     93 	{ "abcd", MAKE_PAIR("abc", true) },
     94 	{ "abcd", MAKE_PAIR("ac", false) },
     95 	{ "babcd", MAKE_PAIR("abc", false) },
     96 	// these invoke undefined behavior from is_prefix, we keep them
     97 	// for the record.
     98 //	{ "babcd", MAKE_PAIR("", false) },
     99 //	{ "", MAKE_PAIR("", false) },
    100 	{ 0, MAKE_PAIR("", true) }
    101 #undef MAKE_PAIR
    102 };
    103 
    104 static void is_prefix_tests()
    105 {
    106 	input_output<char const *, pair<string, bool> > const * cur;
    107 	for (cur = expect_is_prefix; cur->input; ++cur) {
    108 		bool result = is_prefix(cur->input, cur->output.first);
    109 		if (result != cur->output.second) {
    110 			cerr << "is_prefix(" << cur->input << ", "
    111 			     << cur->output.first << ") "
    112 			     << "return " << result << endl;
    113 			exit(EXIT_FAILURE);
    114 		}
    115 	}
    116 }
    117 
    118 
    119 static const size_t max_token = 8;
    120 static input_output<char const *, char const *[max_token]> expect_separate_token[] =
    121 {
    122 	{ "aa", { "aa" } },
    123 	{ "a\\c", { "a\\c" } },
    124 	{ "a\\\\c", { "a\\\\c" } },
    125 	{ "a\\\\c\\", { "a\\\\c\\" } },
    126 	{ "ab;cd;ef;gh", { "ab", "cd", "ef", "gh" } },
    127 	{ "ab\\;cd", { "ab;cd" } },
    128 	{ "a;a", { "a", "a" } },
    129 	{ ";a", { "", "a" } },
    130 	{ ";", { "", "" } },
    131 	{ ";;", { "", "", "" } },
    132 	{ 0, { 0, } }
    133 };
    134 
    135 
    136 static void separate_token_tests()
    137 {
    138 	input_output<char const *, char const *[max_token]> const * cur;
    139 	for (cur = expect_separate_token; cur->input; ++cur) {
    140 		vector<string> result = separate_token(cur->input, ';');
    141 		if (result.size() > max_token) {
    142 			cerr << "separate_token(): too many token\n"
    143 			     << "input:\n"
    144 			     << '"' << cur->input << "\"\n"
    145 			     << "output\n";
    146 			copy(result.begin(), result.end(),
    147 			     ostream_iterator<string>(cerr, "\n"));
    148 			exit(EXIT_FAILURE);
    149 		}
    150 		for (size_t i = 0; i < result.size(); ++i) {
    151 			if (result[i] != cur->output[i]) {
    152 				cerr << "separate_token():\n"
    153 				     << "input:\n"
    154 				     << cur->input << endl;
    155 				cerr << "expect:\n";
    156 				for (size_t i = 0; i < max_token; ++i) {
    157 					if (!cur->output[i])
    158 						break;
    159 					cerr << cur->output[i] << endl;
    160 				}
    161 				cerr << "output:\n";
    162 				copy(result.begin(), result.end(),
    163 				     ostream_iterator<string>(cerr, "\n"));
    164 				exit(EXIT_FAILURE);
    165 			}
    166 		}
    167 	}
    168 }
    169 
    170 
    171 static input_output<char const *, char const *> expect_rtrim[] =
    172 {
    173 	{ "abc", "abc" },
    174 	{ "abc  ", "abc" },
    175 	{ " abc  ", " abc" },
    176 	{ " abc \t \t", " abc" },
    177 	{ " ", "" },
    178 	{ "\t \t", "" },
    179 	{ "", "" },
    180 	{ 0, 0 }
    181 };
    182 
    183 static void rtrim_tests()
    184 {
    185 	input_output<char const *, char const*> const * cur;
    186 	for (cur = expect_rtrim; cur->input; ++cur) {
    187 		string result = rtrim(cur->input);
    188 		check_result("rtrim()", cur->input, cur->output, result);
    189 	}
    190 }
    191 
    192 
    193 static input_output<char const *, char const *> expect_ltrim[] =
    194 {
    195 	{ "abc", "abc" },
    196 	{ "abc ", "abc " },
    197 	{ " abc ", "abc " },
    198 	{ "\t  \tabc ", "abc " },
    199 	{ " ", "" },
    200 	{ "\t \t", "" },
    201 	{ "", "" },
    202 	{ 0, 0 }
    203 };
    204 
    205 static void ltrim_tests()
    206 {
    207 	input_output<char const *, char const*> const * cur;
    208 	for (cur = expect_ltrim; cur->input; ++cur) {
    209 		string result = ltrim(cur->input);
    210 		check_result("ltrim()", cur->input, cur->output, result);
    211 	}
    212 }
    213 
    214 
    215 static input_output<char const *, char const *> expect_trim[] =
    216 {
    217 	{ "abc", "abc" },
    218 	{ "abc ", "abc" },
    219 	{ " abc ", "abc" },
    220 	{ "\t  \tabc \t", "abc" },
    221 	{ " ", "" },
    222 	{ "\t \t", "" },
    223 	{ "", "" },
    224 	{ 0, 0 }
    225 };
    226 
    227 static void trim_tests()
    228 {
    229 	input_output<char const *, char const*> const * cur;
    230 	for (cur = expect_trim; cur->input; ++cur) {
    231 		string result = trim(cur->input);
    232 		check_result("trim()", cur->input, cur->output, result);
    233 	}
    234 }
    235 
    236 
    237 static input_output<double, char const *> expect_format_percent[] =
    238 {
    239 	{ 2.2,        " 2.2000" },
    240 	{ 0,          "      0" },
    241 	{ 100.00,     "100.000" },
    242 	{ 99.99999,   "100.000" },
    243 	{ 0.00000344, "3.4e-06" },
    244 	// FIXME, must be 3.e-124 but output is 3.4e-124
    245 //	{ 0.34e-123,  "3.e-124" },
    246 	{ -1.0, 0 }
    247 };
    248 
    249 static void format_percent_tests()
    250 {
    251 	input_output<double, char const*> const * cur;
    252 	for (cur = expect_format_percent; cur->input != -1.0; ++cur) {
    253 		string result = format_percent(cur->input, percent_int_width,
    254 		      percent_fract_width);
    255 		check_result("format_percent()", cur->input, cur->output,
    256 			     result);
    257 	}
    258 }
    259 
    260 
    261 static input_output<unsigned int, char const *> expect_from_str_to_uint[] =
    262 {
    263 	{ 123, "123" },
    264 	{ 33, "33" },
    265 	{ 0, "0" },
    266 	{ 0, 0 }
    267 };
    268 
    269 static void tostr_tests()
    270 {
    271 	input_output<unsigned int, char const *> const * cur;
    272 	for (cur = expect_from_str_to_uint; cur->output; ++cur) {
    273 		string result = op_lexical_cast<string>(cur->input);
    274 		check_result("op_lexical_cast()", cur->input,
    275 		     cur->output, result);
    276 	}
    277 }
    278 
    279 static void touint_tests()
    280 {
    281 	// reversed input/output of the previous tests
    282 	input_output<unsigned int, char const *> const * cur;
    283 	for (cur = expect_from_str_to_uint; cur->output; ++cur) {
    284 		unsigned int result =
    285 			op_lexical_cast<unsigned int>(cur->output);
    286 		check_result("op_lexical_cast()", cur->output, cur->input,
    287 		     result);
    288 	}
    289 }
    290 
    291 
    292 static input_output<char const*, bool> expect_from_str_to_bool[] =
    293 {
    294 	{ "0", false },
    295 	{ "1", true },
    296 	{ 0, 0 }
    297 };
    298 
    299 static void tobool_tests()
    300 {
    301 	input_output<char const *, bool> const * cur;
    302 	for (cur = expect_from_str_to_bool; cur->input; ++cur) {
    303 		bool result = op_lexical_cast<bool>(cur->input);
    304 		check_result("op_lexical_cast()", cur->input, cur->output,
    305 		     result);
    306 	}
    307 }
    308 
    309 // FIXME: more op_lexical_cast<> tests
    310 
    311 int main()
    312 {
    313 	erase_to_last_of_tests();
    314 	tostr_tests();
    315 	touint_tests();
    316 	tobool_tests();
    317 	split_tests();
    318 	is_prefix_tests();
    319 	separate_token_tests();
    320 	rtrim_tests();
    321 	ltrim_tests();
    322 	trim_tests();
    323 	format_percent_tests();
    324 	return EXIT_SUCCESS;
    325 }
    326