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