Return-Path: Delivered-To: apmail-incubator-stdcxx-commits-archive@www.apache.org Received: (qmail 41911 invoked from network); 15 May 2006 08:15:10 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 15 May 2006 08:15:10 -0000 Received: (qmail 93771 invoked by uid 500); 15 May 2006 08:15:06 -0000 Delivered-To: apmail-incubator-stdcxx-commits-archive@incubator.apache.org Received: (qmail 93741 invoked by uid 500); 15 May 2006 08:15:06 -0000 Mailing-List: contact stdcxx-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: stdcxx-dev@incubator.apache.org Delivered-To: mailing list stdcxx-commits@incubator.apache.org Received: (qmail 93727 invoked by uid 99); 15 May 2006 08:15:06 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 May 2006 01:15:06 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Mon, 15 May 2006 01:15:01 -0700 Received: (qmail 41567 invoked by uid 65534); 15 May 2006 08:14:40 -0000 Message-ID: <20060515081440.41565.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r406581 [3/3] - /incubator/stdcxx/trunk/tests/strings/ Date: Mon, 15 May 2006 08:14:32 -0000 To: stdcxx-commits@incubator.apache.org From: antonp@apache.org X-Mailer: svnmailer-1.0.8 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Modified: incubator/stdcxx/trunk/tests/strings/21.string.insert.cpp URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.insert.cpp?rev=406581&r1=406580&r2=406581&view=diff ============================================================================== --- incubator/stdcxx/trunk/tests/strings/21.string.insert.cpp (original) +++ incubator/stdcxx/trunk/tests/strings/21.string.insert.cpp Mon May 15 01:14:29 2006 @@ -27,21 +27,17 @@ #include // for string #include // for out_of_range, length_error - #include // for size_t #include <21.strings.h> // for StringMembers #include // for InputIter #include // for rw_test() -#include // for rw_widen() +#include // for rw_expand() #include // for bad_alloc, replacement operator new /**************************************************************************/ // for convenience and brevity - -#define LSTR StringMembers::long_string -#define LLEN StringMembers::long_string_len #define Insert(which) StringMembers::insert_ ## which typedef StringMembers::OverloadId OverloadId; @@ -57,7 +53,7 @@ /**************************************************************************/ // used to exercise -// insert (size_type pos, const charT* s) +// insert (size_type, const value_type*) static const TestCase size_ptr_test_cases [] = { @@ -110,15 +106,18 @@ TEST ("abc", 2, 0, "ababcc", 0), TEST ("a\0bc\0\0", 0, 0, "aa\0bc\0\0", 0), TEST ("a\0bc\0\0", 6, 0, "a\0bc\0\0a", 0), + TEST ("x@4096", 5, 0, "x@8192", 0), - TEST ("", 0, LSTR, LSTR, 0), - TEST (LSTR, 0, "", LSTR, 0), + TEST ("", 0, "x@4096", "x@4096", 0), + TEST ("x@4096", 0, "", "x@4096", 0), + TEST ("x@4096", 2, "a@100", "xxa@100x@4094", 0), + TEST ("a@102", 2, "x@4096", "aax@4096a@100", 0), TEST ("\0", 2, "", "", 1), TEST ("a", 2, "", "", 1), - TEST (LSTR,LLEN + 10, "", "", 1), + TEST ("x@4096", 4106, "", "", 1), - TEST ("", 0, LSTR, LSTR, -1), + TEST ("", 0, "x@4096", "x@4096", -1), TEST ("last", 4, "test", "lasttest", 0) }; @@ -126,7 +125,7 @@ /**************************************************************************/ // used to exercise -// insert (size_type pos, const basic_string& str) +// insert (size_type, const basic_string&) static const TestCase size_str_test_cases [] = { @@ -178,15 +177,18 @@ TEST ("abc", 2, 0, "ababcc", 0), TEST ("a\0bc\0\0", 0, 0, "a\0bc\0\0a\0bc\0\0", 0), TEST ("a\0bc\0\0", 6, 0, "a\0bc\0\0a\0bc\0\0", 0), + TEST ("x@4096", 5, 0, "x@8192", 0), - TEST ("", 0, LSTR, LSTR, 0), - TEST (LSTR, 0, "", LSTR, 0), + TEST ("", 0, "x@4096", "x@4096", 0), + TEST ("x@4096", 0, "", "x@4096", 0), + TEST ("x@4096", 2, "a@100", "xxa@100x@4094", 0), + TEST ("a@102", 2, "x@4096", "aax@4096a@100", 0), TEST ("\0", 2, "", "", 1), TEST ("a", 2, "", "", 1), - TEST (LSTR,LLEN + 10, "", "", 1), + TEST ("x@4096", 4106, "", "", 1), - TEST ("", 0, LSTR, LSTR, -1), + TEST ("", 0, "x@4096", "x@4096", -1), TEST ("last", 4, "test", "lasttest", 0) }; @@ -194,8 +196,8 @@ /**************************************************************************/ // exrcises -// insert (size_type off, basic_string& str, size_type off2, size_type n) -// insert (iterator p, InputIterator first, InputIterator last) +// insert (size_type, basic_string&, size_type, size_type) +// insert (iterator, InputIterator, InputIterator) static const TestCase range_test_cases [] = { @@ -263,8 +265,14 @@ TEST ("a\0bc\0\0", 6, 0, 1, 3, "a\0bc\0\0\0bc", 0), TEST ("abcdef", 0, 0, 1, 2, "bcabcdef", 0), - TEST ("", 0, LSTR, 0, LLEN, LSTR, 0), - TEST (LSTR, 0, "", 0, 0, LSTR, 0), + TEST ("", 0, "x@4096", 0, 4096, "x@4096", 0), + TEST ("x@4096", 0, "", 0, 0, "x@4096", 0), + TEST ("a@1000", 0, "b@1000", 0, 999, "b@999a@1000", 0), + TEST ("a@1000", 1, "b@1001", 0, 1000, "ab@1000a@999", 0), + TEST ("a@1000", 2, "b@1002", 0, 1001, "aab@1001a@998", 0), + TEST ("a@1000", 998, "b@1000", 1, 999, "a@998b@999aa", 0), + TEST ("a@1000", 999, "b@1001", 2, 1000, "a@999b@999a", 0), + TEST ("a@1000", 2, "b@1002", 999, 1001, "aabbba@998", 0), TEST ("\0", 2, "", 0, 0, "", 1), TEST ("", 0, "\0", 2, 0, "", 2), @@ -272,10 +280,10 @@ TEST ("a", 2, "", 0, 0, "", 1), TEST ("", 0, "a", 2, 0, "", 2), - TEST (LSTR,LLEN + 10, "", 0, 0, "", 1), - TEST ("", 0, LSTR,LLEN + 10, 0, "", 2), + TEST ("x@4096", 4106, "", 0, 0, "", 1), + TEST ("", 0, "x@4096", 4106, 0, "", 2), - TEST ("", 0, LSTR, 0, LLEN - 1, LSTR, -1), + TEST ("", 0, "x@4096", 0, 4096, "x@4096", -1), TEST ("last", 4, "test", 0, 4, "lasttest", 0) }; @@ -283,7 +291,7 @@ /**************************************************************************/ // used to exercise -// insert (size_type pos, const charT* s, size_type n) +// insert (size_type, const value_type*, size_type) static const TestCase size_ptr_size_test_cases [] = { @@ -336,15 +344,24 @@ TEST ("abc", 2, 0, 2, "ababc", 0), TEST ("\0abc\0\0", 0, 0, 1, "\0\0abc\0\0", 0), TEST ("a\0bc\0\0", 6, 0, 3, "a\0bc\0\0a\0b", 0), + TEST ("a@4096", 0, 0, 1111, "a@5207", 0), + TEST ("b@4096", 1, 0, 2222, "b@6318", 0), + + TEST ("x@4096", 1, "\0", 1, "x\0x@4095", 0), + TEST ("x@4096", 0, "\0", 1, "\0x@4096", 0), + TEST ("x@4096", 4096, "\0", 1, "x@4096\0", 0), + TEST ("x@4096", 0, "ab", 2, "abx@4096", 0), + TEST ("x@4096", 4095, "ab", 1, "x@4095ax", 0), + TEST ("x@4096", 4094, "\0\0", 2, "x@4094\0\0xx", 0), - TEST ("", 0, LSTR, LLEN - 1, LSTR, 0), - TEST (LSTR, 0, "", 0, LSTR, 0), + TEST ("", 0, "x@4096", 4096, "x@4096", 0), + TEST ("x@4096", 0, "", 0, "x@4096", 0), TEST ("\0", 2, "", 0, "", 1), TEST ("a", 2, "", 0, "", 1), - TEST (LSTR,LLEN + 10, "", 0, "", 1), + TEST ("x@4096", 4106, "", 0, "", 1), - TEST ("", 0, LSTR, LLEN - 1, LSTR, -1), + TEST ("", 0, "x@4096", 4095, "x@4095", -1), TEST ("last", 4, "test", 4, "lasttest", 0) }; @@ -352,8 +369,8 @@ /**************************************************************************/ // exrecises -// insert (size_type pos, size_type n, charT c) -// insert (iterator p, size_type n, charT c) +// insert (size_type, size_type, value_type) +// insert (iterator, size_type, value_type) static const TestCase size_val_test_cases [] = { @@ -408,10 +425,18 @@ TEST ("\0ab\0\0c", 0, 3, '\0', "\0\0\0\0ab\0\0c", 0), TEST ("a\0bc\0\0", 6, 2, 'a', "a\0bc\0\0aa", 0), - TEST ("", 0, LLEN - 1, 'x', LSTR, 0), - TEST (LSTR, 0, 0, 'x', LSTR, 0), + TEST ("", 0, 4106, 'x', "x@4106", 0), + TEST ("x@4096", 0, 2, 'a', "aax@4096", 0), - TEST ("", 0, LLEN - 1, 'x', LSTR, -1), + TEST ("x@4096", 0, 2, 'a', "aax@4096", 0), + TEST ("x@4096", 1, 2, 'a', "xaax@4095", 0), + TEST ("x@4096", 1, 1, '\0', "x\0x@4095", 0), + + TEST ("a", 0, 4095, 'x', "x@4095a", 0), + TEST ("x@4096", 0, 2047, 'b', "b@2047x@4096", 0), + TEST ("x@4096", 2047, 2048, 'x', "x@6144", 0), + + TEST ("", 0, 4106, 'x', "x@4106", -1), TEST ("last", 4, 4, 't', "lasttttt", 0) }; @@ -419,7 +444,7 @@ /**************************************************************************/ // used to exercise -// insert (iterator p, charT c) +// insert (iterator, value_type) static const TestCase val_test_cases [] = { @@ -459,21 +484,23 @@ TEST ("\0ab\0\0c", 0, '\0', "\0\0ab\0\0c", 0), TEST ("a\0bc\0\0", 6, 'a', "a\0bc\0\0a", 0), -#undef TEST -#define TEST(str, len, off, val, res, bthrow) \ - { __LINE__, off, -1, -1, -1, val, str, len, 0, \ - 0, res, sizeof res - 1, bthrow } + TEST ("x@4096", 0, 'a', "ax@4096", 0), + TEST ("x@4096", 1, 'a', "xax@4095", 0), + TEST ("x@4096", 1, '\0', "x\0x@4095", 0), - TEST (LSTR + 1, LLEN - 2, 0, 'x', LSTR, -1), + TEST ("x@4095", 0, 'x', "x@4096", -1), - TEST ("last", 4, 4, 't', "lastt", 0) + TEST ("last", 4, 't', "lastt", 0) }; /**************************************************************************/ template -void test_insert_range (charT* wstr, - charT* warg, +void test_insert_range (const charT *wstr, + std::size_t wstr_len, + const charT *warg, + std::size_t warg_len, + std::size_t res_len, Traits*, const Iterator &it, const TestCase &tcase) @@ -485,36 +512,52 @@ const char* const itname = tcase.arg ? type_name (it, (charT*)0) : "basic_string::iterator"; - String s_str (wstr, tcase.str_len); - String s_arg (warg, tcase.arg_len); + // compute the size of the controlled sequence and the size + // of the sequence denoted by the argument keeping in mind + // that the latter may refer to the former + const std::size_t size1 = wstr_len; + const std::size_t size2 = tcase.arg ? warg_len : size1; + + // construct the string object to be modified + String s_str (wstr, size1); + + // compute the offset and the extent (the number of elements) + // of the first range into the string object being modified + const std::size_t off1 = + std::size_t (tcase.off) < size1 ? std::size_t (tcase.off) : size1; + + // compute the offset and the extent (the number of elements) + // of the second range into the argument of the function call + const std::size_t off2 = + std::size_t (tcase.off2) < size2 ? std::size_t (tcase.off2) : size2; + const std::size_t ext2 = + off2 + tcase.size2 < size2 ? std::size_t (tcase.size2) : size2 - off2; - std::size_t off_last = tcase.off2 + tcase.size2; - - StringIter iter (s_str.begin () + tcase.off); + // create an iterator into the string object being modified + StringIter iter (s_str.begin () + off1); if (tcase.arg) { - off_last = off_last > s_arg.size () ? s_arg.size () : off_last; + const charT* const beg = warg + off2; + const charT* const end = beg + ext2; - const Iterator first = make_iter (warg + tcase.off2, - warg + tcase.off2, warg + off_last, Iterator (0, 0, 0)); - const Iterator last = make_iter (warg + off_last, - warg + tcase.off2, warg + off_last, Iterator (0, 0, 0)); + const Iterator first (beg, beg, end); + const Iterator last (end, beg, end); s_str.insert (iter, first, last); } else { - const StringIter first (s_str.begin () + tcase.off2); - const StringIter last (off_last > s_str.size () ? - s_str.end () - : s_str.begin () + off_last); + // self-referential modification (inserting a range + // of elements with a subrange of its own elements) + const StringIter first (s_str.begin () + off2); + const StringIter last (first + ext2); s_str.insert (iter, first, last); } - const std::size_t match = - rw_match (tcase.res, s_str.c_str(), tcase.nres); + // detrmine whether the produced sequence matches the exepceted result + const std::size_t match = rw_match (tcase.res, s_str.data (), tcase.nres); - rw_assert (match == tcase.nres, 0, tcase.line, + rw_assert (match == res_len, 0, tcase.line, "line %d. %{$FUNCALL} expected %{#*s}, got %{/*.*Gs}, " "difference at pos %zu for %s", __LINE__, int (tcase.nres), tcase.res, @@ -525,15 +568,18 @@ /**************************************************************************/ template -void test_insert_range (charT* wstr, - charT* warg, +void test_insert_range (const charT *wstr, + std::size_t wstr_len, + const charT *warg, + std::size_t warg_len, + std::size_t res_len, Traits*, const TestCase &tcase) { if (tcase.bthrow) // this method doesn't throw return; - test_insert_range (wstr, warg, (Traits*)0, + test_insert_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, InputIter(0, 0, 0), tcase); // there is no need to call test_insert_range @@ -541,13 +587,13 @@ if (0 == tcase.arg) return; - test_insert_range (wstr, warg, (Traits*)0, + test_insert_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, ConstFwdIter(0, 0, 0), tcase); - test_insert_range (wstr, warg, (Traits*)0, + test_insert_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, ConstBidirIter(0, 0, 0), tcase); - test_insert_range (wstr, warg, (Traits*)0, + test_insert_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, ConstRandomAccessIter(0, 0, 0), tcase); } @@ -559,26 +605,52 @@ const TestCase &tcase) { typedef std::allocator Allocator; - typedef std::basic_string TestString; - typedef typename TestString::iterator StringIter; - typedef typename TestString::const_iterator ConstStringIter; + typedef std::basic_string String; + typedef typename String::iterator StringIter; + typedef typename UserTraits::MemFun UTMemFun; + + static const std::size_t BUFSIZE = 256; + + static charT wstr_buf [BUFSIZE]; + static charT warg_buf [BUFSIZE]; - typedef typename UserTraits::MemFun UTMemFun; + std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf; + std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf; - static charT wstr [LLEN]; - static charT warg [LLEN]; + charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len); + charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len); - rw_widen (wstr, tcase.str, tcase.str_len); - rw_widen (warg, tcase.arg, tcase.arg_len); + static charT wres_buf [BUFSIZE]; + std::size_t res_len = sizeof wres_buf / sizeof *wres_buf; + charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len); // special processing for insert_range to exercise all iterators if (Insert (range) == which) { - test_insert_range (wstr, warg, (Traits*)0, tcase); + test_insert_range (wstr, str_len, warg, arg_len, + res_len, (Traits*)0, tcase); + if (wstr != wstr_buf) + delete[] wstr; + + if (warg != warg_buf) + delete[] warg; + + if (wres != wres_buf) + delete[] wres; + return; } - /* const */ TestString s_str (wstr, tcase.str_len); - const TestString s_arg (warg, tcase.arg_len); + /* const */ String s_str (wstr, str_len); + const String s_arg (warg, arg_len); + + if (wstr != wstr_buf) + delete[] wstr; + + if (warg != warg_buf) + delete[] warg; + + wstr = 0; + warg = 0; // save the state of the string object before the call // to detect wxception safety violations (changes to @@ -588,8 +660,14 @@ std::size_t res_off = 0; std::size_t exp_off = Insert (val) == which ? tcase.off : 0; - const charT* const arg_ptr = tcase.arg ? warg : s_str.c_str (); - const TestString& arg_str = tcase.arg ? s_arg : s_str; + // compute the offset and the extent (the number of elements) + // of the first range into the string object being modified + const std::size_t size1 = str_len; + const std::size_t off1 = + std::size_t (tcase.off) < size1 ? std::size_t (tcase.off) : size1; + + const charT* const arg_ptr = tcase.arg ? s_arg.c_str () : s_str.c_str (); + const String& arg_str = tcase.arg ? s_arg : s_str; const charT arg_val = make_char (char (tcase.val), (charT*)0); std::size_t total_length_calls = 0; @@ -628,15 +706,19 @@ #else // if defined (_RWSTD_NO_EXCEPTIONS) - if (tcase.bthrow) - return; + if (tcase.bthrow) { + if (wres != wres_buf) + delete[] wres; + + return; + } #endif // _RWSTD_NO_EXCEPTIONS try { switch (which) { case Insert (size_ptr): { - const TestString& s_res = s_str.insert (tcase.off, arg_ptr); + const String& s_res = s_str.insert (tcase.off, arg_ptr); res_off = &s_res - &s_str; if (rg_calls) n_length_calls = rg_calls [UTMemFun::length]; @@ -644,40 +726,40 @@ } case Insert (size_str): { - const TestString& s_res = s_str.insert (tcase.off, arg_str); + const String& s_res = s_str.insert (tcase.off, arg_str); res_off = &s_res - &s_str; break; } case Insert (size_ptr_size): { - const TestString& s_res = + const String& s_res = s_str.insert (tcase.off, arg_ptr, tcase.size2); res_off = &s_res - &s_str; break; } case Insert (size_str_size_size): { - const TestString& s_res = + const String& s_res = s_str.insert (tcase.off, arg_str, tcase.off2, tcase.size2); res_off = &s_res - &s_str; break; } case Insert (size_size_val): { - const TestString& s_res = + const String& s_res = s_str.insert (tcase.off, tcase.size2, arg_val); res_off = &s_res - &s_str; break; } case Insert (size_val): { - StringIter it (s_str.begin () + tcase.off); + StringIter it (s_str.begin () + off1); s_str.insert (it, tcase.size2, arg_val); break; } case Insert (val): { - StringIter it (s_str.begin () + tcase.off); + StringIter it (s_str.begin () + off1); StringIter res_it = s_str.insert (it, arg_val); res_off = res_it - s_str.begin (); break; @@ -696,21 +778,21 @@ Insert (val) != which, res_off); // verfiy that strings length are equal - rw_assert (tcase.nres == s_str.size (), 0, tcase.line, + rw_assert (res_len == s_str.size (), 0, tcase.line, "line %d. %{$FUNCALL} expected %{#*s} with length " "%zu, got %{/*.*Gs} with length %zu", __LINE__, - int (tcase.nres), tcase.res, tcase.nres, + int (tcase.nres), tcase.res, res_len, int (sizeof (charT)), int (s_str.size ()), s_str.c_str (), s_str.size ()); - if (tcase.nres == s_str.size ()) { + if (res_len == s_str.size ()) { // if the result length matches the expected length // (and only then), also verify that the modified // string matches the expected result const std::size_t match = rw_match (tcase.res, s_str.c_str(), tcase.nres); - rw_assert (match == tcase.nres, 0, tcase.line, + rw_assert (match == res_len, 0, tcase.line, "line %d. %{$FUNCALL} expected %{#*s}, " "got %{/*.*Gs}, difference at offset %zu", __LINE__, int (tcase.nres), tcase.res, @@ -802,6 +884,9 @@ #endif // _RWSTD_NO_REPLACEABLE_NEW_DELETE *pst->throw_at_calls_ [0] = std::size_t (-1); + + if (wres != wres_buf) + delete[] wres; } /**************************************************************************/ Modified: incubator/stdcxx/trunk/tests/strings/21.string.op.plus.equal.cpp URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.op.plus.equal.cpp?rev=406581&r1=406580&r2=406581&view=diff ============================================================================== --- incubator/stdcxx/trunk/tests/strings/21.string.op.plus.equal.cpp (original) +++ incubator/stdcxx/trunk/tests/strings/21.string.op.plus.equal.cpp Mon May 15 01:14:29 2006 @@ -33,14 +33,12 @@ #include <21.strings.h> // for StringMembers #include // for InputIter #include // for rw_test() -#include // for rw_widen() +#include // for rw_expand() #include // for bad_alloc, replacement operator new /**************************************************************************/ // for convenience and brevity -#define LSTR StringMembers::long_string -#define LLEN StringMembers::long_string_len #define OpPlusEq(which) StringMembers::op_plus_eq_ ## which typedef StringMembers::OverloadId OverloadId; @@ -98,16 +96,18 @@ TEST ("\0ab\0\0c", "e\0", "\0ab\0\0ce", 0), TEST ("abcdefghij", "abcdefghij", "abcdefghijabcdefghij", 0), - TEST ("", LSTR, LSTR, 0), - TEST (LSTR, "", LSTR, 0), + TEST ("", "x@4096", "x@4096", 0), + TEST ("x@4096", "", "x@4096", 0), + TEST ("x@2048", "y@2048", "x@2048y@2048", 0), TEST ("", 0, "", 0), TEST ("abc", 0, "abcabc", 0), TEST ("a\0\0bc", 0, "a\0\0bca", 0), TEST ("\0\0abc", 0, "\0\0abc", 0), TEST ("abc\0\0", 0, "abc\0\0abc", 0), + TEST ("x@2048", 0, "x@4096", 0), - TEST ("", LSTR, LSTR, -1), + TEST ("", "x@4096", "x@4096", -1), TEST ("last", "test", "lasttest", 0) }; @@ -158,16 +158,18 @@ TEST ("ab\0\0c\0", "\0e", "ab\0\0c\0\0e", 0), TEST ("abcdefghij", "abcdefghij", "abcdefghijabcdefghij", 0), - TEST ("", LSTR, LSTR, 0), - TEST (LSTR, "", LSTR, 0), + TEST ("", "x@4096", "x@4096", 0), + TEST ("x@4096", "", "x@4096", 0), + TEST ("x@2048", "y@2048", "x@2048y@2048", 0), TEST ("", 0, "", 0), TEST ("abc", 0, "abcabc", 0), TEST ("a\0\0bc", 0, "a\0\0bca\0\0bc", 0), TEST ("\0\0abc", 0, "\0\0abc\0\0abc", 0), TEST ("abc\0\0", 0, "abc\0\0abc\0\0", 0), + TEST ("x@2048", 0, "x@4096", 0), - TEST ("", LSTR, LSTR, -1), + TEST ("", "x@4096", "x@4096", -1), TEST ("last", "test", "lasttest", 0) }; @@ -220,20 +222,38 @@ const TestCase &tcase) { typedef std::allocator Allocator; - typedef std::basic_string TestString; - typedef typename TestString::iterator StringIter; - typedef typename TestString::const_iterator ConstStringIter; + typedef std::basic_string String; + typedef typename String::iterator StringIter; + typedef typename UserTraits::MemFun UTMemFun; - typedef typename UserTraits::MemFun UTMemFun; + static const std::size_t BUFSIZE = 256; - static charT wstr [LLEN]; - static charT warg [LLEN]; + static charT wstr_buf [BUFSIZE]; + static charT warg_buf [BUFSIZE]; - rw_widen (wstr, tcase.str, tcase.str_len); - rw_widen (warg, tcase.arg, tcase.arg_len); + std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf; + std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf; - /* const */ TestString s_str (wstr, tcase.str_len); - const TestString s_arg (warg, tcase.arg_len); + charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len); + charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len); + + static charT wres_buf [BUFSIZE]; + std::size_t res_len = sizeof wres_buf / sizeof *wres_buf; + charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len); + + // construct the string object to be modified + // and the (possibly unused) argument string + /* const */ String s_str (wstr, str_len); + const String s_arg (warg, arg_len); + + if (wstr != wstr_buf) + delete[] wstr; + + if (warg != warg_buf) + delete[] warg; + + wstr = 0; + warg = 0; // save the state of the string object before the call // to detect wxception safety violations (changes to @@ -242,8 +262,8 @@ std::size_t res_off = 0; - const charT* const arg_ptr = tcase.arg ? warg : s_str.c_str (); - const TestString& arg_str = tcase.arg ? s_arg : s_str; + const charT* const arg_ptr = tcase.arg ? s_arg.c_str () : s_str.c_str (); + const String& arg_str = tcase.arg ? s_arg : s_str; const charT arg_val = make_char (char (tcase.val), (charT*)0); std::size_t total_length_calls = 0; @@ -276,15 +296,19 @@ #else // if defined (_RWSTD_NO_EXCEPTIONS) - if (tcase.bthrow) - return; + if (tcase.bthrow) { + if (wres != wres_buf) + delete[] wres; + + return; + } #endif // _RWSTD_NO_EXCEPTIONS try { switch (which) { case OpPlusEq (ptr): { - const TestString& s_res = s_str += arg_ptr; + const String& s_res = s_str += arg_ptr; res_off = &s_res - &s_str; if (rg_calls) n_length_calls = rg_calls [UTMemFun::length]; @@ -292,13 +316,13 @@ } case OpPlusEq (str): { - const TestString& s_res = s_str += arg_str; + const String& s_res = s_str += arg_str; res_off = &s_res - &s_str; break; } case OpPlusEq (val): { - const TestString& s_res = s_str += arg_val; + const String& s_res = s_str += arg_val; res_off = &s_res - &s_str; break; } @@ -314,21 +338,21 @@ "offset is %zu", __LINE__, res_off); // verfiy that strings length are equal - rw_assert (tcase.nres == s_str.size (), 0, tcase.line, + rw_assert (res_len == s_str.size (), 0, tcase.line, "line %d. %{$FUNCALL} expected %{#*s} " "with length %zu, got %{/*.*Gs} with length %zu", - __LINE__, int (tcase.nres), tcase.res, tcase.nres, + __LINE__, int (tcase.nres), tcase.res, res_len, int (sizeof (charT)), int (s_str.size ()), s_str.c_str (), s_str.size ()); - if (tcase.nres == s_str.size ()) { + if (res_len == s_str.size ()) { // if the result length matches the expected length // (and only then), also verify that the modified // string matches the expected result const std::size_t match = rw_match (tcase.res, s_str.c_str(), tcase.nres); - rw_assert (match == tcase.nres, 0, tcase.line, + rw_assert (match == res_len, 0, tcase.line, "line %d. %{$FUNCALL} expected %{#*s}, " "got %{/*.*Gs}, difference at offset %zu", __LINE__, int (tcase.nres), tcase.res, @@ -413,6 +437,9 @@ #endif // _RWSTD_NO_REPLACEABLE_NEW_DELETE *pst->throw_at_calls_ [0] = std::size_t (-1); + + if (wres != wres_buf) + delete[] wres; } /**************************************************************************/ 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=406581&r1=406580&r2=406581&view=diff ============================================================================== --- incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp (original) +++ incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp Mon May 15 01:14:29 2006 @@ -261,7 +261,7 @@ static const TestCase iter_iter_ptr_size_test_cases [] = { -// iter_iter_range_test_cases serves a double duty +// iter_iter_ptr_size_test_cases serves a double duty #define size_size_ptr_size_test_cases iter_iter_ptr_size_test_cases #undef TEST @@ -486,7 +486,8 @@ TEST ("a@1", 0, 0, "b@0", 0, -1, "a", 0), TEST ("a@1", 0, 0, "b@1", 0, -1, "ba", 0), TEST ("a@2", 0, 0, "b@2", 0, -1, "bbaa", 0), - TEST ("a@1000", 0, 0, "b@1000", 0, -1, "b@1000a@1000", 0), + + TEST ("a@1000", 0, 0, "b@1000", 0, -1, "b@1000a@1000", 0), TEST ("a@1000", 0, 1, "b@1001", 0, -1, "b@1001a@999", 0), TEST ("a@1000", 0, 2, "b@1002", 0, -1, "b@1002a@998", 0), TEST ("a@1000", 1, 998, "b@1003", 0, -1, "ab@1003a", 0), @@ -664,6 +665,7 @@ std::size_t wstr_len, const charT* warg, std::size_t warg_len, + std::size_t res_len, Traits*, const Iterator &it, const TestCase &tcase) @@ -723,7 +725,7 @@ // detrmine whether the produced sequence matches the exepceted result const std::size_t match = rw_match (tcase.res, str.data (), tcase.nres); - rw_assert (match == tcase.nres, 0, tcase.line, + rw_assert (match == res_len, 0, tcase.line, "line %d. %{$FUNCALL} expected %{#*s}, got %{/*.*Gs}, " "difference at offset %zu for %s", __LINE__, int (tcase.nres), tcase.res, @@ -738,6 +740,7 @@ std::size_t wstr_len, const charT *warg, std::size_t warg_len, + std::size_t res_len, Traits*, const TestCase &tcase) { @@ -748,7 +751,7 @@ // exercise InputIterator *or* string::iterator (i.e., self // referential modification), depending on the value of tcase.arg - test_replace_range (wstr, wstr_len, warg, warg_len, (Traits*)0, + test_replace_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, InputIter(0, 0, 0), tcase); if (0 == tcase.arg) { @@ -756,13 +759,13 @@ return; } - test_replace_range (wstr, wstr_len, warg, warg_len, (Traits*)0, + test_replace_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, ConstFwdIter(0, 0, 0), tcase); - test_replace_range (wstr, wstr_len, warg, warg_len, (Traits*)0, + test_replace_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, ConstBidirIter(0, 0, 0), tcase); - test_replace_range (wstr, wstr_len, warg, warg_len, (Traits*)0, + test_replace_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0, ConstRandomAccessIter(0, 0, 0), tcase); } @@ -789,9 +792,14 @@ charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len); charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len); + static charT wres_buf [BUFSIZE]; + std::size_t res_len = sizeof wres_buf / sizeof *wres_buf; + charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len); + // special processing for replace_range to exercise all iterators if (Replace (iter_iter_range) == which) { - test_replace_range (wstr, str_len, warg, arg_len, (Traits*)0, tcase); + test_replace_range (wstr, str_len, warg, arg_len, + res_len, (Traits*)0, tcase); if (wstr != wstr_buf) delete[] wstr; @@ -799,6 +807,9 @@ if (warg != warg_buf) delete[] warg; + if (wres != wres_buf) + delete[] wres; + return; } @@ -816,10 +827,6 @@ wstr = 0; warg = 0; - static charT wres_buf [BUFSIZE]; - std::size_t res_len = sizeof wres_buf / sizeof *wres_buf; - charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len); - // 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) @@ -898,6 +905,7 @@ delete[] wres; return; + } #endif // _RWSTD_NO_EXCEPTIONS @@ -976,7 +984,7 @@ // (and only then), also verify that the modified // string matches the expected result const std::size_t match = - rw_match (tcase.res, str.c_str (), res_len); + rw_match (tcase.res, str.c_str (), tcase.nres); rw_assert (match == res_len, 0, tcase.line, "line %d. %{$FUNCALL} expected %{/*.*Gs}, " Modified: incubator/stdcxx/trunk/tests/strings/21.string.rfind.cpp URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.rfind.cpp?rev=406581&r1=406580&r2=406581&view=diff ============================================================================== --- incubator/stdcxx/trunk/tests/strings/21.string.rfind.cpp (original) +++ incubator/stdcxx/trunk/tests/strings/21.string.rfind.cpp Mon May 15 01:14:29 2006 @@ -31,22 +31,19 @@ #include <21.strings.h> // for StringMembers #include // for rw_test() -#include // for rw_widen() +#include // for rw_expand() -#define RFind(which) StringMembers::rfind_ ## which +/**************************************************************************/ + +// for convenience and brevity +#define NPOS _RWSTD_SIZE_MAX +#define RFind(which) StringMembers::rfind_ ## which typedef StringMembers::OverloadId OverloadId; typedef StringMembers::TestCase TestCase; 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", "bad_alloc", "exception" @@ -56,12 +53,15 @@ // used to exercise // rfind (const value_type*) -static const TestCase ptr_test_cases [] = { +static const TestCase +ptr_test_cases [] = { #undef TEST -#define TEST(str, arg, res) \ - { __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, arg, \ - sizeof arg - 1, 0, res, 0 } +#define TEST(str, arg, res) \ + { __LINE__, -1, -1, -1, -1, -1, \ + str, sizeof str - 1, arg, \ + sizeof arg - 1, 0, res, 0 \ + } // +----------------------------------- controlled sequence // | +--------------------- sequence to be found @@ -109,17 +109,17 @@ TEST ("aaaaaaaaaa", "aaaaaaaaa", 1), TEST ("aaaaaaaaa", "aaaaaaaaaa", NPOS), - TEST (LSTR, "", LLEN - 1), - TEST (LSTR, "a", NPOS), - TEST (LSTR, "x", LLEN - 2), - TEST (LSTR, "xxx", LLEN - 4), - TEST (LSTR, "xxa", NPOS), - TEST ("abc", LSTR, NPOS), - TEST ("xxxxxxxxxx", LSTR, NPOS), + TEST ("x@4096", "", 4096), + TEST ("x@4096", "a", NPOS), + TEST ("x@4096", "x", 4095), + TEST ("x@4096", "xxx", 4093), + TEST ("x@4096", "xxa", NPOS), + TEST ("abc", "x@4096", NPOS), + TEST ("xxxxxxxxxx", "x@4096", NPOS), TEST ("abcdefghij", 0, 0), TEST ("\0cb\0\0ge", 0, 7), - TEST (LSTR, 0, 0), + TEST ("x@4096", 0, 0), TEST ("last test", "test", 5) }; @@ -128,12 +128,15 @@ // used to exercise // rfind (const basic_string&) -static const TestCase str_test_cases [] = { +static const TestCase +str_test_cases [] = { #undef TEST -#define TEST(str, arg, res) \ - { __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, arg, \ - sizeof arg - 1, 0, res, 0 } +#define TEST(str, arg, res) \ + { __LINE__, -1, -1, -1, -1, -1, \ + str, sizeof str - 1, arg, \ + sizeof arg - 1, 0, res, 0 \ + } // +------------------------------------ controlled sequence // | +---------------------- sequence to be found @@ -186,17 +189,17 @@ TEST ("aaaaaaaaaa", "aaaaaaaaa", 1), TEST ("aaaaaaaaa", "aaaaaaaaaa", NPOS), - TEST (LSTR, "", LLEN - 1), - TEST (LSTR, "a", NPOS), - TEST (LSTR, "x", LLEN - 2), - TEST (LSTR, "xxx", LLEN - 4), - TEST (LSTR, "xxa", NPOS), - TEST ("abc", LSTR, NPOS), - TEST ("xxxxxxxxxx", LSTR, NPOS), + TEST ("x@4096", "", 4096), + TEST ("x@4096", "a", NPOS), + TEST ("x@4096", "x", 4095), + TEST ("x@4096", "xxx", 4093), + TEST ("x@4096", "xxa", NPOS), + TEST ("abc", "x@4096", NPOS), + TEST ("xxxxxxxxxx", "x@4096", NPOS), TEST ("abcdefghij", 0, 0), TEST ("\0cb\0\0ge", 0, 0), - TEST (LSTR, 0, 0), + TEST ("x@4096", 0, 0), TEST ("last test", "test", 5) }; @@ -205,12 +208,15 @@ // used to exercise // rfind (const value_type*, size_type) -static const TestCase ptr_size_test_cases [] = { +static const TestCase +ptr_size_test_cases [] = { #undef TEST -#define TEST(str, arg, off, res) \ - { __LINE__, off, -1, -1, -1, -1, str, sizeof str - 1, arg, \ - sizeof arg - 1, 0, res, 0 } +#define TEST(str, arg, off, res) \ + { __LINE__, off, -1, -1, -1, -1, \ + str, sizeof str - 1, arg, \ + sizeof arg - 1, 0, res, 0 \ + } // +-------------------------------------- controlled sequence // | +------------------------- sequence to be found @@ -272,24 +278,24 @@ TEST ("aaaaaaaaaa", "aaaaaaaaa", 7, 1), TEST ("aaaaaaaaa", "aaaaaaaaaa", 8, NPOS), - TEST (LSTR, "", LLEN - 1, LLEN - 1), - TEST (LSTR, "a", 0, NPOS), - TEST (LSTR, "x", LLEN - 1, LLEN - 2), - TEST (LSTR, "xxx", LLEN - 2, LLEN - 4), - TEST (LSTR, "xxx", 0, 0), - TEST (LSTR, "xxx", LLEN - 10, LLEN - 10), - TEST (LSTR, "xxa", LLEN - 10, NPOS), - TEST ("abc", LSTR, 2, NPOS), - TEST ("xxxxxxxxxx", LSTR, 6, NPOS), + TEST ("x@4096", "", 4096, 4096), + TEST ("x@4096", "a", 0, NPOS), + TEST ("x@4096", "x", 4096, 4095), + TEST ("x@4096", "xxx", 4095, 4093), + TEST ("x@4096", "xxx", 0, 0), + TEST ("x@4096", "xxx", 4087, 4087), + TEST ("x@4096", "xxa", 4087, NPOS), + TEST ("abc", "x@4096", 2, NPOS), + TEST ("xxxxxxxxxx", "x@4096", 6, NPOS), - TEST (LSTR, "xxx", 3, 3), - TEST (LSTR, "xxx", 2, 2), + TEST ("x@4096", "xxx", 3, 3), + TEST ("x@4096", "xxx", 2, 2), TEST ("abcdefghij", 0, 0, 0), TEST ("abcdefghij", 0, 1, 0), TEST ("\0cb\0\0ge", 0, 5, 5), - TEST (LSTR, 0, 0, 0), - TEST (LSTR, 0, 1, 0), + TEST ("x@4096", 0, 0, 0), + TEST ("x@4096", 0, 1, 0), TEST ("", "", 1, 0), TEST ("abcdefghij", "abc", 10, 0), @@ -302,12 +308,15 @@ // used to exercise // rfind (const value_type*, size_type, size_type) -static const TestCase ptr_size_size_test_cases [] = { +static const TestCase +ptr_size_size_test_cases [] = { #undef TEST -#define TEST(str, arg, off, size, res, bthrow) \ - { __LINE__, off, size, -1, -1, -1, str, sizeof str - 1, arg, \ - sizeof arg - 1, 0, res, bthrow } +#define TEST(str, arg, off, size, res, bthrow) \ + { __LINE__, off, size, -1, -1, -1, \ + str, sizeof str - 1, arg, \ + sizeof arg - 1, 0, res, bthrow \ + } // +--------------------------------------- controlled sequence // | +-------------------------- sequence to be found @@ -382,40 +391,36 @@ TEST ("aaaaaaaaa", "aaaaaaaaaa", 9, 10, NPOS, 0), TEST ("aaaaaaaaa", "aaaaaaaaaa", 8, 7, 2, 0), - TEST (LSTR, "", LLEN - 1, 0, LLEN - 1, 0), - TEST (LSTR, "a", LLEN - 1, 1, NPOS, 0), - TEST (LSTR, "x", LLEN - 1, 1, LLEN - 2, 0), - TEST (LSTR, "xxx", LLEN - 10, 3, LLEN - 10, 0), - TEST (LSTR, "xxa", LLEN - 10, 3, NPOS, 0), - TEST (LSTR, "xxa", LLEN - 1, 2, LLEN - 3, 0), - TEST ("abc", LSTR, 2, 10, NPOS, 0), - TEST ("xxxxxxxxxx", LSTR, 0, LLEN - 1, NPOS, 0), - TEST ("xxxxxxxxxx", LSTR, 2, 4, 2, 0), - - TEST (LSTR, "xxx", LLEN - 4, 3, LLEN - 4, 0), - TEST (LSTR, "xxx", LLEN - 3, 3, LLEN - 4, 0), - TEST (LSTR, "xxx", LLEN - 3, 2, LLEN - 3, 0), + TEST ("x@4096", "", 4096, 0, 4096, 0), + TEST ("x@4096", "a", 4096, 1, NPOS, 0), + TEST ("x@4096", "x", 4096, 1, 4095, 0), + TEST ("x@4096", "xxx", 4087, 3, 4087, 0), + TEST ("x@4096", "xxa", 4087, 3, NPOS, 0), + TEST ("x@4096", "xxa", 4096, 2, 4094, 0), + TEST ("abc", "x@4096", 2, 10, NPOS, 0), + TEST ("xxxxxxxxxx", "x@4096", 0, 4096, NPOS, 0), + TEST ("xxxxxxxxxx", "x@4096", 2, 4, 2, 0), + + TEST ("x@4096", "xxx", 4093, 3, 4093, 0), + TEST ("x@4096", "xxx", 4094, 3, 4093, 0), + TEST ("x@4096", "xxx", 4094, 2, 4094, 0), TEST ("abcdefghij", 0, 0, 9, 0, 0), TEST ("abcdefghij", 0, 1, 9, 0, 0), TEST ("\0cb\0\0ge", 0, 5, 7, 0, 0), TEST ("\0cb\0ge\0", 0, 6, 1, 6, 0), - TEST (LSTR, 0, 0, LLEN - 1, 0, 0), - TEST (LSTR, 0, 1, LLEN - 1, 0, 0), - TEST (LSTR, 0, 5, LLEN - 6, 5, 0), + TEST ("x@4096", 0, 0, 4096, 0, 0), + TEST ("x@4096", 0, 1, 4096, 0, 0), + TEST ("x@4096", 0, 5, 4091, 5, 0), TEST ("", "", 1, 0, 0, 0), TEST ("abcdefghij", "abc", 10, 3, 0, 0), TEST ("abcdefghij", "cba", 10, 1, 2, 0), -#ifndef _RWSTD_NO_EXCEPTIONS - TEST ("", "cba", 0, -1, 0, 1), TEST ("abcdefghij", "cba", 0, -1, 0, 1), - TEST (LSTR, "xxx", 0, -1, 0, 1), - TEST ("abcdefghij", LSTR, 0, -1, 0, 1), - -#endif // _RWSTD_NO_EXCEPTIONS + TEST ("x@4096", "xxx", 0, -1, 0, 1), + TEST ("abcdefghij", "x@4096", 0, -1, 0, 1), TEST ("last test", "test", 9, 4, 5, 0) }; @@ -424,12 +429,15 @@ // used to exercise // rfind (const basic_string&, size_type) -static const TestCase str_size_test_cases [] = { +static const TestCase +str_size_test_cases [] = { #undef TEST -#define TEST(str, arg, off, res) \ - { __LINE__, off, -1, -1, -1, -1, str, sizeof str - 1, arg, \ - sizeof arg - 1, 0, res, 0 } +#define TEST(str, arg, off, res) \ + { __LINE__, off, -1, -1, -1, -1, \ + str, sizeof str - 1, arg, \ + sizeof arg - 1, 0, res, 0 \ + } // +--------------------------------------- controlled sequence // | +------------------------- sequence to be found @@ -488,22 +496,22 @@ TEST ("aaaaaaaaaa", "aaaaaaaaa", 0, 0), TEST ("aaaaaaaaa", "aaaaaaaaaa", 8, NPOS), - TEST (LSTR, "", LLEN - 1, LLEN - 1), - TEST (LSTR, "a", LLEN - 1, NPOS), - TEST (LSTR, "x", LLEN - 1, LLEN - 2), - TEST (LSTR, "xxx", LLEN - 10, LLEN - 10), - TEST (LSTR, "xxa", LLEN - 10, NPOS), - TEST ("abc", LSTR, 2, NPOS), - TEST ("xxxxxxxxxx", LSTR, LLEN - 1, NPOS), + TEST ("x@4096", "", 4096, 4096), + TEST ("x@4096", "a", 4096, NPOS), + TEST ("x@4096", "x", 4096, 4095), + TEST ("x@4096", "xxx", 4087, 4087), + TEST ("x@4096", "xxa", 4087, NPOS), + TEST ("abc", "x@4096", 2, NPOS), + TEST ("xxxxxxxxxx", "x@4096", 4096, NPOS), - TEST (LSTR, "xxx", LLEN - 1, LLEN - 4), - TEST (LSTR, "xxx", LLEN - 6, LLEN - 6), + TEST ("x@4096", "xxx", 4096, 4093), + TEST ("x@4096", "xxx", 4091, 4091), TEST ("abcdefghij", 0, 9, 0), TEST ("abcdefghij", 0, 1, 0), TEST ("\0cb\0\0ge", 0, 5, 0), - TEST (LSTR, 0, 0, 0), - TEST (LSTR, 0, 1, 0), + TEST ("x@4096", 0, 0, 0), + TEST ("x@4096", 0, 1, 0), TEST ("", "", 1, 0), TEST ("abcdefghij", "abc", 10, 0), @@ -516,12 +524,15 @@ // used to exercise // rfind (value_type) -static const TestCase val_test_cases [] = { +static const TestCase +val_test_cases [] = { #undef TEST -#define TEST(str, val, res) \ - { __LINE__, -1, -1, -1, -1, val, str, sizeof str - 1, \ - 0, 0, 0, res, 0 } +#define TEST(str, val, res) \ + { __LINE__, -1, -1, -1, -1, val, \ + str, sizeof str - 1, \ + 0, 0, 0, res, 0 \ + } // +----------------------------- controlled sequence // | +-------------- character to be found @@ -545,9 +556,9 @@ TEST ("\0cbge\0\0", 'b', 2), TEST ("\0cbge\0\0", 'a', NPOS), - TEST (LSTR, 'x', LLEN - 2), - TEST (LSTR, '\0', NPOS), - TEST (LSTR, 'a', NPOS), + TEST ("x@4096", 'x', 4095), + TEST ("x@4096", '\0', NPOS), + TEST ("x@4096", 'a', NPOS), TEST ("last test", 't', 8) }; @@ -556,12 +567,15 @@ // used to exercise // rfind (value_type, size_type) -static const TestCase val_size_test_cases [] = { +static const TestCase +val_size_test_cases [] = { #undef TEST -#define TEST(str, val, off, res) \ - { __LINE__, off, -1, -1, -1, val, str, sizeof str - 1, \ - 0, 0, 0, res, 0 } +#define TEST(str, val, off, res) \ + { __LINE__, off, -1, -1, -1, val, \ + str, sizeof str - 1, \ + 0, 0, 0, res, 0 \ + } // +------------------------------ controlled sequence // | +--------------- character to be found @@ -594,13 +608,13 @@ TEST ("\0bgeb\0\0", 'b', 5, 4), TEST ("\0cbge\0\0", 'a', 6, NPOS), - TEST (LSTR, 'x', 0, 0), - TEST (LSTR, 'x', 5, 5), - TEST (LSTR, 'x', LLEN - 1, LLEN - 2), - TEST (LSTR, '\0', LLEN - 1, NPOS), - TEST (LSTR, 'a', LLEN - 3, NPOS), - TEST (LSTR, 'x', LLEN - 2, LLEN - 2), - TEST (LSTR, 'x', LLEN + 9, LLEN - 2), + TEST ("x@4096", 'x', 0, 0), + TEST ("x@4096", 'x', 5, 5), + TEST ("x@4096", 'x', 4096, 4095), + TEST ("x@4096", '\0', 4096, NPOS), + TEST ("x@4096", 'a', 4094, NPOS), + TEST ("x@4096", 'x', 4095, 4095), + TEST ("x@4096", 'x', 4106, 4095), TEST ("last test", 't', 9, 8) }; @@ -613,27 +627,42 @@ const TestCase &cs) { typedef std::allocator Allocator; - typedef std::basic_string TestString; - typedef typename TestString::const_iterator ConstStringIter; + typedef std::basic_string String; - static charT wstr [LLEN]; - static charT warg [LLEN]; + static const std::size_t BUFSIZE = 256; - rw_widen (wstr, cs.str, cs.str_len); - rw_widen (warg, cs.arg, cs.arg_len); + static charT wstr_buf [BUFSIZE]; + static charT warg_buf [BUFSIZE]; - const TestString s_str (wstr, cs.str_len); - const TestString s_arg (warg, cs.arg_len); + std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf; + std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf; - std::size_t res = 0; - std::size_t exp_res = NPOS != cs.nres ? cs.nres : TestString::npos; + charT* wstr = rw_expand (wstr_buf, cs.str, cs.str_len, &str_len); + charT* warg = rw_expand (warg_buf, cs.arg, cs.arg_len, &arg_len); + + // construct the string object and the argument string + const String s_str (wstr, str_len); + const String s_arg (warg, arg_len); + + if (wstr != wstr_buf) + delete[] wstr; + + if (warg != warg_buf) + delete[] warg; + + wstr = 0; + warg = 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 (); + std::size_t res = 0; + std::size_t exp_res = NPOS != cs.nres ? cs.nres : String::npos; - const charT* const ptr_arg = cs.arg ? warg : s_str.c_str (); - const TestString& str_arg = cs.arg ? s_arg : s_str; + const charT* const arg_ptr = cs.arg ? s_arg.c_str () : s_str.c_str (); + const String& arg_str = cs.arg ? s_arg : s_str; const charT arg_val = make_char (char (cs.val), (charT*)0); std::size_t size = cs.size >= 0 ? cs.size : s_arg.max_size () + 1; @@ -657,27 +686,27 @@ try { switch (which) { case RFind (ptr): { - res = s_str.rfind (ptr_arg); + res = s_str.rfind (arg_ptr); break; } case RFind (str): { - res = s_str.rfind (str_arg); + res = s_str.rfind (arg_str); break; } case RFind (ptr_size): { - res = s_str.rfind (ptr_arg, cs.off); + res = s_str.rfind (arg_ptr, cs.off); break; } case RFind (ptr_size_size): { - res = s_str.rfind (ptr_arg, cs.off, size); + res = s_str.rfind (arg_ptr, cs.off, size); break; } case RFind (str_size): { - res = s_str.rfind (str_arg, cs.off); + res = s_str.rfind (arg_str, cs.off); break; } @@ -701,7 +730,7 @@ "line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, " "got %{?}%zu%{;}%{?}npos%{;}", __LINE__, NPOS != cs.nres, exp_res, NPOS == cs.nres, - TestString::npos != res, res, TestString::npos == res); + String::npos != res, res, String::npos == res); } #ifndef _RWSTD_NO_EXCEPTIONS @@ -728,24 +757,13 @@ __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 +#endif // _RWSTD_NO_EXCEPTIONS - 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); + if (caught) { + // 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__, cs.line, caught); } else if (-1 != cs.bthrow) { rw_assert (caught == expected, 0, cs.line, @@ -753,13 +771,6 @@ "%{:}unexpectedly caught %s%{;}", __LINE__, 0 != expected, expected, caught, caught); } - -#else // if defined (_RWSTD_NO_EXCEPTIONS) - - _RWSTD_UNUSED (ssize); - _RWSTD_UNUSED (capacity); - -#endif // _RWSTD_NO_EXCEPTIONS } /**************************************************************************/ Modified: incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp?rev=406581&r1=406580&r2=406581&view=diff ============================================================================== --- incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp (original) +++ incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp Mon May 15 01:14:29 2006 @@ -31,13 +31,11 @@ #include <21.strings.h> // for StringMembers #include // for rw_test() -#include // for rw_widen() +#include // for rw_expand() /**************************************************************************/ // for convenience and brevity -#define LSTR StringMembers::long_string -#define LLEN StringMembers::long_string_len #define Substr(which) StringMembers::substr_ ## which typedef StringMembers::OverloadId OverloadId; @@ -77,7 +75,7 @@ TEST ("\0\0abcd\0", "\0\0abcd\0"), TEST ("\0\0ab\0\0", "\0\0ab\0\0"), - TEST (LSTR, LSTR), + TEST ("x@4096", "x@4096"), TEST ("last", "last") }; @@ -124,14 +122,16 @@ TEST ("\0\0ab\0\0", 4, "\0\0", 0), TEST ("\0\0ab\0\0", 6, "", 0), - TEST (LSTR, 0, LSTR, 0), - TEST (LSTR, LLEN - 3, "xx", 0), - TEST (LSTR, LLEN - 9, "xxxxxxxx", 0), - TEST (LSTR, LLEN - 1, "", 0), + TEST ("x@4096", 0, "x@4096", 0), + TEST ("x@4096", 4094, "xx", 0), + TEST ("x@4096", 4088, "xxxxxxxx", 0), + TEST ("x@4096", 4096, "", 0), + TEST ("abx@4096", 2, "x@4096", 0), + TEST ("x@4096ab", 2048, "x@2048ab", 0), TEST ("\0", 2, "", 1), TEST ("a", 10, "", 1), - TEST (LSTR, LLEN + 10, "", 1), + TEST ("x@4096", 4106, "", 1), TEST ("last", 0, "last", 0) }; @@ -192,16 +192,17 @@ TEST ("\0\0ab\0\0", 2, 3, "ab\0", 0), TEST ("\0\0ab\0\0", 6, 6, "", 0), - TEST (LSTR, 0, LLEN - 1, LSTR, 0), - TEST (LSTR, LLEN - 2, LLEN - 1, "x", 0), - TEST (LSTR, LLEN - 9, 2, "xx", 0), - TEST (LSTR, LLEN - 4, 5, "xxx", 0), - TEST (LSTR, LLEN - 9, 8, "xxxxxxxx", 0), - TEST (LSTR, LLEN - 1, 1, "", 0), + TEST ("x@4096", 0, 4096, "x@4096", 0), + TEST ("x@4096", 4095, 4096, "x", 0), + TEST ("x@4096", 4088, 2, "xx", 0), + TEST ("x@4096", 4093, 5, "xxx", 0), + TEST ("x@4096", 4088, 8, "xxxxxxxx", 0), + TEST ("x@4096", 4096, 1, "", 0), + TEST ("ax@4096b", 1, 4094, "x@4094", 0), TEST ("\0", 2, 0, "", 1), TEST ("a", 10, 0, "", 1), - TEST (LSTR, LLEN + 10, 0, "", 1), + TEST ("x@4096", 4106, 0, "", 1), TEST ("last", 0, 4, "last", 0) }; @@ -214,16 +215,28 @@ const TestCase &cs) { typedef std::allocator Allocator; - typedef std::basic_string TestString; - typedef typename TestString::const_iterator ConstStringIter; + typedef std::basic_string String; - static charT wstr [LLEN]; + static const std::size_t BUFSIZE = 256; - // construct string - rw_widen (wstr, cs.str, cs.str_len); - const TestString str (wstr, cs.str_len); + static charT wstr_buf [BUFSIZE]; + std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf; + charT* wstr = rw_expand (wstr_buf, cs.str, cs.str_len, &str_len); - TestString s_res; + static charT wres_buf [BUFSIZE]; + std::size_t res_len = sizeof wres_buf / sizeof *wres_buf; + charT* wres = rw_expand (wres_buf, cs.res, cs.nres, &res_len); + + // construct the string object + const String str (wstr, str_len); + + if (wstr != wstr_buf) + delete[] wstr; + + wstr = 0; + + + String s_res; // save the state of the string object before the call // to detect wxception safety violations (changes to @@ -236,6 +249,15 @@ const char* const expected = cs.bthrow ? exceptions [1] : 0; const char* caught = 0; +#else + + if (cs.bthrow) { + if (wres != wres_buf) + delete[] wres; + + return; + } + #endif // _RWSTD_NO_EXCEPTIONS try { @@ -258,21 +280,21 @@ } // verfiy that strings length are equal - rw_assert (cs.nres == s_res.size (), 0, cs.line, + rw_assert (res_len == s_res.size (), 0, cs.line, "line %d. %{$FUNCALL} expected %{#*s} with length " "%zu, got %{/*.*Gs} with length %zu", __LINE__, int (cs.nres), cs.res, - cs.nres, int (sizeof (charT)), + res_len, int (sizeof (charT)), int (s_res.size ()), s_res.c_str (), s_res.size ()); - if (cs.nres == s_res.size ()) { + if (res_len == s_res.size ()) { // if the result length matches the expected length // (and only then), also verify that the resulted // string matches the expected result const std::size_t match = rw_match (cs.res, s_res.c_str(), cs.nres); - rw_assert (match == cs.nres, 0, cs.line, + rw_assert (match == res_len, 0, cs.line, "line %d. %{$FUNCALL} expected %{#*s}, " "got %{/*.*Gs}, difference at offset %zu", __LINE__, int (cs.nres), cs.res, @@ -313,6 +335,9 @@ } #endif // _RWSTD_NO_EXCEPTIONS + + if (wres != wres_buf) + delete[] wres; } /**************************************************************************/