diff -r 000000000000 -r e4d67989cc36 genericopenlibs/cppstdlib/stl/test/unit/rope_test.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cppstdlib/stl/test/unit/rope_test.cpp Tue Feb 02 02:01:42 2010 +0200 @@ -0,0 +1,189 @@ +//Small header to get STLport numerous defines: +#include + +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) +# include + +# if !defined (_STLP_USE_NO_IOSTREAMS) +# include +# endif +#endif + +#include "cppunit/cppunit_proxy.h" + +// #include // for rand etc + +#if defined (_STLP_USE_NAMESPACES) +using namespace std; +#endif + +// +// TestCase class +// +class RopeTest : public CPPUNIT_NS::TestCase +{ + CPPUNIT_TEST_SUITE(RopeTest); +#if !defined (STLPORT) || defined (_STLP_NO_EXTENSIONS) || defined (_STLP_USE_NO_IOSTREAMS) + CPPUNIT_IGNORE; +#endif + CPPUNIT_TEST(io); +#if defined (_STLP_USE_NO_IOSTREAMS) + CPPUNIT_STOP_IGNORE; +#endif + CPPUNIT_TEST(find1); + CPPUNIT_TEST(find2); + CPPUNIT_TEST(construct_from_char); + CPPUNIT_TEST(bug_report); +#if !defined (_STLP_MEMBER_TEMPLATES) + CPPUNIT_IGNORE; +#endif + CPPUNIT_TEST(test_saved_rope_iterators); + CPPUNIT_TEST_SUITE_END(); + +protected: + void io(); + void find1(); + void find2(); + void construct_from_char(); + void bug_report(); + void test_saved_rope_iterators(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(RopeTest); + +// +// tests implementation +// +void RopeTest::io() +{ +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && !defined (_STLP_USE_NO_IOSTREAMS) + char const* cstr = "rope test string"; + crope rstr(cstr); + + { + ostringstream ostr; + ostr << rstr; + + CPPUNIT_ASSERT( ostr ); + CPPUNIT_ASSERT( ostr.str() == cstr ); + } +#endif +} + +void RopeTest::find1() +{ +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) + crope r("Fuzzy Wuzzy was a bear"); + crope::size_type n = r.find( "hair" ); + CPPUNIT_ASSERT( n == crope::npos ); + + n = r.find("ear"); + + CPPUNIT_ASSERT( n == (r.size() - 3) ); +#endif +} + +void RopeTest::find2() +{ +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) + crope r("Fuzzy Wuzzy was a bear"); + crope::size_type n = r.find( 'e' ); + CPPUNIT_ASSERT( n == (r.size() - 3) ); +#endif +} + +void RopeTest::construct_from_char() +{ +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) + crope r('1'); + char const* s = r.c_str(); + CPPUNIT_ASSERT( '1' == s[0] && '\0' == s[1] ); +#endif +} + +// Test used for a bug report from Peter Hercek +void RopeTest::bug_report() +{ +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) + //first create a rope bigger than crope::_S_copy_max = 23 + // so that any string addition is added to a new leaf + crope evilRope("12345678901234567890123_"); + //crope* pSevenCharRope( new TRope("1234567") ); + crope sevenCharRope0("12345678"); + crope sevenCharRope1("1234567"); + // add _Rope_RopeRep::_S_alloc_granularity-1 = 7 characters + evilRope += "1234567"; // creates a new leaf + crope sevenCharRope2("1234567"); + // add one more character to the leaf + evilRope += '8'; // here is the write beyond the allocated memory + CPPUNIT_ASSERT( strcmp(sevenCharRope2.c_str(), "1234567") == 0 ); +#endif +} + +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) +const char str[] = "ilcpsklryvmcpjnbpbwllsrehfmxrkecwitrsglrexvtjmxypu\ +nbqfgxmuvgfajclfvenhyuhuorjosamibdnjdbeyhkbsomblto\ +uujdrbwcrrcgbflqpottpegrwvgajcrgwdlpgitydvhedtusip\ +pyvxsuvbvfenodqasajoyomgsqcpjlhbmdahyviuemkssdslde\ +besnnngpesdntrrvysuipywatpfoelthrowhfexlwdysvspwlk\ +fblfdf"; + +crope create_rope( int len ) +{ + int l = len/2; + crope result; + if(l <= 2) + { + static int j = 0; + for(int i = 0; i < len; ++i) + { + // char c = 'a' + rand() % ('z' - 'a'); + result.append(1, /* c */ str[j++] ); + j %= sizeof(str); + } + } + else + { + result = create_rope(len/2); + result.append(create_rope(len/2)); + } + return result; +} + +#endif + +void RopeTest::test_saved_rope_iterators() +{ +#if defined (STLPORT) && !defined (_STLP_NO_EXTENSIONS) && \ + defined (_STLP_MEMBER_TEMPLATES) + // + // Try and create a rope with a complex tree structure: + // + // srand(0); + crope r = create_rope(300); + string expected(r.begin(), r.end()); + CPPUNIT_ASSERT(expected.size() == r.size()); + CPPUNIT_ASSERT(equal(expected.begin(), expected.end(), r.begin())); + crope::const_iterator i(r.begin()), j(r.end()); + int pos = 0; + while(i != j) + { + crope::const_iterator k; + // This initial read triggers the bug: + CPPUNIT_ASSERT(*i); + k = i; + int newpos = pos; + // Now make sure that i is incremented into the next leaf: + while(i != j) + { + CPPUNIT_ASSERT(*i == expected[newpos]); + ++i; + ++newpos; + } + // Back up from stored value and continue: + i = k; + ++i; + ++pos; + } +#endif +}