stdcxx-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ant...@apache.org
Subject svn commit: r387240 - /incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp
Date Mon, 20 Mar 2006 16:32:52 GMT
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  <antonp@moscow.vdiweb.com>

	* 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
 }
 
 /**************************************************************************/



Mime
View raw message