177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//To make GLib C++ closer to STLport behavior we need this macro:
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//Only mandatory when building unit tests without STLport, do not change
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//anything when building with STLport
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _GLIBCXX_FULLY_DYNAMIC_STRING
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//Has to be first for StackAllocator swap overload to be taken
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//into account (at least using GCC 4.0.1)
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "stack_allocator.h"
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <vector>
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <deque>
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <string>
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include <algorithm>
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <sstream>
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stdexcept>
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_THREADS)
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (STLPORT) && defined (_STLP_PTHREADS) || \
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      defined (__GNUC__) && !defined (__MINGW32__)
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    define USE_PTHREAD_API
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    include <pthread.h>
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (STLPORT) && defined (_STLP_WIN32THREADS) || \
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      defined (__GNUC__) && defined (__MINGW32__) || \
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      defined (_MSC_VER)
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    define USE_WINDOWS_API
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    include <windows.h>
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "stack_allocator.h"
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#include "cppunit/cppunit_proxy.h"
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerusing namespace std;
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// TestCase class
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass StringTest : public CPPUNIT_NS::TestCase
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST_SUITE(StringTest);
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(constructor);
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(trivial_char_compare);
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(reserve);
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(assign);
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(erase);
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(data);
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(c_str);
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(null_char);
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(insert);
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(replace);
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(resize);
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(short_string);
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(find);
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(bogus_edge_find);
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(rfind);
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(find_last_of);
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(find_last_not_of);
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(copy);
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (USE_PTHREAD_API) && !defined (USE_WINDOWS_API)
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_IGNORE;
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(mt);
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_STOP_IGNORE;
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(short_string_optim_bug);
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(compare);
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(template_expression);
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (STLPORT) && ((defined (_STLP_MSVC) && (_STLP_MSVC < 1300)) || \
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   (defined(__GNUC__) && defined(_STLP_USE_TEMPLATE_EXPRESSION) && \
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)) ) )
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define TE_TMP_TEST_IGNORED
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_IGNORE;
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(te_tmp);
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (TE_TMP_TEST_IGNORED)
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_STOP_IGNORE;
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(oper_tmp);
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (STLPORT) && defined (_STLP_NO_WCHAR_T)
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_IGNORE;
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__CYGWIN__) && !defined (STLPORT)
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_IGNORE;
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(template_wexpression);
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_STOP_IGNORE;
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (STLPORT) && defined (_STLP_USE_NO_IOSTREAMS)
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_IGNORE;
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(io);
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_STOP_IGNORE;
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (STLPORT) && defined (_STLP_NO_CUSTOM_IO)
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_IGNORE;
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(allocator_with_state);
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_STOP_IGNORE;
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(capacity);
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST(concat24);
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_TEST_SUITE_END();
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void constructor();
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void trivial_char_compare();
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void reserve();
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void erase();
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void data();
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void c_str();
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void null_char();
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void insert();
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void replace();
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void resize();
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void short_string();
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void find();
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void bogus_edge_find();
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void rfind();
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void find_last_of();
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void find_last_not_of();
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void copy();
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void assign();
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void mt();
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void short_string_optim_bug();
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void compare();
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void template_expression();
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void te_tmp();
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void oper_tmp();
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void template_wexpression();
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void io();
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void allocator_with_state();
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void capacity();
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void concat24();
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static string func(const string& par) {
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string tmp( par );
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return tmp;
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (USE_PTHREAD_API) || defined (USE_WINDOWS_API)
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (USE_PTHREAD_API)
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void* f(void*)
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  else
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static DWORD __stdcall f(void*)
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "qyweyuewunfkHBUKGYUGL,wehbYGUW^(@T@H!BALWD:h^&@#*@(#:JKHWJ:CND" );
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for ( int i = 0; i < 2000000; ++i ) {
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      string sx = func( s );
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(StringTest);
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// tests implementation
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::constructor()
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  try {
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s((size_t)-1, 'a');
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch (length_error const&) {
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch (...) {
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Expected exception is length_error:
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::trivial_char_compare()
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s( "message" );
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s == "message" );
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( "message" == s );
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::reserve()
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s;
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  try {
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    s.reserve(s.max_size() + 1);
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch (length_error const&) {
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch (...) {
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Expected exception is length_error:
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::mt()
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (USE_PTHREAD_API) || defined (USE_WINDOWS_API)
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const int nth = 2;
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (USE_PTHREAD_API)
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pthread_t t[nth];
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( int i = 0; i < nth; ++i ) {
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    pthread_create( &t[i], 0, f, 0 );
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( int i = 0; i < nth; ++i ) {
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    pthread_join( t[i], 0 );
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif // PTHREAD
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (USE_WINDOWS_API)
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //DWORD start = GetTickCount();
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  HANDLE t[nth];
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int i; // VC6 not support in-loop scope of cycle var
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( i = 0; i < nth; ++i ) {
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    t[i] = CreateThread(NULL, 0, f, 0, 0, NULL);
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (WaitForMultipleObjects(nth, t, TRUE, INFINITE) == WAIT_FAILED) {
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // On some platforms (evc3/evc4) WaitForMultipleObjects() with fWaitAll == TRUE
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // is not supported. We then wait with a loop on each thread:
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    for ( i = 0; i < nth; ++i ) {
24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      WaitForSingleObject(t[i], INFINITE);
24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /*
24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  DWORD duration = GetTickCount() - start;
24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ostringstream ostr;
24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ostr << "Duration: " << duration << endl;
24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_MESSAGE(ostr.str().c_str());
24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  */
25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::short_string()
25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string const ref_short_str1("str1"), ref_short_str2("str2");
25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string short_str1(ref_short_str1), short_str2(ref_short_str2);
25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string const ref_long_str1("str                                                  1");
25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string const ref_long_str2("str                                                  2");
26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string long_str1(ref_long_str1), long_str2(ref_long_str2);
26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(short_str1 == ref_short_str1);
26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(long_str1 == ref_long_str1);
26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string str1(short_str1);
26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1 = long_str1;
26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT(str1 == ref_long_str1);
26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string str1(long_str1);
27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1 = short_str1;
27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT(str1 == ref_short_str1);
27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    short_str1.swap(short_str2);
27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT((short_str1 == ref_short_str2) && (short_str2 == ref_short_str1));
28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    short_str1.swap(short_str2);
28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    long_str1.swap(long_str2);
28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT((long_str1 == ref_long_str2) && (long_str2 == ref_long_str1));
28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    long_str1.swap(long_str2);
28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    short_str1.swap(long_str1);
29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT((short_str1 == ref_long_str1) && (long_str1 == ref_short_str1));
29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    short_str1.swap(long_str1);
29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    long_str1.swap(short_str1);
29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT((short_str1 == ref_long_str1) && (long_str1 == ref_short_str1));
29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    long_str1.swap(short_str1);
29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string a(256, 'a');
30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string b(256, 'b');
30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const char* as = a.c_str();
30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const char* bs = b.c_str();
30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    swap(a, b);
30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( a.c_str() == bs );
30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( b.c_str() == as );
30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //This is to test move constructor
31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    vector<string> str_vect;
31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str_vect.push_back(short_str1);
31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str_vect.push_back(long_str1);
31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str_vect.push_back(short_str2);
31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str_vect.push_back(long_str2);
31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT((str_vect[0] == ref_short_str1) &&
31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   (str_vect[1] == ref_long_str1) &&
32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   (str_vect[2] == ref_short_str2) &&
32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                   (str_vect[3] == ref_long_str2));
32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::erase()
32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char const* c_str = "Hello, World!";
32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str(c_str);
32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == c_str );
33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.erase(str.begin() + 1, str.end() - 1); // Erase all but first and last.
33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t i;
33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (i = 0; i < str.size(); ++i) {
33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    switch ( i ) {
33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      case 0:
33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        CPPUNIT_ASSERT( str[i] == 'H' );
33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        break;
33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      case 1:
34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        CPPUNIT_ASSERT( str[i] == '!' );
34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        break;
34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      default:
34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        CPPUNIT_FAIL;
34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(1, c_str);
34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.erase(str.begin()); // Erase first element.
34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.erase(str.end() - 1); // Erase last element.
35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == c_str );
35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.clear(); // Erase all.
35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str.empty() );
35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = c_str;
35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == c_str );
35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.erase(1, str.size() - 1); // Erase all but first and last.
35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (i = 0; i < str.size(); i++) {
35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    switch ( i ) {
36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      case 0:
36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        CPPUNIT_ASSERT( str[i] == 'H' );
36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        break;
36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      case 1:
36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        CPPUNIT_ASSERT( str[i] == '!' );
36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        break;
36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      default:
36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        CPPUNIT_FAIL;
36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.erase(1);
37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "H" );
37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::data()
37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string xx;
37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( xx.data() != 0 );  // ISO-IEC-14882:1998(E), 21.3.6, paragraph 3
38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if 0
38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* This test really not required: in ISO-IEC-14882:1998(E) paragraph 3 stated:
38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * '... and can have zero added to it', again: 'CAN', but not 'MUST'.
38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * That's why I am comment this test. But I don't remove it due to I had
38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * unevident problem with misinterpretation of data() return (i.e. data()
38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * and c_str() provide different functionality!) and expect that this is
38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * more-or-less common pitfall.
38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *    - ptr
38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string low( "2004-01-01" );
39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Blocks A and B should follow each other.
39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Block A:
39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx = "123456";
39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx += low;
39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ( strcmp( xx.data(), "1234562004-01-01" ) != 0 ) {
39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return -1;
39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // End of block A
39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Block B:
40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx = "1234";
40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx += ";";
40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if ( strcmp( xx.data(), "1234;" ) != 0 ) {
40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return -1;
40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // End of block B
40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::c_str()
41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string low( "2004-01-01" );
41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string xx;
41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string yy;
41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *(yy.c_str()) == '\0' ); // ISO-IEC-14882:1998(E), 21.3.6, paragraph 1
41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Blocks A and B should follow each other.
41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Block A:
42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx = "123456";
42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx += low;
42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( strcmp( xx.c_str(), "1234562004-01-01" ) == 0 );
42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // End of block A
42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Block B:
42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx = "1234";
42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  xx += ";";
42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( strcmp( xx.c_str(), "1234;" ) == 0 );
42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // End of block B
43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::null_char()
43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // ISO/IEC 14882:1998(E), ISO/IEC 14882:2003(E), 21.3.4 ('... the const version')
43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const string s( "123456" );
43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s[s.size()] == '\0' );
43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  try {
44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Check is only here to avoid warning about value of expression not used
44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( s.at(s.size()) == '\0' );
44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch (out_of_range const&) {
44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( true );
44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch ( ... ) {
44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::insert()
45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string strorg = "This is test string for string calls";
45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str;
45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /*
45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * In case of reallocation there is no auto reference problem
46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * so we reserve a big enough string to be sure to test this
46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * particular point.
46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.reserve(100);
46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //test self insertion:
46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(10, str.c_str() + 5, 15);
46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "This is teis test string st string for string calls" );
46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(15, str.c_str() + 5, 25);
47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "This is test stis test string for stringring for string calls" );
47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(0, str.c_str() + str.size() - 4, 4);
47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "allsThis is test string for string calls" );
47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(0, str.c_str() + str.size() / 2 - 1, str.size() / 2 + 1);
48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "ng for string callsThis is test string for string calls" );
48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::iterator b = str.begin();
48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::const_iterator s = str.begin() + str.size() / 2 - 1;
48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::const_iterator e = str.end();
48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert( b, s, e );
48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "ng for string callsThis is test string for string calls" );
48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(str.begin(), str.begin() + str.size() / 2 - 1, str.end());
49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "ng for string callsThis is test string for string calls" );
49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_MEMBER_TEMPLATES
49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  vector<int> int_vect;
49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //Just a compile time test:
49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.insert(str.end(), int_vect.begin(), int_vect.end());
49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str0;
50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str0.insert(str0.begin(), 5, '0');
50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str0 == "00000" );
50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str1;
50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type pos = 0, nb = 2;
50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1.insert(pos, nb, '1');
50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1 == "11" );
50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str0.insert(0, str1);
51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str0 == "1100000" );
51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str2("2345");
51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str0.insert(str0.size(), str2, 1, 2);
51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str0 == "110000034" );
51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str1.insert(str1.begin() + 1, 2, '2');
51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1 == "1221" );
51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str1.insert(2, "333333", 3);
52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1 == "1233321" );
52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str1.insert(4, "4444");
52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1 == "12334444321" );
52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str1.insert(str1.begin() + 6, '5');
52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1 == "123344544321" );
52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::replace()
53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /*
53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * This test case is for the non template basic_string::replace method,
53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * this is why we play with the const iterators and reference to guaranty
53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * that the right method is called.
53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const string v( "78" );
53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s( "123456" );
53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string const& cs = s;
54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::iterator i = s.begin() + 1;
54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(i, i + 3, v.begin(), v.end());
54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "17856" );
54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  i = s.begin() + 1;
54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(i, i + 1, v.begin(), v.end());
54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "1783456" );
54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  i = s.begin() + 1;
55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::const_iterator ci = s.begin() + 1;
55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(i, i + 3, ci + 3, cs.end());
55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "15656" );
55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  i = s.begin() + 1;
55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ci = s.begin() + 1;
55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(i, i + 3, ci, ci + 2);
56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "12356" );
56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  i = s.begin() + 1;
56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ci = s.begin() + 1;
56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(i, i + 3, ci + 1, cs.end());
56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "1345656" );
56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  i = s.begin();
57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ci = s.begin() + 1;
57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(i, i, ci, ci + 1);
57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s == "2123456" );
57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(s.begin() + 4, s.end(), cs.begin(), cs.end());
57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "1234123456" );
57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /*
57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * This is the test for the template replace method.
58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
58177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
58277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::iterator b = s.begin() + 4;
58377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::iterator e = s.end();
58477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::const_iterator rb = s.begin();
58577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::const_iterator re = s.end();
58677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(b, e, rb, re);
58777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "1234123456" );
58877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
58977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "123456";
59077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.replace(s.begin() + 4, s.end(), s.begin(), s.end());
59177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "1234123456" );
59277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
59377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string strorg("This is test string for string calls");
59477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str = strorg;
59577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.replace(5, 15, str.c_str(), 10);
59677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "This This is tefor string calls" );
59777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
59877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str = strorg;
59977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.replace(5, 5, str.c_str(), 10);
60077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "This This is test string for string calls" );
60177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
60277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if (defined (STLPORT) && defined(_STLP_MEMBER_TEMPLATES)) || ( !defined (STLPORT) && !defined(__GNUC__) )
60377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  deque<char> cdeque;
60477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  cdeque.push_back('I');
60577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str.replace(str.begin(), str.begin() + 11, cdeque.begin(), cdeque.end());
60677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str == "Is test string for string calls" );
60777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
60877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
60977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
61077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::resize()
61177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
61277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s;
61377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
61477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.resize(0);
61577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
61677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *s.c_str() == 0 );
61777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
61877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "1234567";
61977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
62077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.resize(0);
62177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *s.c_str() == 0 );
62277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
62377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "1234567";
62477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.resize(1);
62577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.size() == 1 );
62677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *s.c_str() == '1' );
62777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( *(s.c_str() + 1) == 0 );
62877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
62977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s = "1234567";
63077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.resize(10);
63177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.size() == 10 );
63277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s[6] == '7' );
63377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s[7] == 0 );
63477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s[8] == 0 );
63577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s[9] == 0 );
63677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
63777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
63877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::find()
63977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
64077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s("one two three one two three");
64177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find("one") == 0 );
64277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find('t') == 4 );
64377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find('t', 5) == 8 );
64477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //We are trying to get a const reference to the npos string static member to
64577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //force the compiler to allocate memory for this variable. It is used to reveal
64677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //a bug of STLport which was simply declaring npos without instanciating it.
64777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (STLPORT) && defined (_STLP_STATIC_CONST_INIT_BUG)
64877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string::size_type const& npos_local = string::npos;
64977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
65077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define npos_local string::npos
65177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
65277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find("four") == npos_local );
65377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find("one", string::npos) == npos_local );
65477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
65577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find_first_of("abcde") == 2 );
65677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
65777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find_first_not_of("enotw ") == 9 );
65877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
65977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string empty;
66077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.substr(s.find(empty), empty.size()) == empty );
66177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
66277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
66377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::bogus_edge_find()
66477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
66577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* ISO/IEC 14882 2003, 21.3.6.1 basic_string::find [lib.string::find]
66677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *
66777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * size_type find(const basic_string<charT,traits,Allocator>& str,
66877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *                size_type pos = 0) const;
66977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * Effects: Determines the lowest position xpos, if possible, such that
67077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * both of the following conditions obtain:
67177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *    pos <= xpos and xpos + str.size() <= size();
67277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *    at(xpos+I) == str.at(I) for all elements I of the string controlled by str.
67377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * Returns: xpos if the function can determine such a value for xpos. Otherwise,
67477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * returns npos.
67577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * Notes: Uses traits::eq().
67677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *
67777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * ===
67877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * So, from formal point of view
67977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *   string s; string::size_type p = s.find( "", 0, 0 );
68077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * should return 0 in p, i.e. position out-of-bound of string, so
68177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * code like following is bad:
68277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * string s;
68377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *
68477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * string::size_type p = s.find( "", 0, 0 );
68577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *
68677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * ...
68777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *
68877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * if ( p != string::npos ) { // normal
68977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *   char ch = s[p]; // Arghhhhhhhhhh
69077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * }
69177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   *
69277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * People near Standard commete has opinion opposite to my. Even if it looks
69377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * like bogus behaviour for me, it should be fixed.
69477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
69577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
69677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
69777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s;
69877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.find( "", 0, 0 );
69977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
70077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* CPPUNIT_CHECK( p == string::npos ); */
70177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 0 ); // bogus result, isn't it?
70277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
70377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
70477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "123" );
70577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.find( "", 0, 0 );
70677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
70777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 0 );
70877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
70977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
71077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "123" );
71177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.find( "", 1, 0 );
71277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
71377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 1 );
71477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
71577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
71677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "" );
71777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.find( "", 1, 0 );
71877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
71977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == string::npos );
72077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
72177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
72277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "123" );
72377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.find( "", 3, 0 );
72477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
72577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 3 ); // bogus result, isn't it?
72677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
72777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
72877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s;
72977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.rfind( "", 0, 0 );
73077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
73177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    /* CPPUNIT_CHECK( p == string::npos ); */
73277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 0 ); // bogus result, isn't it?
73377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
73477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
73577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "123" );
73677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.rfind( "", 0, 0 );
73777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
73877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 0 );
73977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
74077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
74177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "123" );
74277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.rfind( "", 1, 0 );
74377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
74477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 1 );
74577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
74677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
74777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "" );
74877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.rfind( "", 1, 0 );
74977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
75077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 0 ); // bogus result, isn't it?
75177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
75277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
75377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s( "123" );
75477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::size_type p = s.rfind( "", 3, 0 );
75577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
75677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( p == 3 ); // bogus result, isn't it?
75777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
75877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
75977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
76077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::rfind()
76177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
76277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // 21.3.6.2
76377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s("one two three one two three");
76477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
76577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.rfind("two") == 18 );
76677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.rfind("two", 0) == string::npos );
76777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.rfind("two", 11) == 4 );
76877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.rfind('w') == 19 );
76977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
77077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string test( "aba" );
77177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
77277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.rfind( "a", 2, 1 ) == 2 );
77377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.rfind( "a", 1, 1 ) == 0 );
77477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.rfind( "a", 0, 1 ) == 0 );
77577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
77677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.rfind( 'a', 2 ) == 2 );
77777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.rfind( 'a', 1 ) == 0 );
77877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.rfind( 'a', 0 ) == 0 );
77977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
78077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
78177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::find_last_of()
78277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
78377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // 21.3.6.4
78477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s("one two three one two three");
78577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
78677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find_last_of("abcde") == 26 );
78777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
78877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string test( "aba" );
78977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
79077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( "a", 2, 1 ) == 2 );
79177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( "a", 1, 1 ) == 0 );
79277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( "a", 0, 1 ) == 0 );
79377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
79477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( 'a', 2 ) == 2 );
79577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( 'a', 1 ) == 0 );
79677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( 'a', 0 ) == 0 );
79777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
79877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
79977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::find_last_not_of()
80077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
80177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // 21.3.6.6
80277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s("one two three one two three");
80377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
80477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s.find_last_not_of("ehortw ") == 15 );
80577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
80677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string test( "aba" );
80777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
80877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "a", 2, 1 ) == 1 );
80977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "b", 2, 1 ) == 2 );
81077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "a", 1, 1 ) == 1 );
81177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "b", 1, 1 ) == 0 );
81277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "a", 0, 1 ) == string::npos );
81377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "b", 0, 1 ) == 0 );
81477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
81577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'a', 2 ) == 1 );
81677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'b', 2 ) == 2 );
81777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'a', 1 ) == 1 );
81877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'b', 1 ) == 0 );
81977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'a', 0 ) == string::npos );
82077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'b', 0 ) == 0 );
82177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
82277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
82377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::copy()
82477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
82577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s("foo");
82677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char dest[4];
82777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  dest[0] = dest[1] = dest[2] = dest[3] = 1;
82877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.copy(dest, 4);
82977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  int pos = 0;
83077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'f' );
83177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'o' );
83277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'o' );
83377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 1 );
83477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
83577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  dest[0] = dest[1] = dest[2] = dest[3] = 1;
83677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.copy(dest, 4, 2);
83777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pos = 0;
83877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'o' );
83977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 1 );
84077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
84177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
84277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  try {
84377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    s.copy(dest, 4, 5);
84477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
84577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
84677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch (out_of_range const&) {
84777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
84877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  catch ( ... ) {
84977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_FAIL;
85077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
85177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
85277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
85377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
85477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::assign()
85577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
85677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s;
85777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char const* cstr = "test string for assign";
85877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
85977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.assign(cstr, cstr + 22);
86077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == "test string for assign" );
86177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
86277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s2("other test string");
86377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  s.assign(s2);
86477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( s == s2 );
86577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
86677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static string str1;
86777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static string str2;
86877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
86977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // short string optim:
87077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str1 = "123456";
87177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // longer than short string:
87277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "1234567890123456789012345678901234567890";
87377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
87477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(str1[5] == '6');
87577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT(str2[29] == '0');
87677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
87777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
87877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* This test is to check if string properly supports the short string
87977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * optimization. It has been found out that eMbedded Visual C++ 3.0 and .NET
88077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * compilers for the ARM platform fail to pass structs and classes of certain
88177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * size per value. This seems to be a known compiler bug. For other processors
88277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * (e.g. x86) the error doesn't occur.
88377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * (The ARM compiler creates a temporary object from teststr on the stack, to
88477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * pass it to the helper function. It uses the copy constructor for this.
88577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * After this the temporary object is copied to another place on the stack.
88677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * The result is that the _M_finish pointer then points to the wrong buffer
88777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * end and the size of the short string is incorrectly calculated.)
88877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
88977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::short_string_optim_bug()
89077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
89177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   string teststr("shortest");
89277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   bool short_string_optim_bug_helper(string teststr);
89477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   CPPUNIT_ASSERT(true == short_string_optim_bug_helper(teststr));
89677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
89777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
89877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerbool short_string_optim_bug_helper(string teststr)
89977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
90077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   size_t ss = teststr.size();
90177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   return (ss == 8);
90277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
90377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::compare()
90577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
90677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str1("abcdef");
90777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str2;
90877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
90977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "abcdef";
91077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(str2) == 0 );
91177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "abcde";
91277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(str2) > 0 );
91377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "abcdefg";
91477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(str2) < 0 );
91577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
91677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare("abcdef") == 0 );
91777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare("abcde") > 0 );
91877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare("abcdefg") < 0 );
91977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "cde";
92177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2) == 0 );
92277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "cd";
92377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2) > 0 );
92477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "cdef";
92577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2) < 0 );
92677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
92777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  str2 = "abcdef";
92877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2, 2, 3) == 0 );
92977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2, 2, 2) > 0 );
93077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2, 2, 4) < 0 );
93177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, "cdefgh", 3) == 0 );
93377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, "cdefgh", 2) > 0 );
93477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, "cdefgh", 4) < 0 );
93577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
93677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
93777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
93877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass mystring : public string {
93977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
94077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  mystring() {}
94177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  mystring(string const& s) : string(s) {}
94277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
94377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  mystring& operator = (string const& s) {
94477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string::operator = (s);
94577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return *this;
94677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
94777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
94877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner*/
94977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
95077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::template_expression()
95177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
95277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string one("one"), two("two"), three("three");
95377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string space(1, ' ');
95477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
95577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // check availability of [un]equality operators
95677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
95777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // string-string
95877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      one == two;
95977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      one != two;
96077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // string-literal
96177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      one == "two";
96277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      one != "two";
96377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // literal-string
96477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      "one" == two;
96577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      "one" != two;
96677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // strsum-string
96777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (one + two) == three;
96877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (one + two) != three;
96977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // string-strsum
97077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      one == (two + three);
97177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      one != (two + three);
97277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // strsum-literal
97377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (one + two) == "three";
97477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (one + two) != "three";
97577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // literal-strsum
97677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      "one" == (two + three);
97777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      "one" != (two + three);
97877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      // strsum-strsum
97977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (one + two) == (two + three);
98077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (one + two) != (two + three);
98177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
98277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
98477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string result(one + ' ' + two + ' ' + three);
98577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
98677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
98777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
98877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
98977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string result(one + ' ' + two + ' ' + three, 4);
99077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "two three" );
99177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
99277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
99377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
99477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string result(one + ' ' + two + ' ' + three, 4, 3);
99577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "two" );
99677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
99777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
99877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //2 members expressions:
99977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (' ' + one) == " one" );
100077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + ' ') == "one " );
100177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + " two") == "one two" );
100277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ("one " + two) == "one two" );
100377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + space) == "one " );
100477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
100577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //3 members expressions:
100677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + "two") == "one two" );
100777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ("one" + (space + two)) == "one two" );
100877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + two) == "one two" );
100977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + (space + two)) == "one two" );
101077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + 't') == "one t" );
101177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ('o' + (space + two)) == "o two" );
101277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
101377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //4 members expressions:
101477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + (two + space)) == "one two " );
101577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
101677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //special operators
101777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
101877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string result;
101977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = one + space + two;
102077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two" );
102177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
102277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result += space + three;
102377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
102477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
102577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
102677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //special append method
102777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
102877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string result;
102977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
103077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.reserve(64);
103177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(one + space + two);
103377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two" );
103477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(space + result + space + three);
103677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two one two three" );
103777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
103877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = "one two";
103977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(space + three, 1, 2);
104077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( result == "one twoth" );
104177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(space + result);
104377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one twoth one twoth" );
104477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
104577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
104677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //special assign method
104777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
104877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string result;
104977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
105077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.reserve(64);
105177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.assign(one + space + two + space + three);
105377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
105477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.assign(one + space + two + space + three, 3, 5);
105677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == " two " );
105777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
105877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.assign(one + result + three);
105977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
106077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
106177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
106277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
106377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( !(one + ' ' + two).empty() );
106477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
106577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    char result = (one + ' ' + two)[3];
106677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == ' ' );
106777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
106877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = (one + ' ' + two).at(3);
106977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == ' ' );
107077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
107177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
107277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    try {
107377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      result = (one + ' ' + two).at(10);
107477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_FAIL;
107577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
107677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    catch (out_of_range const&) {
107777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_ASSERT( result == ' ' );
107877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
107977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    catch (...) {
108077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_FAIL;
108177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
108277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
108377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
108477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
108577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /*
108677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  mystring a("ing");
108777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //gcc failed to compile following expression when template expressions are activated.
108877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //MSVC sees no problem. gcc limitation or MSVC is too cool ??
108977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  mystring b = "str" + a;
109077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  */
109177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
109277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
109377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (TE_TMP_TEST_IGNORED)
109477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass superstring
109577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
109677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  public:
109777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    superstring() :
109877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      s("super")
109977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {}
110077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
110177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    superstring( const string& str ) :
110277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      s( str )
110377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    {}
110477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
110577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  superstring operator / (const string& str )
110677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { return superstring( s + "/" + str ); }
110777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
110877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  superstring operator / (const char* str )
110977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    { return superstring( s + "/" + str ); }
111077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
111177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  private:
111277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string s;
111377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
111477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
111577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
111677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::te_tmp()
111777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
111877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (TE_TMP_TEST_IGNORED)
111977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  superstring s;
112077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string more( "more" );
112177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string less( "less" );
112277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
112377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  superstring r = s / (more + less);
112477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
112577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
112677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
112777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass mypath
112877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
112977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  public:
113077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    mypath( const string& s ) :
113177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        p( s )
113277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      { }
113377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
113477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const mypath& operator / ( const string& );
113577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    const string& str() const
113677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      { return p; }
113777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
113877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  private:
113977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string p;
114077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
114177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
114277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerconst mypath& mypath::operator /( const string& s )
114377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
114477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  p += '/';
114577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  p += s;
114677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return *this;
114777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
114877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
114977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::oper_tmp()
115077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
115177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s1( "path1" );
115277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s2( ".ext" );
115377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
115477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string& rs1 = s1;
115577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string& rs2 = s2;
115677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
115777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (mypath( string( "/root" ) ) / (rs1 + rs2)).str() == "/root/path1.ext" );
115877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
115977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
116077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::template_wexpression()
116177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
116277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T)
116377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if !defined (__CYGWIN__) || defined (STLPORT)
116477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wstring one(L"one"), two(L"two"), three(L"three");
116577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  wstring space(L" ");
116677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
116777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
116877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wstring result(one + L' ' + two + L' ' + three);
116977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
117077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
117177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
117277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
117377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wstring result(one + L' ' + two + L' ' + three, 4);
117477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"two three" );
117577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
117677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
117777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
117877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wstring result(one + L' ' + two + L' ' + three, 4, 3);
117977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"two" );
118077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
118177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
118277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //2 members expressions:
118377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (L' ' + one) == L" one" );
118477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + L' ') == L"one " );
118577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + L" two") == L"one two" );
118677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (L"one " + two) == L"one two" );
118777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + space) == L"one " );
118877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
118977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //3 members expressions:
119077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + L"two") == L"one two" );
119177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (L"one" + (space + two)) == L"one two" );
119277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + two) == L"one two" );
119377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (one + (space + two)) == L"one two" );
119477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + L't') == L"one t" );
119577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( (L'o' + (space + two)) == L"o two" );
119677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
119777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //4 members expressions:
119877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + (two + space)) == L"one two " );
119977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
120077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //special operators
120177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
120277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wstring result;
120377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = one + space + two;
120477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two" );
120577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
120677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result += space + three;
120777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
120877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
120977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
121077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //special append method
121177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
121277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wstring result;
121377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
121477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.reserve(64);
121577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
121677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(one + space + two);
121777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two" );
121877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
121977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(space + result + space + three);
122077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two one two three" );
122177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
122277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = L"one two";
122377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(space + three, 1, 2);
122477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( result == L"one twoth" );
122577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
122677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.append(space + result);
122777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one twoth one twoth" );
122877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
122977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
123077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //special assign method
123177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
123277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wstring result;
123377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
123477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.reserve(64);
123577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
123677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.assign(one + space + two + space + three);
123777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
123877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
123977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.assign(one + space + two + space + three, 3, 5);
124077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L" two " );
124177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
124277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result.assign(one + result + three);
124377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
124477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
124577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
124677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
124777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( !(one + L' ' + two).empty() );
124877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
124977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    wchar_t result = (one + L' ' + two)[3];
125077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L' ' );
125177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
125277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    result = (one + L' ' + two).at(3);
125377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( result == L' ' );
125477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
125577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
125677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    try {
125777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      result = (one + L' ' + two).at(10);
125877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_FAIL;
125977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
126077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    catch (out_of_range const&) {
126177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_ASSERT( result == L' ' );
126277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
126377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    catch (...) {
126477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      CPPUNIT_FAIL;
126577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
126677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    endif
126777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
126877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
126977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
127077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
127177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
127277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::io()
127377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
127477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
127577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string str("STLport");
127677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
127777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ostringstream ostr;
127877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    ostr << str;
127977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( ostr.good() );
128077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( ostr.str() == str );
128177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
128277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
128377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    istringstream istr(str);
128477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string istr_content;
128577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    istr >> istr_content;
128677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( !istr.fail() && istr.eof() );
128777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( istr_content == str );
128877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
128977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
129077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    istringstream istr(str);
129177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    istr.width(3);
129277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    string istr_content;
129377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    istr >> istr_content;
129477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( !istr.fail() && !istr.eof() );
129577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( istr_content == "STL" );
129677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
129777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
129877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
129977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
130077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::allocator_with_state()
130177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
130277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !(defined (STLPORT) && defined (_STLP_NO_CUSTOM_IO))
130377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
130477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf1[1024];
130577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  StackAllocator<char> stack1(buf1, buf1 + sizeof(buf1));
130677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
130777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  char buf2[1024];
130877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  StackAllocator<char> stack2(buf2, buf2 + sizeof(buf2));
130977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
131077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef basic_string<char, char_traits<char>, StackAllocator<char> > StackString;
131177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
131277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1("string stack1", stack1);
131377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1Cpy(str1);
131477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
131577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2("string stack2", stack2);
131677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2Cpy(str2);
131777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
131877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1.swap(str2);
131977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
132077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
132177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
132277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
132377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
132477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
132577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
132677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
132777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
132877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
132977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
133077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stack1.reset(); stack2.reset();
133177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
133277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
133377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1("longer string from stack1 allocator instance for dynamic allocation", stack1);
133477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1Cpy(str1);
133577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
133677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2("longer string from stack2 allocator instance for dynamic allocation", stack2);
133777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2Cpy(str2);
133877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
133977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1.swap(str2);
134077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
134177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
134277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
134377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
134477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
134577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
134677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
134777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
134877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
134977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
135077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
135177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stack1.reset(); stack2.reset();
135277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
135377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
135477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
135577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1("string stack1", stack1);
135677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1Cpy(str1);
135777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
135877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2("longer string from stack2 allocator instance for dynamic allocation", stack2);
135977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2Cpy(str2);
136077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
136177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1.swap(str2);
136277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
136377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
136477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
136577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
136677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
136777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
136877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
136977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
137077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
137177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
137277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
137377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stack1.reset(); stack2.reset();
137477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
137577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
137677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
137777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1("longer string from stack1 allocator instance for dynamic allocation", stack1);
137877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str1Cpy(str1);
137977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
138077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2("string stack2", stack2);
138177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    StackString str2Cpy(str2);
138277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
138377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    str1.swap(str2);
138477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
138577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
138677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
138777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
138877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
138977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
139077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
139177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
139277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
139377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
139477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
139577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  stack1.reset(); stack2.reset();
139677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
139777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
139877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
139977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::capacity()
140077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
140177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s;
140277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
140377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s.capacity() > 0 );
140477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s.capacity() < s.max_size() );
140577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s.capacity() >= s.size() );
140677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
140777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_SHORT_STRING_SZ
140877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_SHORT_STRING_SZ 16 // see stlport/stl/_string_base.h
140977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
141077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
141177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for ( int i = 0; i < _STLP_SHORT_STRING_SZ + 2; ++i ) {
141277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    s += ' ';
141377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( s.capacity() > 0 );
141477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( s.capacity() < s.max_size() );
141577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    CPPUNIT_CHECK( s.capacity() >= s.size() );
141677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
141777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
141877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
141977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid StringTest::concat24()
142077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
142177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  string s = string( "123456789012345678901234" ) + string( "123456789012345678901234" );
142277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
142377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s.length() == 48 );
142477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s[23] == '4' );
142577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s[24] == '1' );
142677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  CPPUNIT_CHECK( s[47] == '4' );
142777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
1428