Author: antonp
Date: Mon Mar 20 08:32:51 2006
New Revision: 387240
URL: http://svn.apache.org/viewcvs?rev=387240&view=rev
Log:
2006-03-20 Anton Pevtsov <[EMAIL PROTECTED]>
* 21.string.replace.cpp (ReplaceData): Removed as obsolete
(TestCase): New structure to store a test case
(test_cases): Static array of the test cases
(test_replace): Functions updated to use TestCase and test_cases[]
instead of ReplaceData.
Modified:
incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp
Modified: incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp
URL:
http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp?rev=387240&r1=387239&r2=387240&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp Mon Mar 20
08:32:51 2006
@@ -1,6 +1,6 @@
/***************************************************************************
*
- * string.replace.cpp - string test exercising [lib.string::replace]
+ * 21.string.replace.cpp - string test exercising [lib.string::replace]
*
* $Id$
*
@@ -61,48 +61,175 @@
static const int long_string_len = 4096;
static char long_string [long_string_len];
+static const int long_parity_len = (long_string_len - 1) & 0x01 ?
+ (long_string_len - 1) / 2 : (long_string_len - 2) / 2;
+
static const char* exp_exceptions[] =
{ "unknown exception", "out_of_range", "length_error" };
/**************************************************************************/
-struct ReplaceData
-{
- ReplaceData (char* str, std::size_t str_len, int pos1, int num1,
- char* src, std::size_t src_len, int pos2, int num2,
- int cnt, char ch, char* res, std::size_t res_len,
- char* it_res, std::size_t it_res_len) :
- pos1_ (pos1), num1_ (num1), pos2_ (pos2), num2_ (num2),
- cnt_ (cnt), ch_ (ch), str_ (str), str_len_ (str_len), src_ (src),
- src_len_ (src_len), res_ (res), res_len_ (res_len), it_res_ (it_res),
- it_res_len_ (it_res_len) {
- }
+static const struct TestCase {
+
+ int line;
+
+ int pos1;
+ int num1;
+ int pos2;
+ int num2;
+ int cnt;
+ char ch;
+
+ char* str;
+ std::size_t str_len;
+
+ char* src;
+ std::size_t src_len;
+
+ char* res;
+ std::size_t res_len;
+
+ char* it_res;
+ std::size_t it_res_len;
+
+ int bthrow;
+
+} test_cases [] = {
+
+#undef TEST
+#define TEST(str, pos1, num1, src, pos2, num2, cnt, ch, res, it_res, bthrow) \
+ { __LINE__, pos1, num1, pos2, num2, cnt, ch, (char*) str, \
+ sizeof str - 1, (char*) src, sizeof src - 1, (char*) res, \
+ sizeof res - 1, (char*) it_res, sizeof it_res - 1, bthrow }
+
+ // +----------------------------------------- controlled sequence
+ // | +---------------------------------- replace() pos1 argument
+ // | | +------------------------------- replace() n1 argument
+ // | | | +---------------------------- replace with sequence
+ // | | | | +----------------- replace() pos2 argument
+ // | | | | | +-------------- replace() n2 argument
+ // | | | | | | +----------- replace() count argument
+ // | | | | | | | +-------- replace() with character
+ // | | | | | | | | +--- expected result sequence
+ // | | | | | | | | | + expected result sequence
+ // | | | | | | | | | | for iterators
+ // | | | | | | | | | | exception info ----+
+ // | | | | | | | | | | 0 - no exception |
+ // | | | | | | | | | | 1,2 - out_of_range |
+ // | | | | | | | | | | 3 - length_error |
+ // | | | | | | | | | | |
+ // | | | | | | | | | +----------+ |
+ // V V V V V V V V V V V
+ TEST ("ab", 0, 1, "c", 0, 1, 2, 'c', "cb", "cb", 0),
- int pos1_;
- int num1_;
- int pos2_;
- int num2_;
- int cnt_;
- char ch_;
-
- char* str_;
- std::size_t str_len_;
+ TEST ("", 0, 0, "", 0, 0, 0, 'c', "", "", 0),
+ TEST ("", 0, 0, "abc", 0, 3, 3, 'c', "abc", "abc", 0),
- char* src_;
- std::size_t src_len_;
+ TEST ("ab", 0, 2, "", 0, 0, 0, 'c', "", "", 0),
+ TEST ("ab", 0, 1, "", 0, 0, 0, 'c', "b", "b", 0),
- char* res_;
- std::size_t res_len_;
+ TEST ("\0", 0, 1, "", 0, 0, 0, ' ', "", "", 0),
+ TEST ("\0", 0, 1, "a", 0, 1, 1, 'a', "a", "a", 0),
+ TEST ("\0", 0, 1, "\0\0", 1, 1, 1, '\0', "\0", "\0", 0),
+ TEST ("\0", 0, 1, "\0\0", 0, 2, 2, '\0', "\0\0", "\0\0", 0),
+
+ TEST ("ah", 0, 1, "bcdefg", 0, 3, 1, 'c', "bcdh", "bcdefgh", 0),
+ TEST ("ah", 1, 1, "bcdefg", 0, 3, 1, 'c', "abcd", "abcdefg", 0),
+ TEST ("ah", 0, 1, "bcdefg", 1, 3, 4, 'c', "cdeh", "bcdefgh", 0),
+ TEST ("ah", 1, 1, "bcdefg", 1, 3, 4, 'c', "acde", "abcdefg", 0),
+ TEST ("ah", 0, 1, "bcdefg", 0, 6, 1, 'c', "bcdefgh", "bcdefgh", 0),
+ TEST ("ah", 1, 1, "bcdefg", 0, 6, 1, 'c', "abcdefg", "abcdefg", 0),
+
+ TEST ("abc", 0, 2, "cc", 0, 2, 2, 'c', "ccc", "ccc", 0),
+ TEST ("abc", 1, 2, "cc", 0, 2, 2, 'c', "acc", "acc", 0),
+
+ TEST ("abc", 0, 3, "d", 0, 1, 1, 'c', "d", "d", 0),
+ TEST ("abc", 0, 3, "def", 0, 3, 3, 'c', "def", "def", 0),
+ TEST ("abc", 0, 3, "defgh", 0, 5, 5, 'c', "defgh", "defgh", 0),
+ TEST ("abc", 2, 1, "defgh", 4, 1, 1, 'c', "abh", "abdefgh", 0),
+ TEST ("abc", 2, 1, "de\0gh", 2, 1, 1, 'c', "ab\0", "abde\0gh", 0),
+ TEST ("abc", 2, 1, "", 0, 0, 0, 'c', "ab", "ab", 0),
+
+ TEST ("abc", 1, 1, "defgh", 1, 2, 5, 'c', "aefc", "adefghc", 0),
+ TEST ("abc", 0, 0, "ee", 0, 2, 2, 'c', "eeab", "eeab", 0),
+ TEST ("abc", 0, 0, "\0\0e\0", 0, 4, 4, '\0', "\0\0e\0ab", "\0\0e\0ab", 0),
+ TEST ("abc", 2, 0, "ee", 0, 2, 2, 'c', "abee", "abee", 0),
+ TEST ("abc", 2, 0, "\0e\0\0", 0, 4, 4, '\0', "ab\0e\0\0", "ab\0e\0\0", 0),
+ TEST ("abc", 1, 0, "ee", 0, 2, 2, 'c', "aeebc", "aeebc", 0),
+
+ TEST ("abc", 1, 0, "\0e\0\0", 0, 4, 4, '\0', "a\0e\0\0bc",
+ "a\0e\0\0bc", 0),
+
+ TEST ("a\0b\0\0c", 0, 3, "", 0, 0, 1, '\0', "\0\0c", "\0\0c", 0),
+ TEST ("\0ab\0\0c", 0, 3, "", 0, 0, 1, '\0', "\0\0c", "\0\0c", 0),
+ TEST ("a\0b\0\0c", 0, 3, "\0e", 0, 2, 1, '\0', "\0e\0\0c", "\0e\0\0c", 0),
+
+ TEST ("a\0b\0\0c", 2, 3, "\0e", 0, 2, 1, '\0', "a\0\0ec", "a\0\0ec", 0),
+ TEST ("a\0b\0\0c", 2, 3, "\0e", 1, 1, 1, '\0', "a\0ec", "a\0\0ec", 0),
+ TEST ("\0ab\0\0c", 2, 3, "\0e", 0, 2, 1, '\0', "\0a\0ec", "\0a\0ec", 0),
+ TEST ("\0ab\0\0c", 2, 3, "\0e\0\0",
+ 1, 3, 5, '\0', "\0ae\0\0c",
+ "\0a\0e\0\0c", 0),
+
+ TEST ("a\0b\0\0c", 0, 6, "\0e", 0, 2, 2, '\0', "\0e", "\0e", 0),
+ TEST ("a\0b\0\0c", 0, 6, "\0e", 0, 1, 2, '\0', "\0", "\0e", 0),
+
+ TEST ("\0ab\0\0c", 0, 0, "\0e", 0, 2, 2, '\0', "\0e\0ab\0\0c",
+ "\0e\0ab\0\0c", 0),
+ TEST ("a\0b\0c\0", 6, 0, "e\0", 0, 2, 2, '\0', "a\0b\0c\0e\0",
+ "a\0b\0c\0e\0", 0),
+ TEST ("\0ab\0\0c", 5, 0, "\0e", 0, 2, 2, '\0', "\0ab\0\0\0ec",
+ "\0ab\0\0\0ec", 0),
+
+ TEST (long_string, 0, long_string_len - 1, "ab",
+ 0, 2, 2, 'a', "ab", "ab", 0),
+ TEST (long_string, 1, long_string_len - 2, "ab",
+ 0, 2, 2, 'a', "xab", "xab", 0),
+ TEST (long_string, 0, long_string_len - 2, "ab",
+ 0, 2, 2, 'a', "abx", "abx", 0),
+ TEST (long_string, 1, long_string_len - 3, "",
+ 0, 0, 0, 'a', "xx", "xx", 0),
+ TEST (long_string, 1, long_string_len - 4, "\0\0",
+ 0, 2, 1, '\0', "x\0\0xx", "x\0\0xx", 0),
+
+ TEST ("a", 0, 1, long_string, 0, long_string_len - 1, long_string_len - 1,
+ 'a', long_string, long_string, 0),
+
+ TEST (long_string, 0, long_string_len - 1, long_string, 0,
+ long_string_len - 1, long_string_len - 1,
+ 'a', long_string, long_string, 0),
+
+ TEST (long_string, 0, long_parity_len, long_string, 0,
+ long_parity_len, long_parity_len,
+ 'a', long_string, long_string, 0),
+
+ TEST (long_string, long_parity_len, long_string_len - 1 - long_parity_len,
+ long_string, 0, long_string_len - 1 - long_parity_len,
+ long_string_len - 1 - long_parity_len,
+ 'a', long_string, long_string, 0),
+
+#ifndef _RWSTD_NO_EXCEPTIONS
+
+ TEST ("\0", 2, 0, "", 0, 0, 0, ' ', "", "", 1),
+ TEST ("\0", 0, 0, "\0", 2, 0, 0, ' ', "", "", 2),
+
+ TEST ("a", 10, 0, "", 0, 0, 0, ' ', "", "", 1),
+ TEST ("a", 0, 0, "a", 10, 0, 0, ' ', "", "", 2),
+
+ TEST (long_string, long_string_len + 10, 0, "", 0, 0, 0, ' ', "", "", 1),
+ TEST (long_string, 0, 0, long_string, long_string_len + 10,
+ 0, 0, ' ', "", "", 2),
+
+#endif // _RWSTD_NO_EXCEPTIONS
- char* it_res_;
- std::size_t it_res_len_;
+ TEST ("last", 0, 4, "test", 0, 4, 4, 't', "test", "test", 0)
};
/**************************************************************************/
template <class String>
String& test_replace (int which,
- const ReplaceData &rd,
+ const TestCase &cs,
String &str,
typename String::value_type *wsrc,
bool test,
@@ -113,54 +240,51 @@
if (!test && (4 == which || 7 == which))
return str;
- const String& ref_src = String (wsrc, rd.src_len_);
+ const String& ref_src = String (wsrc, cs.src_len);
// construct iterators
- int first = std::size_t (rd.pos1_) > str.size () ? 0 : rd.pos1_;
- int last = rd.pos1_ + rd.num1_;
+ int first = std::size_t (cs.pos1) > str.size () ? 0 : cs.pos1;
+ int last = cs.pos1 + cs.num1;
typename String::iterator it_first (str.begin () + first);
- typename String::iterator it_last (std::size_t (last) >= rd.str_len_ ?
+ typename String::iterator it_last (std::size_t (last) >= cs.str_len ?
str.end () : str.begin () + last);
switch (which) {
case 1: {
if (test)
- return str.replace (rd.pos1_, rd.num1_, wsrc);
+ return str.replace (cs.pos1, cs.num1, wsrc);
else
- return str.replace (rd.pos1_, rd.num1_,
- String (wsrc));
+ return str.replace (cs.pos1, cs.num1, String (wsrc));
}
case 2: {
if (test)
- return str.replace (rd.pos1_, rd.num1_, ref_src);
+ return str.replace (cs.pos1, cs.num1, ref_src);
else
- return str.replace (rd.pos1_, rd.num1_, ref_src,
+ return str.replace (cs.pos1, cs.num1, ref_src,
0, String::npos);
}
case 3: {
if (test)
- return str.replace (rd.pos1_, rd.num1_, wsrc, rd.num2_);
+ return str.replace (cs.pos1, cs.num1, wsrc, cs.num2);
else
- return str.replace (rd.pos1_, rd.num1_,
- String (wsrc, rd.num2_));
+ return str.replace (cs.pos1, cs.num1, String (wsrc, cs.num2));
}
case 4: {
if (test)
- return str.replace (rd.pos1_, rd.num1_, ref_src,
- rd.pos2_, rd.num2_);
+ return str.replace (cs.pos1, cs.num1, ref_src,
+ cs.pos2, cs.num2);
else
return str;
}
case 5: {
if (test)
- return str.replace (rd.pos1_, rd.num1_, rd.cnt_,
- make_char (rd.ch_,
- (typename String::value_type*)0));
+ return str.replace (cs.pos1, cs.num1, cs.cnt, make_char (
+ cs.ch, (typename String::value_type*)0));
else
- return str.replace (rd.pos1_, rd.num1_,
- String (rd.cnt_, make_char (rd.ch_,
+ return str.replace (cs.pos1, cs.num1,
+ String (cs.cnt, make_char (cs.ch,
(typename String::value_type*)0)));
}
case 6: {
@@ -182,36 +306,36 @@
return str;
}
case 8: {
- *exp_len = str.length () + rd.num2_ - (it_last - it_first);
+ *exp_len = str.length () + cs.num2 - (it_last - it_first);
if (test)
- return str.replace (it_first, it_last, wsrc, rd.num2_);
+ return str.replace (it_first, it_last, wsrc, cs.num2);
else
return str.replace (it_first, it_last,
- String (wsrc, rd.num2_));
+ String (wsrc, cs.num2));
}
case 9: {
- *exp_len = str.length () + rd.cnt_ - (it_last - it_first);
+ *exp_len = str.length () + cs.cnt - (it_last - it_first);
if (test)
- return str.replace (it_first, it_last, rd.cnt_,
- make_char (rd.ch_,
+ return str.replace (it_first, it_last, cs.cnt,
+ make_char (cs.ch,
(typename String::value_type*)0));
else
return str.replace (it_first, it_last,
- String (rd.cnt_, make_char (rd.ch_,
+ String (cs.cnt, make_char (cs.ch,
(typename String::value_type*)0)));
}
case 10: {
// construct iterators
- int last2 = rd.pos2_ + rd.num2_;
+ int last2 = cs.pos2 + cs.num2;
InputIter<typename String::value_type> src_first =
- make_iter (wsrc + rd.pos2_, wsrc + rd.pos2_, wsrc + last2,
+ make_iter (wsrc + cs.pos2, wsrc + cs.pos2, wsrc + last2,
InputIter<typename String::value_type> (0, 0, 0));
InputIter<typename String::value_type> src_last =
- make_iter (wsrc + last2, wsrc + rd.pos2_, wsrc + last2,
+ make_iter (wsrc + last2, wsrc + cs.pos2, wsrc + last2,
InputIter<typename String::value_type> (0, 0, 0));
*exp_len = str.length () + (src_last.cur_ - src_first.cur_) -
@@ -232,11 +356,9 @@
template <class charT, class Traits>
void test_replace (charT, Traits*,
- int line,
- int which,
- MemFun *pfid,
- const ReplaceData &rd,
- int should_throw)
+ int which,
+ MemFun *pfid,
+ const TestCase &cs)
{
typedef std::basic_string <charT, Traits,
std::allocator<charT> > TestString;
@@ -250,19 +372,19 @@
bool use_iters = (6 <= which);
char* pstrres = use_res ?
- use_iters ? rd.it_res_ : rd.res_
- : rd.str_;
+ use_iters ? cs.it_res : cs.res
+ : cs.str;
std::size_t res_len = use_res ?
- use_iters ? rd.it_res_len_ : rd.res_len_
- : rd.str_len_;
+ use_iters ? cs.it_res_len : cs.res_len
+ : cs.str_len;
- rw_widen (wstr, rd.str_, rd.str_len_);
- rw_widen (wsrc, rd.src_, rd.src_len_);
+ rw_widen (wstr, cs.str, cs.str_len);
+ rw_widen (wsrc, cs.src, cs.src_len);
rw_widen (wres, pstrres, res_len);
- TestString s_str (wstr, rd.str_len_);
- TestString s_src (wsrc, rd.src_len_);
+ TestString s_str (wstr, cs.str_len);
+ TestString s_src (wsrc, cs.src_len);
TestString s_res (wres, res_len);
// used to workaround the problem with empty UserChar strings output
@@ -272,20 +394,20 @@
bool src_use_empty =
0 == s_src.size () && sizeof (charT) > sizeof (wchar_t);
- int first1_off = rd.pos1_;
- int last1_off = rd.pos1_ + rd.num1_;
+ int first1_off = cs.pos1;
+ int last1_off = cs.pos1 + cs.num1;
- int first2_off = rd.pos2_;
- int last2_off = rd.pos2_ + rd.num2_;
+ int first2_off = cs.pos2;
+ int last2_off = cs.pos2 + cs.num2;
#ifndef _RWSTD_NO_EXCEPTIONS
// is some exception expected ?
const char* expected = 0;
if (!use_iters) {
- if (1 == should_throw || 2 == should_throw && 4 == which)
+ if (1 == cs.bthrow || 2 == cs.bthrow && 4 == which)
expected = exp_exceptions[1];
- else if (3 == should_throw)
+ else if (3 == cs.bthrow)
expected = exp_exceptions[2];
}
@@ -300,9 +422,9 @@
std::size_t dummy_len = 0;
TestString& res_str =
- test_replace (which, rd, s_str, wsrc, true, &exp_len);
+ test_replace (which, cs, s_str, wsrc, true, &exp_len);
TestString& ctl_str =
- test_replace (which, rd, s_res, wsrc, false, &dummy_len);
+ test_replace (which, cs, s_res, wsrc, false, &dummy_len);
#define CALLFMAT \
"line %d. std::basic_string<%s, %s<%2$s>, %s<%2$s>>(%{#*s})." \
@@ -314,21 +436,21 @@
"%{?}, begin + %zu%{;}%{?}, begin + %zu%{;})"
#define CALLARGS \
- __LINE__, pfid->cname_, pfid->tname_, pfid->aname_, int (rd.str_len_), \
- rd.str_, 5 >= which, rd.pos1_, 6 <= which, first1_off, \
- 5 >= which, rd.num1_, 6 <= which, last1_off, \
+ __LINE__, pfid->cname_, pfid->tname_, pfid->aname_, int (cs.str_len), \
+ cs.str, 5 >= which, cs.pos1, 6 <= which, first1_off, \
+ 5 >= which, cs.num1, 6 <= which, last1_off, \
1 == which || 3 == which || 6 == which || 8 == which, \
- int (rd.src_len_), rd.src_, 2 == which || 4 == which || 7 == which, \
+ int (cs.src_len), cs.src, 2 == which || 4 == which || 7 == which, \
int (sizeof (charT)), src_use_empty ? &s_empty : &s_src, \
- 5 == which || 9 == which, rd.cnt_, 4 == which, rd.pos2_, \
- 3 == which || 4 == which || 8 == which, rd.num2_, \
- 5 == which || 9 == which, rd.ch_, 10 == which, first2_off, \
+ 5 == which || 9 == which, cs.cnt, 4 == which, cs.pos2, \
+ 3 == which || 4 == which || 8 == which, cs.num2, \
+ 5 == which || 9 == which, cs.ch, 10 == which, first2_off, \
10 == which, last2_off
// verify the results
if (4 == which || 7 == which) {
// verify the returned value
- rw_assert (&res_str == &s_str, 0, line,
+ rw_assert (&res_str == &s_str, 0, cs.line,
CALLFMAT " : the returned reference is invalid", CALLARGS);
}
@@ -336,7 +458,7 @@
if (use_iters) {
// verify the length
std::size_t len = res_str.length ();
- rw_assert (len == exp_len, 0, line,
+ rw_assert (len == exp_len, 0, cs.line,
CALLFMAT " : result length is %zu, %zu expected",
CALLARGS, len, exp_len);
}
@@ -350,10 +472,10 @@
bool use_empty_ctl =
0 == ctl_str.size () && sizeof (charT) > sizeof (wchar_t);
- rw_assert (success, 0, line,
- CALLFMAT " == %{#*S}, %{#*S} expected", CALLARGS,
- int (sizeof (charT)), use_empty_res ? &s_empty : &res_str,
- int (sizeof (charT)), use_empty_ctl ? &s_empty : &ctl_str);
+ rw_assert (success, 0, cs.line,
+ CALLFMAT " == %{#*S}, got %{#*S}", CALLARGS,
+ int (sizeof (charT)), use_empty_ctl ? &s_empty : &ctl_str,
+ int (sizeof (charT)), use_empty_res ? &s_empty : &res_str);
#ifndef _RWSTD_NO_EXCEPTIONS
@@ -372,7 +494,7 @@
_RWSTD_UNUSED (should_throw);
#endif // _RWSTD_NO_EXCEPTIONS
- rw_assert (caught == expected, 0, line,
+ rw_assert (caught == expected, 0, cs.line,
CALLFMAT " %{?}expected %s, caught %s"
"%{:}unexpectedly caught %s%{;}",
CALLARGS, 0 != expected, expected, caught, caught);
@@ -380,47 +502,6 @@
/**************************************************************************/
-void test_replace (MemFun *pfid,
- int line,
- int which,
- const ReplaceData &rd,
- int should_throw)
-{
-#undef TEST
-#define TEST(charT, Traits) \
- test_replace (charT(), (Traits*)0, line, which, pfid, rd, should_throw)
-
- if (!rw_enabled (line)) {
- rw_note (0, 0, __LINE__, "test on line %d disabled", line);
- return;
- }
-
- if (MemFun:: DefaultTraits == pfid->tid_) {
- if (MemFun::Char == pfid->cid_)
- TEST (char, std::char_traits<char>);
-
-#ifndef _RWSTD_NO_WCHAR_T
- else
- TEST (wchar_t, std::char_traits<wchar_t>);
-#endif // _RWSTD_NO_WCHAR_T
-
- }
- else {
- if (MemFun::Char == pfid->cid_)
- TEST (char, UserTraits<char>);
-
-#ifndef _RWSTD_NO_WCHAR_T
- else if (MemFun::WChar == pfid->cid_)
- TEST (wchar_t, UserTraits<wchar_t>);
-#endif // _RWSTD_NO_WCHAR_T
-
- else
- TEST (UserChar, UserTraits<UserChar>);
- }
-}
-
-/**************************************************************************/
-
static int rw_opt_no_char_traits; // for --no-char_traits
static int rw_opt_no_user_traits; // for --no-user_traits
@@ -440,7 +521,9 @@
/**************************************************************************/
-void test_replace (MemFun* pfid, int which)
+static void
+test_replace (MemFun *pfid,
+ int which)
{
rw_info (0, 0, 0, "std::basic_string<%s, %s<%1$s>, %s<%1$s>>::"
"replace (%{?}size_type pos1%{;}%{?}iterator i1%{;}"
@@ -456,138 +539,47 @@
4 == which, 3 == which || 4 == which || 8 == which,
5 == which || 9 == which, 10 == which, 10 == which);
- std::size_t long_parity_len = (long_string_len - 1) & 0x01 ?
- (long_string_len - 1) / 2 : (long_string_len - 2) / 2;
-
#undef TEST
-#define TEST(str, pos1, num1, src, pos2, num2, cnt, ch, res, it_res, bthrow)
\
- test_replace (pfid, __LINE__, which, ReplaceData ((char*) str,
\
- sizeof str - 1, pos1, num1, (char*) src,
\
- sizeof src - 1, pos2, num2, cnt, ch, (char*) res,
\
- sizeof res - 1, (char*) it_res, sizeof it_res - 1), bthrow)
-
- // +----------------------------------------- controlled sequence
- // | +---------------------------------- replace() pos1 argument
- // | | +------------------------------- replace() n1 argument
- // | | | +---------------------------- replace with sequence
- // | | | | +----------------- replace() pos2 argument
- // | | | | | +-------------- replace() n2 argument
- // | | | | | | +----------- replace() count argument
- // | | | | | | | +-------- replace() with character
- // | | | | | | | | +--- expected result sequence
- // | | | | | | | | | + expected result sequence
- // | | | | | | | | | | for iterators
- // | | | | | | | | | | exception info ----+
- // | | | | | | | | | | 0 - no exception |
- // | | | | | | | | | | 1,2 - out_of_range |
- // | | | | | | | | | | 3 - length_error |
- // | | | | | | | | | | |
- // | | | | | | | | | +----------+ |
- // V V V V V V V V V V V
- TEST ("ab", 0, 1, "c", 0, 1, 2, 'c', "cb", "cb", 0);
-
- TEST ("", 0, 0, "", 0, 0, 0, 'c', "", "", 0);
- TEST ("", 0, 0, "abc", 0, 3, 3, 'c', "abc", "abc", 0);
+#define TEST(charT, Traits, cs) \
+ test_replace (charT(), (Traits*)0, which, pfid, cs)
- TEST ("ab", 0, 2, "", 0, 0, 0, 'c', "", "", 0);
- TEST ("ab", 0, 1, "", 0, 0, 0, 'c', "b", "b", 0);
+ static const std::size_t ncases = sizeof test_cases / sizeof *test_cases;
- TEST ("\0", 0, 1, "", 0, 0, 0, ' ', "", "", 0);
- TEST ("\0", 0, 1, "a", 0, 1, 1, 'a', "a", "a", 0);
- TEST ("\0", 0, 1, "\0\0", 1, 1, 1, '\0', "\0", "\0", 0);
- TEST ("\0", 0, 1, "\0\0", 0, 2, 2, '\0', "\0\0", "\0\0", 0);
-
- TEST ("ah", 0, 1, "bcdefg", 0, 3, 1, 'c', "bcdh", "bcdefgh", 0);
- TEST ("ah", 1, 1, "bcdefg", 0, 3, 1, 'c', "abcd", "abcdefg", 0);
- TEST ("ah", 0, 1, "bcdefg", 1, 3, 4, 'c', "cdeh", "bcdefgh", 0);
- TEST ("ah", 1, 1, "bcdefg", 1, 3, 4, 'c', "acde", "abcdefg", 0);
- TEST ("ah", 0, 1, "bcdefg", 0, 6, 1, 'c', "bcdefgh", "bcdefgh", 0);
- TEST ("ah", 1, 1, "bcdefg", 0, 6, 1, 'c', "abcdefg", "abcdefg", 0);
-
- TEST ("abc", 0, 2, "cc", 0, 2, 2, 'c', "ccc", "ccc", 0);
- TEST ("abc", 1, 2, "cc", 0, 2, 2, 'c', "acc", "acc", 0);
-
- TEST ("abc", 0, 3, "d", 0, 1, 1, 'c', "d", "d", 0);
- TEST ("abc", 0, 3, "def", 0, 3, 3, 'c', "def", "def", 0);
- TEST ("abc", 0, 3, "defgh", 0, 5, 5, 'c', "defgh", "defgh", 0);
- TEST ("abc", 2, 1, "defgh", 4, 1, 1, 'c', "abh", "abdefgh", 0);
- TEST ("abc", 2, 1, "de\0gh", 2, 1, 1, 'c', "ab\0", "abde\0gh", 0);
- TEST ("abc", 2, 1, "", 0, 0, 0, 'c', "ab", "ab", 0);
-
- TEST ("abc", 1, 1, "defgh", 1, 2, 5, 'c', "aefc", "adefghc", 0);
- TEST ("abc", 0, 0, "ee", 0, 2, 2, 'c', "eeab", "eeab", 0);
- TEST ("abc", 0, 0, "\0\0e\0", 0, 4, 4, '\0', "\0\0e\0ab", "\0\0e\0ab", 0);
- TEST ("abc", 2, 0, "ee", 0, 2, 2, 'c', "abee", "abee", 0);
- TEST ("abc", 2, 0, "\0e\0\0", 0, 4, 4, '\0', "ab\0e\0\0", "ab\0e\0\0", 0);
- TEST ("abc", 1, 0, "ee", 0, 2, 2, 'c', "aeebc", "aeebc", 0);
+ for (std::size_t i = 0; i != ncases; ++i) {
- TEST ("abc", 1, 0, "\0e\0\0", 0, 4, 4, '\0', "a\0e\0\0bc",
- "a\0e\0\0bc", 0);
-
- TEST ("a\0b\0\0c", 0, 3, "", 0, 0, 1, '\0', "\0\0c", "\0\0c", 0);
- TEST ("\0ab\0\0c", 0, 3, "", 0, 0, 1, '\0', "\0\0c", "\0\0c", 0);
- TEST ("a\0b\0\0c", 0, 3, "\0e", 0, 2, 1, '\0', "\0e\0\0c", "\0e\0\0c", 0);
-
- TEST ("a\0b\0\0c", 2, 3, "\0e", 0, 2, 1, '\0', "a\0\0ec", "a\0\0ec", 0);
- TEST ("a\0b\0\0c", 2, 3, "\0e", 1, 1, 1, '\0', "a\0ec", "a\0\0ec", 0);
- TEST ("\0ab\0\0c", 2, 3, "\0e", 0, 2, 1, '\0', "\0a\0ec", "\0a\0ec", 0);
- TEST ("\0ab\0\0c", 2, 3, "\0e\0\0",
- 1, 3, 5, '\0', "\0ae\0\0c",
- "\0a\0e\0\0c", 0);
-
- TEST ("a\0b\0\0c", 0, 6, "\0e", 0, 2, 2, '\0', "\0e", "\0e", 0);
- TEST ("a\0b\0\0c", 0, 6, "\0e", 0, 1, 2, '\0', "\0", "\0e", 0);
-
- TEST ("\0ab\0\0c", 0, 0, "\0e", 0, 2, 2, '\0', "\0e\0ab\0\0c",
- "\0e\0ab\0\0c", 0);
- TEST ("a\0b\0c\0", 6, 0, "e\0", 0, 2, 2, '\0', "a\0b\0c\0e\0",
- "a\0b\0c\0e\0", 0);
- TEST ("\0ab\0\0c", 5, 0, "\0e", 0, 2, 2, '\0', "\0ab\0\0\0ec",
- "\0ab\0\0\0ec", 0);
-
- TEST (long_string, 0, long_string_len - 1, "ab",
- 0, 2, 2, 'a', "ab", "ab", 0);
- TEST (long_string, 1, long_string_len - 2, "ab",
- 0, 2, 2, 'a', "xab", "xab", 0);
- TEST (long_string, 0, long_string_len - 2, "ab",
- 0, 2, 2, 'a', "abx", "abx", 0);
- TEST (long_string, 1, long_string_len - 3, "",
- 0, 0, 0, 'a', "xx", "xx", 0);
- TEST (long_string, 1, long_string_len - 4, "\0\0",
- 0, 2, 1, '\0', "x\0\0xx", "x\0\0xx", 0);
-
- TEST ("a", 0, 1, long_string, 0, long_string_len - 1, long_string_len - 1,
- 'a', long_string, long_string, 0);
-
- TEST (long_string, 0, long_string_len - 1, long_string, 0,
- long_string_len - 1, long_string_len - 1,
- 'a', long_string, long_string, 0);
+ if (!rw_enabled (test_cases[i].line)) {
+ rw_note (0, 0, __LINE__,
+ "test on line %d disabled", test_cases[i].line);
+ continue;
+ }
- TEST (long_string, 0, long_parity_len, long_string, 0,
- long_parity_len, long_parity_len,
- 'a', long_string, long_string, 0);
+ // do not exercise exceptions if they were disabled
+ if (0 != rw_opt_no_exceptions && 0 != test_cases[i].bthrow)
+ continue;
+
+ if (MemFun:: DefaultTraits == pfid->tid_) {
+ if (MemFun::Char == pfid->cid_)
+ TEST (char, std::char_traits<char>, test_cases[i]);
- TEST (long_string, long_parity_len, long_string_len - 1 - long_parity_len,
- long_string, 0, long_string_len - 1 - long_parity_len,
- long_string_len - 1 - long_parity_len,
- 'a', long_string, long_string, 0);
+ #ifndef _RWSTD_NO_WCHAR_T
+ else
+ TEST (wchar_t, std::char_traits<wchar_t>, test_cases[i]);
+ #endif // _RWSTD_NO_WCHAR_T
-#ifndef _RWSTD_NO_EXCEPTIONS
+ }
+ else {
+ if (MemFun::Char == pfid->cid_)
+ TEST (char, UserTraits<char>, test_cases[i]);
+
+ #ifndef _RWSTD_NO_WCHAR_T
+ else if (MemFun::WChar == pfid->cid_)
+ TEST (wchar_t, UserTraits<wchar_t>, test_cases[i]);
+ #endif // _RWSTD_NO_WCHAR_T
- if (! rw_opt_no_exceptions) {
- TEST ("\0", 2, 0, "", 0, 0, 0, ' ', "", "", 1);
- TEST ("\0", 0, 0, "\0", 2, 0, 0, ' ', "", "", 2);
-
- TEST ("a", 10, 0, "", 0, 0, 0, ' ', "", "", 1);
- TEST ("a", 0, 0, "a", 10, 0, 0, ' ', "", "", 2);
-
- TEST (long_string, long_string_len + 10, 0, "",
- 0, 0, 0, ' ', "", "", 1);
- TEST (long_string, 0, 0, long_string, long_string_len + 10,
- 0, 0, ' ', "", "", 2);
+ else
+ TEST (UserChar, UserTraits<UserChar>, test_cases[i]);
+ }
}
-
-#endif // _RWSTD_NO_EXCEPTIONS
}
/**************************************************************************/