rope_test.cpp revision e46c9386c4f79aa40185f79a19fc5b2a7ef528b3
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//Small header to get STLport numerous defines: 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <utility> 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# include <rope> 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# if !defined (_STLP_USE_NO_IOSTREAMS) 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# include <sstream> 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# endif 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cppunit/cppunit_proxy.h" 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// #include <stdlib.h> // for rand etc 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (_STLP_USE_NAMESPACES) 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// TestCase class 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RopeTest : public CPPUNIT_NS::TestCase 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_TEST_SUITE(RopeTest); 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS) || defined (_STLP_USE_NO_IOSTREAMS) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_IGNORE; 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_TEST(io); 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (_STLP_USE_NO_IOSTREAMS) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_STOP_IGNORE; 3206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#endif 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_TEST(find1); 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch CPPUNIT_TEST(find2); 355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) CPPUNIT_TEST(construct_from_char); 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) CPPUNIT_TEST(bug_report); 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if !defined (_STLP_MEMBER_TEMPLATES) 3806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) CPPUNIT_IGNORE; 391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#endif 401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) CPPUNIT_TEST(test_saved_rope_iterators); 4106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) CPPUNIT_TEST_SUITE_END(); 42591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) void io(); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void find1(); 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) void find2(); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void construct_from_char(); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void bug_report(); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void test_saved_rope_iterators(); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CPPUNIT_TEST_SUITE_REGISTRATION(RopeTest); 53323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 55323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)// tests implementation 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RopeTest::io() 58e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS) 60f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) char const* cstr = "rope test string"; 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) crope rstr(cstr); 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ostringstream ostr; 6551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) ostr << rstr; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_ASSERT( ostr ); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_ASSERT( ostr.str() == cstr ); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RopeTest::find1() 7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope r("Fuzzy Wuzzy was a bear"); 7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) crope::size_type n = r.find( "hair" ); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_ASSERT( n == crope::npos ); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) n = r.find("ear"); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_ASSERT( n == (r.size() - 3) ); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RopeTest::find2() 87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope r("Fuzzy Wuzzy was a bear"); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope::size_type n = r.find( 'e' ); 91591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch CPPUNIT_ASSERT( n == (r.size() - 3) ); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RopeTest::construct_from_char() 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope r('1'); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) char const* s = r.c_str(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_ASSERT( '1' == s[0] && '\0' == s[1] ); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Test used for a bug report from Peter Hercek 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RopeTest::bug_report() 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //first create a rope bigger than crope::_S_copy_max = 23 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // so that any string addition is added to a new leaf 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope evilRope("12345678901234567890123_"); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //crope* pSevenCharRope( new TRope("1234567") ); 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) crope sevenCharRope0("12345678"); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope sevenCharRope1("1234567"); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add _Rope_RopeRep<c,a>::_S_alloc_granularity-1 = 7 characters 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evilRope += "1234567"; // creates a new leaf 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope sevenCharRope2("1234567"); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // add one more character to the leaf 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) evilRope += '8'; // here is the write beyond the allocated memory 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CPPUNIT_ASSERT( strcmp(sevenCharRope2.c_str(), "1234567") == 0 ); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char str[] = "ilcpsklryvmcpjnbpbwllsrehfmxrkecwitrsglrexvtjmxypu\ 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)nbqfgxmuvgfajclfvenhyuhuorjosamibdnjdbeyhkbsomblto\ 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uujdrbwcrrcgbflqpottpegrwvgajcrgwdlpgitydvhedtusip\ 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)pyvxsuvbvfenodqasajoyomgsqcpjlhbmdahyviuemkssdslde\ 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)besnnngpesdntrrvysuipywatpfoelthrowhfexlwdysvspwlk\ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)fblfdf"; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)crope create_rope( int len ) 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int l = len/2; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) crope result; 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if(l <= 2) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static int j = 0; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for(int i = 0; i < len; ++i) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // char c = 'a' + rand() % ('z' - 'a'); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.append(1, /* c */ str[j++] ); 142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) j %= sizeof(str); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 147bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) result = create_rope(len/2); 148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) result.append(create_rope(len/2)); 149bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return result; 1511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 1521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 1531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#endif 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RopeTest::test_saved_rope_iterators() 156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && \ 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) defined (_STLP_MEMBER_TEMPLATES) 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Try and create a rope with a complex tree structure: 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) // srand(0); 163 crope r = create_rope(300); 164 string expected(r.begin(), r.end()); 165 CPPUNIT_ASSERT(expected.size() == r.size()); 166 CPPUNIT_ASSERT(equal(expected.begin(), expected.end(), r.begin())); 167 crope::const_iterator i(r.begin()), j(r.end()); 168 int pos = 0; 169 while(i != j) 170 { 171 crope::const_iterator k; 172 // This initial read triggers the bug: 173 CPPUNIT_ASSERT(*i); 174 k = i; 175 int newpos = pos; 176 // Now make sure that i is incremented into the next leaf: 177 while(i != j) 178 { 179 CPPUNIT_ASSERT(*i == expected[newpos]); 180 ++i; 181 ++newpos; 182 } 183 // Back up from stored value and continue: 184 i = k; 185 ++i; 186 ++pos; 187 } 188#endif 189} 190