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