📄 rope_test.cpp
字号:
//Small header to get STLport numerous defines:#include <utility>#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)# include <rope># if !defined (_STLP_USE_NO_IOSTREAMS)# include <sstream># endif#endif#include "cppunit/cppunit_proxy.h"// #include <stdlib.h> // for rand etc#if defined (_STLP_USE_NAMESPACES)using namespace std;#endif//// TestCase class//class RopeTest : public CPPUNIT_NS::TestCase{ CPPUNIT_TEST_SUITE(RopeTest);#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS) || defined (_STLP_USE_NO_IOSTREAMS) CPPUNIT_IGNORE;#endif CPPUNIT_TEST(io);#if defined (_STLP_USE_NO_IOSTREAMS) CPPUNIT_STOP_IGNORE;#endif CPPUNIT_TEST(find1); CPPUNIT_TEST(find2); CPPUNIT_TEST(construct_from_char); CPPUNIT_TEST(bug_report);#if !defined (_STLP_MEMBER_TEMPLATES) CPPUNIT_IGNORE;#endif CPPUNIT_TEST(test_saved_rope_iterators); CPPUNIT_TEST_SUITE_END();protected: void io(); void find1(); void find2(); void construct_from_char(); void bug_report(); void test_saved_rope_iterators();};CPPUNIT_TEST_SUITE_REGISTRATION(RopeTest);//// tests implementation//void RopeTest::io(){#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS) char const* cstr = "rope test string"; crope rstr(cstr); { ostringstream ostr; ostr << rstr; CPPUNIT_ASSERT( ostr ); CPPUNIT_ASSERT( ostr.str() == cstr ); }#endif}void RopeTest::find1(){#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) crope r("Fuzzy Wuzzy was a bear"); crope::size_type n = r.find( "hair" ); CPPUNIT_ASSERT( n == crope::npos ); n = r.find("ear"); CPPUNIT_ASSERT( n == (r.size() - 3) );#endif}void RopeTest::find2(){#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) crope r("Fuzzy Wuzzy was a bear"); crope::size_type n = r.find( 'e' ); CPPUNIT_ASSERT( n == (r.size() - 3) );#endif}void RopeTest::construct_from_char(){#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) crope r('1'); char const* s = r.c_str(); CPPUNIT_ASSERT( '1' == s[0] && '\0' == s[1] );#endif}// Test used for a bug report from Peter Hercekvoid RopeTest::bug_report(){#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) //first create a rope bigger than crope::_S_copy_max = 23 // so that any string addition is added to a new leaf crope evilRope("12345678901234567890123_"); //crope* pSevenCharRope( new TRope("1234567") ); crope sevenCharRope0("12345678"); crope sevenCharRope1("1234567"); // add _Rope_RopeRep<c,a>::_S_alloc_granularity-1 = 7 characters evilRope += "1234567"; // creates a new leaf crope sevenCharRope2("1234567"); // add one more character to the leaf evilRope += '8'; // here is the write beyond the allocated memory CPPUNIT_ASSERT( strcmp(sevenCharRope2.c_str(), "1234567") == 0 );#endif}#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS)const char str[] = "ilcpsklryvmcpjnbpbwllsrehfmxrkecwitrsglrexvtjmxypu\nbqfgxmuvgfajclfvenhyuhuorjosamibdnjdbeyhkbsomblto\uujdrbwcrrcgbflqpottpegrwvgajcrgwdlpgitydvhedtusip\pyvxsuvbvfenodqasajoyomgsqcpjlhbmdahyviuemkssdslde\besnnngpesdntrrvysuipywatpfoelthrowhfexlwdysvspwlk\fblfdf";crope create_rope( int len ){ int l = len/2; crope result; if(l <= 2) { static int j = 0; for(int i = 0; i < len; ++i) { // char c = 'a' + rand() % ('z' - 'a'); result.append(1, /* c */ str[j++] ); j %= sizeof(str); } } else { result = create_rope(len/2); result.append(create_rope(len/2)); } return result;}#endifvoid RopeTest::test_saved_rope_iterators(){#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && \ defined (_STLP_MEMBER_TEMPLATES) // // Try and create a rope with a complex tree structure: // // srand(0); crope r = create_rope(300); string expected(r.begin(), r.end()); CPPUNIT_ASSERT(expected.size() == r.size()); CPPUNIT_ASSERT(equal(expected.begin(), expected.end(), r.begin())); crope::const_iterator i(r.begin()), j(r.end()); int pos = 0; while(i != j) { crope::const_iterator k; // This initial read triggers the bug: CPPUNIT_ASSERT(*i); k = i; int newpos = pos; // Now make sure that i is incremented into the next leaf: while(i != j) { CPPUNIT_ASSERT(*i == expected[newpos]); ++i; ++newpos; } // Back up from stored value and continue: i = k; ++i; ++pos; }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -