2
* @file string_manip_tests.cpp
4
* @remark Copyright 2003 OProfile authors
5
* @remark Read the file COPYING
8
* @author Philippe Elie
18
#include "string_manip.h"
22
template <typename Input, typename Output>
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)
33
if (result != output) {
34
cerr << fct_name << ": \n"
35
<< "for:\n\"" << input << "\"\n"
36
<< "expect:\n\"" << output << "\"\n"
37
<< "found:\n\"" << result << "\"\n";
43
static input_output<char const*, char const*> expect_erase[] =
53
static void erase_to_last_of_tests()
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,
64
static input_output<char const *, pair<string, string> > expect_split[] =
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("", "") }
79
static void split_tests()
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);
90
static input_output<char const *, pair<string, bool> > expect_is_prefix[] =
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
98
// { "babcd", MAKE_PAIR("", false) },
99
// { "", MAKE_PAIR("", false) },
100
{ 0, MAKE_PAIR("", true) }
104
static void is_prefix_tests()
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;
119
static const size_t max_token = 8;
120
static input_output<char const *, char const *[max_token]> expect_separate_token[] =
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" } },
131
{ ";;", { "", "", "" } },
136
static void separate_token_tests()
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"
144
<< '"' << cur->input << "\"\n"
146
copy(result.begin(), result.end(),
147
ostream_iterator<string>(cerr, "\n"));
150
for (size_t i = 0; i < result.size(); ++i) {
151
if (result[i] != cur->output[i]) {
152
cerr << "separate_token():\n"
154
<< cur->input << endl;
156
for (size_t i = 0; i < max_token; ++i) {
159
cerr << cur->output[i] << endl;
162
copy(result.begin(), result.end(),
163
ostream_iterator<string>(cerr, "\n"));
171
static input_output<char const *, char const *> expect_rtrim[] =
176
{ " abc \t \t", " abc" },
183
static void rtrim_tests()
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);
193
static input_output<char const *, char const *> expect_ltrim[] =
198
{ "\t \tabc ", "abc " },
205
static void ltrim_tests()
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);
215
static input_output<char const *, char const *> expect_trim[] =
220
{ "\t \tabc \t", "abc" },
227
static void trim_tests()
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);
237
static input_output<double, char const *> expect_format_percent[] =
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" },
249
static void format_percent_tests()
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,
261
static input_output<unsigned int, char const *> expect_from_str_to_uint[] =
269
static void tostr_tests()
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);
279
static void touint_tests()
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,
292
static input_output<char const*, bool> expect_from_str_to_bool[] =
299
static void tobool_tests()
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,
309
// FIXME: more op_lexical_cast<> tests
313
erase_to_last_of_tests();
319
separate_token_tests();
323
format_percent_tests();