1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//Small header to get STLport numerous defines: 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <utility> 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <rope> 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (_STLP_USE_NO_IOSTREAMS) 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <sstream> 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "cppunit/cppunit_proxy.h" 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// #include <stdlib.h> // for rand etc 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_NAMESPACES) 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std; 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// TestCase class 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass RopeTest : public CPPUNIT_NS::TestCase 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE(RopeTest); 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS) || defined (_STLP_USE_NO_IOSTREAMS) 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_IGNORE; 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(io); 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_NO_IOSTREAMS) 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_STOP_IGNORE; 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(find1); 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(find2); 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(construct_from_char); 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(bug_report); 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_MEMBER_TEMPLATES) 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_IGNORE; 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST(test_saved_rope_iterators); 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_TEST_SUITE_END(); 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprotected: 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void io(); 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void find1(); 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void find2(); 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void construct_from_char(); 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void bug_report(); 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void test_saved_rope_iterators(); 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(RopeTest); 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid RopeTest::io() 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS) 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char const* cstr = "rope test string"; 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope rstr(cstr); 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream ostr; 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostr << rstr; 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ostr ); 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( ostr.str() == cstr ); 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid RopeTest::find1() 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope r("Fuzzy Wuzzy was a bear"); 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope::size_type n = r.find( "hair" ); 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( n == crope::npos ); 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott n = r.find("ear"); 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( n == (r.size() - 3) ); 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid RopeTest::find2() 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope r("Fuzzy Wuzzy was a bear"); 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope::size_type n = r.find( 'e' ); 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( n == (r.size() - 3) ); 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid RopeTest::construct_from_char() 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope r('1'); 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott char const* s = r.c_str(); 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( '1' == s[0] && '\0' == s[1] ); 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Test used for a bug report from Peter Hercek 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid RopeTest::bug_report() 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //first create a rope bigger than crope::_S_copy_max = 23 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // so that any string addition is added to a new leaf 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope evilRope("12345678901234567890123_"); 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //crope* pSevenCharRope( new TRope("1234567") ); 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope sevenCharRope0("12345678"); 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope sevenCharRope1("1234567"); 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // add _Rope_RopeRep<c,a>::_S_alloc_granularity-1 = 7 characters 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott evilRope += "1234567"; // creates a new leaf 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope sevenCharRope2("1234567"); 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // add one more character to the leaf 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott evilRope += '8'; // here is the write beyond the allocated memory 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( strcmp(sevenCharRope2.c_str(), "1234567") == 0 ); 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char str[] = "ilcpsklryvmcpjnbpbwllsrehfmxrkecwitrsglrexvtjmxypu\ 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottnbqfgxmuvgfajclfvenhyuhuorjosamibdnjdbeyhkbsomblto\ 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottuujdrbwcrrcgbflqpottpegrwvgajcrgwdlpgitydvhedtusip\ 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpyvxsuvbvfenodqasajoyomgsqcpjlhbmdahyviuemkssdslde\ 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottbesnnngpesdntrrvysuipywatpfoelthrowhfexlwdysvspwlk\ 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottfblfdf"; 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottcrope create_rope( int len ) 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int l = len/2; 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope result; 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if(l <= 2) 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static int j = 0; 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for(int i = 0; i < len; ++i) 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // char c = 'a' + rand() % ('z' - 'a'); 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott result.append(1, /* c */ str[j++] ); 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott j %= sizeof(str); 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott result = create_rope(len/2); 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott result.append(create_rope(len/2)); 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return result; 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid RopeTest::test_saved_rope_iterators() 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && \ 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott defined (_STLP_MEMBER_TEMPLATES) 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Try and create a rope with a complex tree structure: 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // srand(0); 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope r = create_rope(300); 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string expected(r.begin(), r.end()); 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(expected.size() == r.size()); 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(equal(expected.begin(), expected.end(), r.begin())); 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope::const_iterator i(r.begin()), j(r.end()); 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int pos = 0; 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott while(i != j) 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott crope::const_iterator k; 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // This initial read triggers the bug: 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(*i); 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott k = i; 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott int newpos = pos; 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Now make sure that i is incremented into the next leaf: 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott while(i != j) 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT(*i == expected[newpos]); 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++i; 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++newpos; 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Back up from stored value and continue: 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott i = k; 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++i; 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ++pos; 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 190