You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2006/05/06 23:18:38 UTC

svn commit: r400371 - /incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp

Author: sebor
Date: Sat May  6 14:18:36 2006
New Revision: 400371

URL: http://svn.apache.org/viewcvs?rev=400371&view=rev
Log:
2006-05-06  Martin Sebor  <se...@roguewave.com>

	* 21.string.compare.cpp (test_compare): Used StringState and simplified
	the detection and reporting of exception safety violations. Made naming
	and formatting changes.

Modified:
    incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp

Modified: incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp?rev=400371&r1=400370&r2=400371&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp Sat May  6 14:18:36 2006
@@ -2,7 +2,7 @@
  *
  * 21.string.compare.cpp - string test exercising lib.string.compare
  *
- * $Id$ 
+ * $Id$
  *
  ***************************************************************************
  *
@@ -22,17 +22,23 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
- * 
+ *
  **************************************************************************/
 
 #include <string>       // for string
-#include <cstdlib>      // for free(), size_t
+#include <cstddef>      // for size_t
 #include <stdexcept>    // for out_of_range, length_error
 
 #include <21.strings.h> // for StringMembers
-#include <driver.h>     // for rw_test()
+#include <driver.h>     // for rw_assert()
 #include <rw_char.h>    // for rw_widen()
 
+/**************************************************************************/
+
+// for convenience and brevity
+#define NPOS              _RWSTD_SIZE_MAX
+#define LSTR              StringMembers::long_string
+#define LLEN              StringMembers::long_string_len
 #define Compare(which)    StringMembers::compare_ ## which
 
 typedef StringMembers::OverloadId OverloadId;
@@ -40,12 +46,6 @@
 typedef StringMembers::Test       Test;
 typedef StringMembers::Function   MemFun;
 
-/**************************************************************************/
-
-// for convenience and brevity
-#define NPOS      _RWSTD_SIZE_MAX
-#define LSTR      StringMembers::long_string
-#define LLEN      StringMembers::long_string_len
 
 static const char* const exceptions[] = {
     "unknown exception", "out_of_range", "length_error",
@@ -54,24 +54,27 @@
 
 /**************************************************************************/
 
-// used to exercise 
+// exercises:
 // compare (const value_type*)
-static const TestCase ptr_test_cases [] = {
+static const TestCase
+ptr_test_cases [] = {
 
 #undef TEST
-#define TEST(str, arg, res, bthrow)                               \
-    { __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, arg,     \
-      sizeof arg - 1, 0, res, bthrow }
+#define TEST(str, arg, res, bthrow) {           \
+        __LINE__, -1, -1, -1, -1, -1,           \
+        str, sizeof str - 1,                    \
+        arg, sizeof arg - 1, 0, res, bthrow     \
+    }
 
     //    +------------------------------------------ controlled sequence
     //    |                  +----------------------- sequence to be inserted
-    //    |                  |                +------ expected result 
-    //    |                  |                |       +-- exception info 
+    //    |                  |                +------ expected result
+    //    |                  |                |       +-- exception info
     //    |                  |                |       |     0   - no exception
     //    |                  |                |       |     1,2 - out_of_range
     //    |                  |                |       |     3   - length_error
-    //    |                  |                |       |                       
-    //    |                  |                |       |            
+    //    |                  |                |       |
+    //    |                  |                |       |
     //    V                  V                V       V
     TEST ("ab",              "ab",            0,      0),
 
@@ -117,27 +120,29 @@
     TEST ("last",            "last",          0,      0)
 };
 
-
 /**************************************************************************/
 
-// used to exercise 
+// exercises:
 // compare (const basic_string&)
-static const TestCase str_test_cases [] = {
+static const TestCase
+str_test_cases [] = {
 
 #undef TEST
-#define TEST(str, arg, res, bthrow)                               \
-    { __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, arg,     \
-      sizeof arg - 1, 0, res, bthrow }
+#define TEST(str, arg, res, bthrow) {           \
+        __LINE__, -1, -1, -1, -1, -1,           \
+        str, sizeof str - 1,                    \
+        arg, sizeof arg - 1, 0, res, bthrow     \
+    }
 
     //    +------------------------------------------- controlled sequence
     //    |                  +------------------------ sequence to be compared
-    //    |                  |                +------- expected result 
-    //    |                  |                |       +- exception info 
-    //    |                  |                |       |   0   - no exception        
-    //    |                  |                |       |   1,2 - out_of_range        
-    //    |                  |                |       |   3   - length_error        
-    //    |                  |                |       |                       
-    //    |                  |                |       |            
+    //    |                  |                +------- expected result
+    //    |                  |                |       +- exception info
+    //    |                  |                |       |   0   - no exception
+    //    |                  |                |       |   1,2 - out_of_range
+    //    |                  |                |       |   3   - length_error
+    //    |                  |                |       |
+    //    |                  |                |       |
     //    V                  V                V       V
     TEST ("ab",              "ab",            0,      0),
 
@@ -188,26 +193,29 @@
 
 /**************************************************************************/
 
-// used to exercise 
+// exercises:
 // compare (size_type, size_type, const value_type*)
-static const TestCase size_size_ptr_test_cases [] = {
+static const TestCase
+size_size_ptr_test_cases [] = {
 
 #undef TEST
-#define TEST(str, off, size, arg, res, bthrow)                       \
-    { __LINE__, off, size, -1, -1, -1, str, sizeof str - 1, arg,     \
-      sizeof arg - 1, 0, res, bthrow }
+#define TEST(str, off, size, arg, res, bthrow) {        \
+        __LINE__, off, size, -1, -1, -1,                \
+        str, sizeof str - 1,                            \
+        arg, sizeof arg - 1, 0, res, bthrow             \
+    }
 
     //    +------------------------------------------ controlled sequence
     //    |              +--------------------------- compare() off argument
     //    |              |   +----------------------- compare() n1 argument
     //    |              |   |  +-------------------- sequence to be compared
-    //    |              |   |  |                +--- expected result 
-    //    |              |   |  |                |   +- exception info 
-    //    |              |   |  |                |   |    0   - no exception        
-    //    |              |   |  |                |   |    1,2 - out_of_range        
-    //    |              |   |  |                |   |    3   - length_error        
-    //    |              |   |  |                |   |                       
-    //    |              |   |  |                |   |             
+    //    |              |   |  |                +--- expected result
+    //    |              |   |  |                |   +- exception info
+    //    |              |   |  |                |   |    0   - no exception
+    //    |              |   |  |                |   |    1,2 - out_of_range
+    //    |              |   |  |                |   |    3   - length_error
+    //    |              |   |  |                |   |
+    //    |              |   |  |                |   |
     //    V              V   V  V                V   V
     TEST ("ab",          0,  2, "ab",            0,  0),
 
@@ -278,26 +286,29 @@
 
 /**************************************************************************/
 
-// used to exercise 
+// exercises:
 // compare (size_type, size_type, basic_string&)
-static const TestCase size_size_str_test_cases [] = {
+static const TestCase
+size_size_str_test_cases [] = {
 
 #undef TEST
-#define TEST(str, off, size, arg, res, bthrow)                       \
-    { __LINE__, off, size, -1, -1, -1, str, sizeof str - 1, arg,     \
-      sizeof arg - 1, 0, res, bthrow }
+#define TEST(str, off, size, arg, res, bthrow) {        \
+        __LINE__, off, size, -1, -1, -1,                \
+        str, sizeof str - 1,                            \
+        arg, sizeof arg - 1, 0, res, bthrow             \
+    }
 
     //    +------------------------------------------ controlled sequence
     //    |              +--------------------------- compare() off argument
     //    |              |   +----------------------- compare() n1 argument
     //    |              |   |  +-------------------- sequence to be compared
-    //    |              |   |  |                +--- expected result 
-    //    |              |   |  |                |   +- exception info 
-    //    |              |   |  |                |   |    0   - no exception        
-    //    |              |   |  |                |   |    1,2 - out_of_range        
-    //    |              |   |  |                |   |    3   - length_error        
-    //    |              |   |  |                |   |                       
-    //    |              |   |  |                |   |             
+    //    |              |   |  |                +--- expected result
+    //    |              |   |  |                |   +- exception info
+    //    |              |   |  |                |   |    0   - no exception
+    //    |              |   |  |                |   |    1,2 - out_of_range
+    //    |              |   |  |                |   |    3   - length_error
+    //    |              |   |  |                |   |
+    //    |              |   |  |                |   |
     //    V              V   V  V                V   V
     TEST ("ab",          0,  2, "ab",            0,  0),
 
@@ -380,28 +391,31 @@
 
 /**************************************************************************/
 
-// used to exercise
+// exercises:
 // compare (size_type, size_type, const value_type*, size_type)
-static const TestCase size_size_ptr_size_test_cases [] = {
+static const TestCase
+size_size_ptr_size_test_cases [] = {
 
 #undef TEST
-#define TEST(str, off, size, arg, size2, res, bthrow)                     \
-    { __LINE__, off, size, -1, size2, -1, str, sizeof str - 1, arg,       \
-      sizeof arg - 1, 0, res, bthrow }
+#define TEST(str, off, size, arg, size2, res, bthrow) { \
+        __LINE__, off, size, -1, size2, -1,             \
+        str, sizeof str - 1,                            \
+        arg, sizeof arg - 1, 0, res, bthrow             \
+    }
 
     //    +------------------------------------------- controlled sequence
     //    |              +---------------------------- compare() off argument
     //    |              |   +------------------------ compare() n1 argument
     //    |              |   |  +--------------------- sequence to be compared
     //    |              |   |  |              +------ compare() n2 argument
-    //    |              |   |  |              |     +----- expected result 
-    //    |              |   |  |              |     |   +- exception info 
-    //    |              |   |  |              |     |   |  0   - no exception       
-    //    |              |   |  |              |     |   |  1,2 - out_of_range        
-    //    |              |   |  |              |     |   |  3   - length_error        
-    //    |              |   |  |              |     |   |                           
-    //    |              |   |  |              |     |   |             
-    //    V              V   V  V              V     V   V             
+    //    |              |   |  |              |     +----- expected result
+    //    |              |   |  |              |     |   +- exception info
+    //    |              |   |  |              |     |   |  0   - no exception
+    //    |              |   |  |              |     |   |  1,2 - out_of_range
+    //    |              |   |  |              |     |   |  3   - length_error
+    //    |              |   |  |              |     |   |
+    //    |              |   |  |              |     |   |
+    //    V              V   V  V              V     V   V
     TEST ("ab",          0,  2, "ab",          2,    0,  0),
 
     TEST ("",            0,  0, "",            0,    0,  0),
@@ -503,30 +517,33 @@
 
 /**************************************************************************/
 
-// used to exercise 
+// exercises:
 // compare (size_type, size_type, basic_string&, size_type, size_type)
-static const TestCase size_size_str_size_size_test_cases [] = {
+static const TestCase
+size_size_str_size_size_test_cases [] = {
 
 #undef TEST
-#define TEST(str, off, size, arg, off2, size2, res, bthrow)               \
-    { __LINE__, off, size, off2, size2, -1, str, sizeof str - 1, arg,     \
-      sizeof arg - 1, 0, res, bthrow }
+#define TEST(str, off, size, arg, off2, size2, res, bthrow) {   \
+        __LINE__, off, size, off2, size2, -1,                   \
+        str, sizeof str - 1,                                    \
+        arg, sizeof arg - 1, 0, res, bthrow                     \
+    }
 
     //    +------------------------------------------- controlled sequence
     //    |              +---------------------------- compare() off argument
     //    |              |   +------------------------ compare() n1 argument
     //    |              |   |  +--------------------- sequence to be inserted
     //    |              |   |  |              +------ compare() off2 argument
-    //    |              |   |  |              |   +-- compare() n2 argument 
-    //    |              |   |  |              |   |     +-- expected result 
-    //    |              |   |  |              |   |     |   +- exception info 
+    //    |              |   |  |              |   +-- compare() n2 argument
+    //    |              |   |  |              |   |     +-- expected result
+    //    |              |   |  |              |   |     |   +- exception info
     //    |              |   |  |              |   |     |   | 0-no exception
     //    |              |   |  |              |   |     |   | 1-out_of_range
     //    |              |   |  |              |   |     |   | 2-out_of_range
     //    |              |   |  |              |   |     |   | 3-length_error
-    //    |              |   |  |              |   |     |   |                         
-    //    |              |   |  |              |   |     |   |             
-    //    V              V   V  V              V   V     V   V       
+    //    |              |   |  |              |   |     |   |
+    //    |              |   |  |              |   |     |   |
+    //    V              V   V  V              V   V     V   V
     TEST ("ab",          0,  2, "ab",          0,  2,    0,  0),
 
     TEST ("",            0,  0, "",            0,  0,    0,  0),
@@ -645,14 +662,14 @@
     TEST (LSTR,    1, LLEN - 6, LSTR,    2, LLEN - 6,    0,  0),
     TEST (LSTR,    1, LLEN + 6, LSTR,    2, LLEN + 6,    1,  0),
     TEST ("xx",          0,  2, LSTR,    0, LLEN - 4, NPOS,  0),
-    TEST ("xx",          0,  2, LSTR,   LLEN - 6, 
+    TEST ("xx",          0,  2, LSTR,   LLEN - 6,
                                                    2,    0,  0),
     TEST (LSTR,    0, LLEN - 1, "xxxxx",       0,  5,    1,  0),
     TEST (LSTR,   LLEN - 6,  5, "xxxxx",       0,  5,    0,  0),
     TEST (LSTR,          2,  5, "xxxxx",       0,  5,    0,  0),
     TEST (LSTR,          5,  2, "xxxxx",       0,  3, NPOS,  0),
     TEST ("a\0x",        0,  3, LSTR,          0, 10, NPOS,  0),
-    TEST ("a\0x",        2,  1, LSTR,   LLEN - 2, 
+    TEST ("a\0x",        2,  1, LSTR,   LLEN - 2,
                                                    1,    0,  0),
     TEST (LSTR,          0, 10, "x\0b",        0,  2,    1,  0),
     TEST (LSTR,          0,  1, "x\0b",        0,  2, NPOS,  0),
@@ -671,9 +688,9 @@
 /**************************************************************************/
 
 template <class charT, class Traits>
-void test_compare (charT, Traits*,  
+void test_compare (charT, Traits*,
                    OverloadId      which,
-                   const TestCase &cs)
+                   const TestCase &tcase)
 {
     typedef std::allocator<charT>                        Allocator;
     typedef std::basic_string <charT, Traits, Allocator> TestString;
@@ -684,46 +701,47 @@
     static charT wstr [LLEN];
     static charT warg [LLEN];
 
-    rw_widen (wstr, cs.str, cs.str_len);
-    rw_widen (warg, cs.arg, cs.arg_len);
+    rw_widen (wstr, tcase.str, tcase.str_len);
+    rw_widen (warg, tcase.arg, tcase.arg_len);
 
-    TestString s_str (wstr, cs.str_len);
-    TestString s_arg (warg, cs.arg_len);
+    /* const */ TestString s_str (wstr, tcase.str_len);
+    const       TestString s_arg (warg, tcase.arg_len);
 
-    int res = 0;
+    // save the state of the string object before the call
+    // to detect wxception safety violations (changes to
+    // the state of the object after an exception)
+    const StringState str_state (rw_get_string_state (s_str));
 
-    const std::size_t     ssize    = s_str.size ();
-    const std::size_t     capacity = s_str.capacity ();
-    const ConstStringIter begin    = s_str.begin ();
+    int res = 0;
 
     // string function argument
-    const charT* const arg_ptr = cs.arg ? warg : s_str.c_str ();
-    const TestString&  arg_str = cs.arg ? s_arg : s_str;
+    const charT* const arg_ptr = tcase.arg ? warg : s_str.c_str ();
+    const TestString&  arg_str = tcase.arg ? s_arg : s_str;
 
     std::size_t total_compare_calls = 0;
     std::size_t n_compare_calls = 0;
-    std::size_t* rg_calls = 
-        rw_get_call_counters ((typename TestString::traits_type*)0, 
-                              (typename TestString::value_type*)0);
+    std::size_t* const rg_calls =
+        rw_get_call_counters ((Traits*)0, (charT*)0);
+
     if (rg_calls)
         total_compare_calls = rg_calls[UTMemFun::compare];
 
+    // (name of) expected and caught exception
+    const char* expected = 0;
+    const char* caught   = 0;
+
 #ifndef _RWSTD_NO_EXCEPTIONS
 
-    // is some exception expected ?
-    const char* expected = 0;
-    if (1 == cs.bthrow)
+    if (1 == tcase.bthrow)
         expected = exceptions [1];
-    if (2 == cs.bthrow && Compare (size_size_str_size_size) == which)
+    else if (2 == tcase.bthrow && Compare (size_size_str_size_size) == which)
         expected = exceptions [1];
-    if (3 == cs.bthrow)
+    else if (3 == tcase.bthrow)
         expected = exceptions [2];
 
-    const char* caught = 0;
-
 #else   // if defined (_RWSTD_NO_EXCEPTIONS)
 
-    if (cs.bthrow)
+    if (tcase.bthrow)
         return;
 
 #endif   // _RWSTD_NO_EXCEPTIONS
@@ -743,24 +761,24 @@
             }
 
             case Compare (size_size_ptr): {
-                res = s_str.compare (cs.off, cs.size, arg_ptr);
+                res = s_str.compare (tcase.off, tcase.size, arg_ptr);
                 break;
             }
 
             case Compare (size_size_str): {
-                res = s_str.compare (cs.off, cs.size, arg_str);
+                res = s_str.compare (tcase.off, tcase.size, arg_str);
                 break;
             }
 
             case Compare (size_size_ptr_size): {
-                res = s_str.compare (cs.off, cs.size, 
-                                    arg_ptr, cs.size2);
+                res = s_str.compare (tcase.off, tcase.size,
+                                    arg_ptr, tcase.size2);
                 break;
             }
 
             case Compare (size_size_str_size_size): {
-                res = s_str.compare (cs.off, cs.size, 
-                                    arg_str, cs.off2, cs.size2);
+                res = s_str.compare (tcase.off, tcase.size,
+                                    arg_str, tcase.off2, tcase.size2);
                 break;
             }
 
@@ -770,17 +788,18 @@
         }
 
         // verify the returned value
-        bool success = (res < 0 && cs.nres == NPOS) || (res > 0 && cs.nres > 0) || 
-                       (res == 0 && cs.nres == 0);
-
-        rw_assert (success, 0, cs.line,
-                   "line %d. %{$FUNCALL} == %d, got %d", 
-                   __LINE__, cs.nres != NPOS ? cs.nres : -1, res);
+        bool success =    res < 0 && tcase.nres == NPOS
+                       || res > 0 && tcase.nres > 0
+                       || res == 0 && tcase.nres == 0;
+
+        rw_assert (success, 0, tcase.line,
+                   "line %d. %{$FUNCALL} == %d, got %d",
+                   __LINE__, tcase.nres != NPOS ? tcase.nres : -1, res);
 
         // verify that Traits::length was used
         if (Compare (str) == which && rg_calls) {
-            rw_assert (n_compare_calls - total_compare_calls > 0, 
-                       0, cs.line, "line %d. %{$FUNCALL} doesn't "
+            rw_assert (n_compare_calls - total_compare_calls > 0,
+                       0, tcase.line, "line %d. %{$FUNCALL} doesn't "
                        "use traits::compare()", __LINE__);
         }
     }
@@ -789,59 +808,42 @@
 
     catch (const std::out_of_range &ex) {
         caught = exceptions [1];
-        rw_assert (caught == expected, 0, cs.line,
+        rw_assert (caught == expected, 0, tcase.line,
                    "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
                    "unexpectedly%{;} caught std::%s(%#s)",
                    __LINE__, 0 != expected, expected, caught, ex.what ());
     }
     catch (const std::length_error &ex) {
         caught = exceptions [2];
-        rw_assert (caught == expected, 0, cs.line,
+        rw_assert (caught == expected, 0, tcase.line,
                    "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
                    "unexpectedly%{;} caught std::%s(%#s)",
                    __LINE__, 0 != expected, expected, caught, ex.what ());
     }
     catch (const std::exception &ex) {
         caught = exceptions [4];
-        rw_assert (0, 0, cs.line,
+        rw_assert (0, 0, tcase.line,
                    "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
                    "unexpectedly%{;} caught std::%s(%#s)",
                    __LINE__, 0 != expected, expected, caught, ex.what ());
     }
     catch (...) {
         caught = exceptions [0];
-        rw_assert (0, 0, cs.line,
+        rw_assert (0, 0, tcase.line,
                    "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
                    "unexpectedly%{;} caught %s",
                    __LINE__, 0 != expected, expected, caught);
     }
 
     if (caught) {
-            // verify that an exception thrown during allocation
-            // didn't cause a change in the state of the object
-
-        rw_assert (s_str.size () == ssize, 0, cs.line,
-                   "line %d: %{$FUNCALL}: size unexpectedly changed "
-                   "from %zu to %zu after an exception",
-                   __LINE__, ssize, s_str.size ());
-
-        rw_assert (s_str.capacity () == capacity, 0, cs.line,
-                   "line %d: %{$FUNCALL}: capacity unexpectedly "
-                   "changed from %zu to %zu after an exception",
-                   __LINE__, capacity, s_str.capacity ());
-
-        rw_assert (s_str.begin () == begin, 0, cs.line,
-                   "line %d: %{$FUNCALL}: begin() unexpectedly "
-                   "changed from after an exception by %d",
-                   __LINE__, s_str.begin () - begin);
+        // verify that an exception thrown during allocation
+        // didn't cause a change in the state of the object
+        str_state.assert_equal (rw_get_string_state (s_str),
+                                __LINE__, tcase.line, caught);
     }
 
-#else // if defined (_RWSTD_NO_EXCEPTIONS)
-
-    _RWSTD_UNUSED (ssize);
-    _RWSTD_UNUSED (capacity);
-
 #endif   // _RWSTD_NO_EXCEPTIONS
+
 }
 
 /**************************************************************************/