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