os/ossrv/genericopenlibs/cppstdlib/stl/test/unit/rope_test.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 }