1a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//To make GLib C++ closer to STLport behavior we need this macro:
2a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//Only mandatory when building unit tests without STLport, do not change
3a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//anything when building with STLport
4a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#define _GLIBCXX_FULLY_DYNAMIC_STRING
5a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
6a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//Has to be first for StackAllocator swap overload to be taken
7a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//into account (at least using GCC 4.0.1)
8a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include "stack_allocator.h"
9a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
10a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <vector>
11a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <deque>
12a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <string>
13a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include <algorithm>
14a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
15a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  include <sstream>
16a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
17a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
18a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
19a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  include <stdexcept>
20a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
21a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
22a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_THREADS)
23a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (STLPORT) && defined (_STLP_PTHREADS) || \
24a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      defined (__GNUC__) && !defined (__MINGW32__)
25a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#    define USE_PTHREAD_API
26a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#    include <pthread.h>
27a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
28a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
29a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (STLPORT) && defined (_STLP_WIN32THREADS) || \
30a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      defined (__GNUC__) && defined (__MINGW32__) || \
31a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      defined (_MSC_VER)
32a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#    define USE_WINDOWS_API
33a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#    include <windows.h>
34a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
35a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
36a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
37a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include "stack_allocator.h"
38a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#include "cppunit/cppunit_proxy.h"
39a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
40a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
41a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerusing namespace std;
42a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
43a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
44a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
45a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// TestCase class
46a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
47a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass StringTest : public CPPUNIT_NS::TestCase
48a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
49a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST_SUITE(StringTest);
50a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(constructor);
51a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(trivial_char_compare);
52a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(reserve);
53a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(assign);
54a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(erase);
55a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(data);
56a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(c_str);
57a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(null_char);
58a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(insert);
59a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(replace);
60a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(resize);
61a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(short_string);
62a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(find);
63a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(bogus_edge_find);
64a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(rfind);
65a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(find_last_of);
66a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(find_last_not_of);
67a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(copy);
68a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (USE_PTHREAD_API) && !defined (USE_WINDOWS_API)
69a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
70a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
71a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(mt);
72a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_STOP_IGNORE;
73a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(short_string_optim_bug);
74a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(compare);
75a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(template_expression);
76a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && ((defined (_STLP_MSVC) && (_STLP_MSVC < 1300)) || \
77a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   (defined(__GNUC__) && defined(_STLP_USE_TEMPLATE_EXPRESSION) && \
78a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    ((__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)) ) )
79a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  define TE_TMP_TEST_IGNORED
80a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
81a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
82a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(te_tmp);
83a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (TE_TMP_TEST_IGNORED)
84a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_STOP_IGNORE;
85a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
86a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(oper_tmp);
87a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && defined (_STLP_NO_WCHAR_T)
88a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
89a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
90a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (__CYGWIN__) && !defined (STLPORT)
91a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
92a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
93a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(template_wexpression);
94a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_STOP_IGNORE;
95a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && defined (_STLP_USE_NO_IOSTREAMS)
96a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
97a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
98a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(io);
99a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_STOP_IGNORE;
100a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && defined (_STLP_NO_CUSTOM_IO)
101a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_IGNORE;
102a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
103a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(allocator_with_state);
104a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_STOP_IGNORE;
105a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(capacity);
106a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST(concat24);
107a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_TEST_SUITE_END();
108a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
109a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerprotected:
110a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void constructor();
111a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void trivial_char_compare();
112a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void reserve();
113a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void erase();
114a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void data();
115a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void c_str();
116a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void null_char();
117a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void insert();
118a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void replace();
119a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void resize();
120a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void short_string();
121a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void find();
122a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void bogus_edge_find();
123a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void rfind();
124a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void find_last_of();
125a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void find_last_not_of();
126a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void copy();
127a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void assign();
128a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void mt();
129a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void short_string_optim_bug();
130a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void compare();
131a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void template_expression();
132a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void te_tmp();
133a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void oper_tmp();
134a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void template_wexpression();
135a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void io();
136a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void allocator_with_state();
137a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void capacity();
138a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  void concat24();
139a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
140a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  static string func(const string& par) {
141a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string tmp( par );
142a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    return tmp;
143a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
144a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
145a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (USE_PTHREAD_API) || defined (USE_WINDOWS_API)
146a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (USE_PTHREAD_API)
147a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  static void* f(void*)
148a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  else
149a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  static DWORD __stdcall f(void*)
150a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
151a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
152a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "qyweyuewunfkHBUKGYUGL,wehbYGUW^(@T@H!BALWD:h^&@#*@(#:JKHWJ:CND" );
153a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
154a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    for ( int i = 0; i < 2000000; ++i ) {
155a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      string sx = func( s );
156a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
157a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
158a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    return 0;
159a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
160a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
161a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
162a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
163a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
164a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' TurnerCPPUNIT_TEST_SUITE_REGISTRATION(StringTest);
165a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
166a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
167a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner// tests implementation
168a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner//
169a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::constructor()
170a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
171a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
172a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  try {
173a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s((size_t)-1, 'a');
174a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
175a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
176a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch (length_error const&) {
177a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
178a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch (...) {
179a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Expected exception is length_error:
180a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
181a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
182a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
183a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
184a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
185a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::trivial_char_compare()
186a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
187a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s( "message" );
188a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
189a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s == "message" );
190a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( "message" == s );
191a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
192a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
193a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::reserve()
194a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
195a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s;
196a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
197a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  try {
198a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    s.reserve(s.max_size() + 1);
199a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
200a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
201a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch (length_error const&) {
202a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
203a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch (...) {
204a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Expected exception is length_error:
205a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
206a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
207a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
208a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
209a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
210a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::mt()
211a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
212a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (USE_PTHREAD_API) || defined (USE_WINDOWS_API)
213a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  const int nth = 2;
214a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (USE_PTHREAD_API)
215a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  pthread_t t[nth];
216a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
217a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for ( int i = 0; i < nth; ++i ) {
218a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    pthread_create( &t[i], 0, f, 0 );
219a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
220a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
221a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for ( int i = 0; i < nth; ++i ) {
222a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    pthread_join( t[i], 0 );
223a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
224a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif // PTHREAD
225a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
226a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if defined (USE_WINDOWS_API)
227a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //DWORD start = GetTickCount();
228a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
229a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  HANDLE t[nth];
230a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
231a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  int i; // VC6 not support in-loop scope of cycle var
232a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for ( i = 0; i < nth; ++i ) {
233a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    t[i] = CreateThread(NULL, 0, f, 0, 0, NULL);
234a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
235a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
236a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  if (WaitForMultipleObjects(nth, t, TRUE, INFINITE) == WAIT_FAILED) {
237a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    // On some platforms (evc3/evc4) WaitForMultipleObjects() with fWaitAll == TRUE
238a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    // is not supported. We then wait with a loop on each thread:
239a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    for ( i = 0; i < nth; ++i ) {
240a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      WaitForSingleObject(t[i], INFINITE);
241a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
242a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
243a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
244a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /*
245a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  DWORD duration = GetTickCount() - start;
246a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  ostringstream ostr;
247a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  ostr << "Duration: " << duration << endl;
248a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_MESSAGE(ostr.str().c_str());
249a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  */
250a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
251a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
252a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
253a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
254a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::short_string()
255a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
256a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string const ref_short_str1("str1"), ref_short_str2("str2");
257a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string short_str1(ref_short_str1), short_str2(ref_short_str2);
258a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string const ref_long_str1("str                                                  1");
259a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string const ref_long_str2("str                                                  2");
260a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string long_str1(ref_long_str1), long_str2(ref_long_str2);
261a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
262a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT(short_str1 == ref_short_str1);
263a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT(long_str1 == ref_long_str1);
264a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
265a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
266a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string str1(short_str1);
267a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1 = long_str1;
268a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT(str1 == ref_long_str1);
269a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
270a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
271a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
272a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string str1(long_str1);
273a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1 = short_str1;
274a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT(str1 == ref_short_str1);
275a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
276a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
277a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
278a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    short_str1.swap(short_str2);
279a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT((short_str1 == ref_short_str2) && (short_str2 == ref_short_str1));
280a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    short_str1.swap(short_str2);
281a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
282a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
283a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
284a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    long_str1.swap(long_str2);
285a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT((long_str1 == ref_long_str2) && (long_str2 == ref_long_str1));
286a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    long_str1.swap(long_str2);
287a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
288a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
289a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
290a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    short_str1.swap(long_str1);
291a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT((short_str1 == ref_long_str1) && (long_str1 == ref_short_str1));
292a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    short_str1.swap(long_str1);
293a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
294a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
295a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
296a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    long_str1.swap(short_str1);
297a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT((short_str1 == ref_long_str1) && (long_str1 == ref_short_str1));
298a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    long_str1.swap(short_str1);
299a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
300a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
301a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
302a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string a(256, 'a');
303a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string b(256, 'b');
304a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    const char* as = a.c_str();
305a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    const char* bs = b.c_str();
306a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    swap(a, b);
307a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( a.c_str() == bs );
308a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( b.c_str() == as );
309a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
310a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
311a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
312a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //This is to test move constructor
313a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    vector<string> str_vect;
314a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str_vect.push_back(short_str1);
315a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str_vect.push_back(long_str1);
316a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str_vect.push_back(short_str2);
317a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str_vect.push_back(long_str2);
318a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT((str_vect[0] == ref_short_str1) &&
319a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner                   (str_vect[1] == ref_long_str1) &&
320a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner                   (str_vect[2] == ref_short_str2) &&
321a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner                   (str_vect[3] == ref_long_str2));
322a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
323a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
324a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
325a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::erase()
326a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
327a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char const* c_str = "Hello, World!";
328a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str(c_str);
329a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == c_str );
330a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
331a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.erase(str.begin() + 1, str.end() - 1); // Erase all but first and last.
332a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
333a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  size_t i;
334a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for (i = 0; i < str.size(); ++i) {
335a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    switch ( i ) {
336a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      case 0:
337a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        CPPUNIT_ASSERT( str[i] == 'H' );
338a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        break;
339a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      case 1:
340a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        CPPUNIT_ASSERT( str[i] == '!' );
341a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        break;
342a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      default:
343a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        CPPUNIT_FAIL;
344a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
345a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
346a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
347a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(1, c_str);
348a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.erase(str.begin()); // Erase first element.
349a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.erase(str.end() - 1); // Erase last element.
350a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == c_str );
351a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.clear(); // Erase all.
352a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str.empty() );
353a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
354a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = c_str;
355a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == c_str );
356a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
357a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.erase(1, str.size() - 1); // Erase all but first and last.
358a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for (i = 0; i < str.size(); i++) {
359a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    switch ( i ) {
360a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      case 0:
361a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        CPPUNIT_ASSERT( str[i] == 'H' );
362a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        break;
363a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      case 1:
364a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        CPPUNIT_ASSERT( str[i] == '!' );
365a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        break;
366a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      default:
367a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        CPPUNIT_FAIL;
368a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
369a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
370a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
371a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.erase(1);
372a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "H" );
373a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
374a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
375a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::data()
376a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
377a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string xx;
378a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
379a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( xx.data() != 0 );  // ISO-IEC-14882:1998(E), 21.3.6, paragraph 3
380a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if 0
381a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /* This test really not required: in ISO-IEC-14882:1998(E) paragraph 3 stated:
382a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * '... and can have zero added to it', again: 'CAN', but not 'MUST'.
383a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * That's why I am comment this test. But I don't remove it due to I had
384a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * unevident problem with misinterpretation of data() return (i.e. data()
385a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * and c_str() provide different functionality!) and expect that this is
386a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * more-or-less common pitfall.
387a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *    - ptr
388a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   */
389a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string low( "2004-01-01" );
390a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // Blocks A and B should follow each other.
391a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // Block A:
392a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx = "123456";
393a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx += low;
394a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  if ( strcmp( xx.data(), "1234562004-01-01" ) != 0 ) {
395a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    return -1;
396a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
397a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // End of block A
398a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
399a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // Block B:
400a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx = "1234";
401a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx += ";";
402a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
403a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  if ( strcmp( xx.data(), "1234;" ) != 0 ) {
404a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    return -1;
405a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
406a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // End of block B
407a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
408a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
409a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
410a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::c_str()
411a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
412a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string low( "2004-01-01" );
413a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string xx;
414a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string yy;
415a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
416a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *(yy.c_str()) == '\0' ); // ISO-IEC-14882:1998(E), 21.3.6, paragraph 1
417a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
418a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // Blocks A and B should follow each other.
419a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // Block A:
420a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx = "123456";
421a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx += low;
422a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( strcmp( xx.c_str(), "1234562004-01-01" ) == 0 );
423a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // End of block A
424a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
425a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // Block B:
426a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx = "1234";
427a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  xx += ";";
428a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( strcmp( xx.c_str(), "1234;" ) == 0 );
429a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // End of block B
430a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
431a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
432a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::null_char()
433a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
434a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // ISO/IEC 14882:1998(E), ISO/IEC 14882:2003(E), 21.3.4 ('... the const version')
435a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  const string s( "123456" );
436a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
437a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s[s.size()] == '\0' );
438a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
439a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
440a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  try {
441a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Check is only here to avoid warning about value of expression not used
442a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( s.at(s.size()) == '\0' );
443a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
444a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
445a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch (out_of_range const&) {
446a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( true );
447a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
448a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch ( ... ) {
449a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
450a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
451a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
452a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
453a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
454a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::insert()
455a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
456a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string strorg = "This is test string for string calls";
457a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str;
458a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /*
459a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * In case of reallocation there is no auto reference problem
460a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * so we reserve a big enough string to be sure to test this
461a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * particular point.
462a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   */
463a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.reserve(100);
464a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
465a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
466a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //test self insertion:
467a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(10, str.c_str() + 5, 15);
468a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "This is teis test string st string for string calls" );
469a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
470a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
471a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(15, str.c_str() + 5, 25);
472a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "This is test stis test string for stringring for string calls" );
473a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
474a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
475a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(0, str.c_str() + str.size() - 4, 4);
476a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "allsThis is test string for string calls" );
477a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
478a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
479a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(0, str.c_str() + str.size() / 2 - 1, str.size() / 2 + 1);
480a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "ng for string callsThis is test string for string calls" );
481a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
482a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
483a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::iterator b = str.begin();
484a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::const_iterator s = str.begin() + str.size() / 2 - 1;
485a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::const_iterator e = str.end();
486a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert( b, s, e );
487a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "ng for string callsThis is test string for string calls" );
488a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
489a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
490a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(str.begin(), str.begin() + str.size() / 2 - 1, str.end());
491a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "ng for string callsThis is test string for string calls" );
492a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
493a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#ifdef _STLP_MEMBER_TEMPLATES
494a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  vector<int> int_vect;
495a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //Just a compile time test:
496a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.insert(str.end(), int_vect.begin(), int_vect.end());
497a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
498a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
499a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str0;
500a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str0.insert(str0.begin(), 5, '0');
501a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str0 == "00000" );
502a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
503a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str1;
504a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
505a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type pos = 0, nb = 2;
506a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1.insert(pos, nb, '1');
507a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
508a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1 == "11" );
509a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
510a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str0.insert(0, str1);
511a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str0 == "1100000" );
512a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
513a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str2("2345");
514a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str0.insert(str0.size(), str2, 1, 2);
515a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str0 == "110000034" );
516a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
517a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str1.insert(str1.begin() + 1, 2, '2');
518a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1 == "1221" );
519a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
520a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str1.insert(2, "333333", 3);
521a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1 == "1233321" );
522a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
523a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str1.insert(4, "4444");
524a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1 == "12334444321" );
525a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
526a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str1.insert(str1.begin() + 6, '5');
527a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1 == "123344544321" );
528a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
529a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
530a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::replace()
531a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
532a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /*
533a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * This test case is for the non template basic_string::replace method,
534a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * this is why we play with the const iterators and reference to guaranty
535a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * that the right method is called.
536a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   */
537a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  const string v( "78" );
538a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s( "123456" );
539a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string const& cs = s;
540a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
541a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::iterator i = s.begin() + 1;
542a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(i, i + 3, v.begin(), v.end());
543a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "17856" );
544a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
545a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
546a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  i = s.begin() + 1;
547a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(i, i + 1, v.begin(), v.end());
548a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "1783456" );
549a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
550a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
551a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  i = s.begin() + 1;
552a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::const_iterator ci = s.begin() + 1;
553a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(i, i + 3, ci + 3, cs.end());
554a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "15656" );
555a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
556a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
557a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  i = s.begin() + 1;
558a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  ci = s.begin() + 1;
559a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(i, i + 3, ci, ci + 2);
560a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "12356" );
561a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
562a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
563a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  i = s.begin() + 1;
564a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  ci = s.begin() + 1;
565a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(i, i + 3, ci + 1, cs.end());
566a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "1345656" );
567a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
568a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
569a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  i = s.begin();
570a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  ci = s.begin() + 1;
571a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(i, i, ci, ci + 1);
572a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s == "2123456" );
573a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
574a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
575a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(s.begin() + 4, s.end(), cs.begin(), cs.end());
576a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "1234123456" );
577a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
578a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /*
579a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * This is the test for the template replace method.
580a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   */
581a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
582a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::iterator b = s.begin() + 4;
583a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::iterator e = s.end();
584a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::const_iterator rb = s.begin();
585a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::const_iterator re = s.end();
586a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(b, e, rb, re);
587a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "1234123456" );
588a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
589a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "123456";
590a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.replace(s.begin() + 4, s.end(), s.begin(), s.end());
591a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "1234123456" );
592a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
593a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string strorg("This is test string for string calls");
594a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str = strorg;
595a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.replace(5, 15, str.c_str(), 10);
596a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "This This is tefor string calls" );
597a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
598a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str = strorg;
599a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.replace(5, 5, str.c_str(), 10);
600a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "This This is test string for string calls" );
601a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
602a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if (defined (STLPORT) && defined(_STLP_MEMBER_TEMPLATES)) || ( !defined (STLPORT) && !defined(__GNUC__) )
603a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  deque<char> cdeque;
604a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  cdeque.push_back('I');
605a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str.replace(str.begin(), str.begin() + 11, cdeque.begin(), cdeque.end());
606a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str == "Is test string for string calls" );
607a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
608a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
609a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
610a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::resize()
611a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
612a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s;
613a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
614a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.resize(0);
615a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
616a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *s.c_str() == 0 );
617a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
618a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "1234567";
619a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
620a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.resize(0);
621a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *s.c_str() == 0 );
622a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
623a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "1234567";
624a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.resize(1);
625a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.size() == 1 );
626a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *s.c_str() == '1' );
627a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( *(s.c_str() + 1) == 0 );
628a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
629a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s = "1234567";
630a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.resize(10);
631a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.size() == 10 );
632a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s[6] == '7' );
633a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s[7] == 0 );
634a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s[8] == 0 );
635a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s[9] == 0 );
636a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
637a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
638a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::find()
639a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
640a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s("one two three one two three");
641a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find("one") == 0 );
642a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find('t') == 4 );
643a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find('t', 5) == 8 );
644a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //We are trying to get a const reference to the npos string static member to
645a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //force the compiler to allocate memory for this variable. It is used to reveal
646a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //a bug of STLport which was simply declaring npos without instanciating it.
647a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if defined (STLPORT) && defined (_STLP_STATIC_CONST_INIT_BUG)
648a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string::size_type const& npos_local = string::npos;
649a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#else
650a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  define npos_local string::npos
651a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
652a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find("four") == npos_local );
653a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find("one", string::npos) == npos_local );
654a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
655a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find_first_of("abcde") == 2 );
656a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
657a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find_first_not_of("enotw ") == 9 );
658a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
659a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string empty;
660a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.substr(s.find(empty), empty.size()) == empty );
661a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
662a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
663a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::bogus_edge_find()
664a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
665a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /* ISO/IEC 14882 2003, 21.3.6.1 basic_string::find [lib.string::find]
666a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *
667a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * size_type find(const basic_string<charT,traits,Allocator>& str,
668a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *                size_type pos = 0) const;
669a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * Effects: Determines the lowest position xpos, if possible, such that
670a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * both of the following conditions obtain:
671a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *    pos <= xpos and xpos + str.size() <= size();
672a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *    at(xpos+I) == str.at(I) for all elements I of the string controlled by str.
673a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * Returns: xpos if the function can determine such a value for xpos. Otherwise,
674a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * returns npos.
675a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * Notes: Uses traits::eq().
676a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *
677a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * ===
678a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * So, from formal point of view
679a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *   string s; string::size_type p = s.find( "", 0, 0 );
680a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * should return 0 in p, i.e. position out-of-bound of string, so
681a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * code like following is bad:
682a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * string s;
683a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *
684a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * string::size_type p = s.find( "", 0, 0 );
685a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *
686a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * ...
687a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *
688a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * if ( p != string::npos ) { // normal
689a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *   char ch = s[p]; // Arghhhhhhhhhh
690a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * }
691a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   *
692a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * People near Standard commete has opinion opposite to my. Even if it looks
693a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   * like bogus behaviour for me, it should be fixed.
694a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   */
695a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
696a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
697a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s;
698a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.find( "", 0, 0 );
699a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
700a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    /* CPPUNIT_CHECK( p == string::npos ); */
701a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 0 ); // bogus result, isn't it?
702a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
703a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
704a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "123" );
705a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.find( "", 0, 0 );
706a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
707a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 0 );
708a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
709a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
710a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "123" );
711a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.find( "", 1, 0 );
712a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
713a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 1 );
714a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
715a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
716a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "" );
717a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.find( "", 1, 0 );
718a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
719a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == string::npos );
720a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
721a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
722a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "123" );
723a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.find( "", 3, 0 );
724a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
725a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 3 ); // bogus result, isn't it?
726a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
727a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
728a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s;
729a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.rfind( "", 0, 0 );
730a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
731a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    /* CPPUNIT_CHECK( p == string::npos ); */
732a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 0 ); // bogus result, isn't it?
733a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
734a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
735a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "123" );
736a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.rfind( "", 0, 0 );
737a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
738a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 0 );
739a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
740a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
741a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "123" );
742a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.rfind( "", 1, 0 );
743a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
744a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 1 );
745a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
746a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
747a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "" );
748a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.rfind( "", 1, 0 );
749a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
750a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 0 ); // bogus result, isn't it?
751a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
752a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
753a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s( "123" );
754a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::size_type p = s.rfind( "", 3, 0 );
755a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
756a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( p == 3 ); // bogus result, isn't it?
757a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
758a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
759a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
760a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::rfind()
761a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
762a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // 21.3.6.2
763a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s("one two three one two three");
764a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
765a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.rfind("two") == 18 );
766a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.rfind("two", 0) == string::npos );
767a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.rfind("two", 11) == 4 );
768a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.rfind('w') == 19 );
769a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
770a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string test( "aba" );
771a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
772a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.rfind( "a", 2, 1 ) == 2 );
773a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.rfind( "a", 1, 1 ) == 0 );
774a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.rfind( "a", 0, 1 ) == 0 );
775a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
776a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.rfind( 'a', 2 ) == 2 );
777a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.rfind( 'a', 1 ) == 0 );
778a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.rfind( 'a', 0 ) == 0 );
779a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
780a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
781a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::find_last_of()
782a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
783a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // 21.3.6.4
784a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s("one two three one two three");
785a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
786a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find_last_of("abcde") == 26 );
787a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
788a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string test( "aba" );
789a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
790a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( "a", 2, 1 ) == 2 );
791a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( "a", 1, 1 ) == 0 );
792a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( "a", 0, 1 ) == 0 );
793a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
794a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( 'a', 2 ) == 2 );
795a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( 'a', 1 ) == 0 );
796a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_of( 'a', 0 ) == 0 );
797a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
798a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
799a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::find_last_not_of()
800a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
801a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // 21.3.6.6
802a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s("one two three one two three");
803a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
804a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s.find_last_not_of("ehortw ") == 15 );
805a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
806a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string test( "aba" );
807a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
808a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "a", 2, 1 ) == 1 );
809a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "b", 2, 1 ) == 2 );
810a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "a", 1, 1 ) == 1 );
811a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "b", 1, 1 ) == 0 );
812a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "a", 0, 1 ) == string::npos );
813a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( "b", 0, 1 ) == 0 );
814a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
815a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'a', 2 ) == 1 );
816a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'b', 2 ) == 2 );
817a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'a', 1 ) == 1 );
818a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'b', 1 ) == 0 );
819a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'a', 0 ) == string::npos );
820a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( test.find_last_not_of( 'b', 0 ) == 0 );
821a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
822a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
823a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::copy()
824a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
825a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s("foo");
826a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char dest[4];
827a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dest[0] = dest[1] = dest[2] = dest[3] = 1;
828a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.copy(dest, 4);
829a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  int pos = 0;
830a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'f' );
831a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'o' );
832a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'o' );
833a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 1 );
834a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
835a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  dest[0] = dest[1] = dest[2] = dest[3] = 1;
836a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.copy(dest, 4, 2);
837a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  pos = 0;
838a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 'o' );
839a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( dest[pos++] == 1 );
840a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
841a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
842a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  try {
843a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    s.copy(dest, 4, 5);
844a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
845a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
846a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch (out_of_range const&) {
847a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
848a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  catch ( ... ) {
849a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_FAIL;
850a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
851a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
852a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
853a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
854a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::assign()
855a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
856a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s;
857a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char const* cstr = "test string for assign";
858a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
859a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.assign(cstr, cstr + 22);
860a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == "test string for assign" );
861a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
862a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s2("other test string");
863a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  s.assign(s2);
864a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( s == s2 );
865a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
866a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  static string str1;
867a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  static string str2;
868a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
869a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // short string optim:
870a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str1 = "123456";
871a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // longer than short string:
872a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "1234567890123456789012345678901234567890";
873a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
874a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT(str1[5] == '6');
875a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT(str2[29] == '0');
876a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
877a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
878a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner/* This test is to check if string properly supports the short string
879a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * optimization. It has been found out that eMbedded Visual C++ 3.0 and .NET
880a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * compilers for the ARM platform fail to pass structs and classes of certain
881a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * size per value. This seems to be a known compiler bug. For other processors
882a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * (e.g. x86) the error doesn't occur.
883a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * (The ARM compiler creates a temporary object from teststr on the stack, to
884a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * pass it to the helper function. It uses the copy constructor for this.
885a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * After this the temporary object is copied to another place on the stack.
886a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * The result is that the _M_finish pointer then points to the wrong buffer
887a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner * end and the size of the short string is incorrectly calculated.)
888a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner */
889a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::short_string_optim_bug()
890a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
891a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   string teststr("shortest");
892a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
893a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   bool short_string_optim_bug_helper(string teststr);
894a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
895a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   CPPUNIT_ASSERT(true == short_string_optim_bug_helper(teststr));
896a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
897a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
898a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerbool short_string_optim_bug_helper(string teststr)
899a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
900a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   size_t ss = teststr.size();
901a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner   return (ss == 8);
902a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
903a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
904a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::compare()
905a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
906a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str1("abcdef");
907a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str2;
908a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
909a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "abcdef";
910a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(str2) == 0 );
911a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "abcde";
912a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(str2) > 0 );
913a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "abcdefg";
914a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(str2) < 0 );
915a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
916a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare("abcdef") == 0 );
917a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare("abcde") > 0 );
918a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare("abcdefg") < 0 );
919a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
920a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "cde";
921a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2) == 0 );
922a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "cd";
923a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2) > 0 );
924a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "cdef";
925a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2) < 0 );
926a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
927a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  str2 = "abcdef";
928a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2, 2, 3) == 0 );
929a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2, 2, 2) > 0 );
930a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, str2, 2, 4) < 0 );
931a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
932a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, "cdefgh", 3) == 0 );
933a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, "cdefgh", 2) > 0 );
934a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( str1.compare(2, 3, "cdefgh", 4) < 0 );
935a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
936a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
937a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner/*
938a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass mystring : public string {
939a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerpublic:
940a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  mystring() {}
941a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  mystring(string const& s) : string(s) {}
942a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
943a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  mystring& operator = (string const& s) {
944a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string::operator = (s);
945a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    return *this;
946a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  };
947a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
948a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner*/
949a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
950a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::template_expression()
951a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
952a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string one("one"), two("two"), three("three");
953a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string space(1, ' ');
954a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
955a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  // check availability of [un]equality operators
956a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
957a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // string-string
958a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      one == two;
959a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      one != two;
960a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // string-literal
961a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      one == "two";
962a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      one != "two";
963a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // literal-string
964a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      "one" == two;
965a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      "one" != two;
966a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // strsum-string
967a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      (one + two) == three;
968a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      (one + two) != three;
969a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // string-strsum
970a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      one == (two + three);
971a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      one != (two + three);
972a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // strsum-literal
973a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      (one + two) == "three";
974a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      (one + two) != "three";
975a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // literal-strsum
976a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      "one" == (two + three);
977a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      "one" != (two + three);
978a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      // strsum-strsum
979a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      (one + two) == (two + three);
980a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      (one + two) != (two + three);
981a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
982a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
983a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
984a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string result(one + ' ' + two + ' ' + three);
985a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
986a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
987a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
988a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
989a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string result(one + ' ' + two + ' ' + three, 4);
990a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "two three" );
991a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
992a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
993a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
994a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string result(one + ' ' + two + ' ' + three, 4, 3);
995a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "two" );
996a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
997a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
998a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //2 members expressions:
999a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (' ' + one) == " one" );
1000a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + ' ') == "one " );
1001a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + " two") == "one two" );
1002a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ("one " + two) == "one two" );
1003a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + space) == "one " );
1004a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1005a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //3 members expressions:
1006a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + "two") == "one two" );
1007a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ("one" + (space + two)) == "one two" );
1008a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + two) == "one two" );
1009a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + (space + two)) == "one two" );
1010a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + 't') == "one t" );
1011a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ('o' + (space + two)) == "o two" );
1012a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1013a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //4 members expressions:
1014a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + (two + space)) == "one two " );
1015a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1016a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //special operators
1017a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1018a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string result;
1019a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result = one + space + two;
1020a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two" );
1021a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1022a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result += space + three;
1023a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
1024a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1025a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1026a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //special append method
1027a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1028a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string result;
1029a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
1030a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.reserve(64);
1031a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1032a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(one + space + two);
1033a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two" );
1034a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1035a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(space + result + space + three);
1036a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two one two three" );
1037a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1038a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result = "one two";
1039a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(space + three, 1, 2);
1040a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( result == "one twoth" );
1041a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1042a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(space + result);
1043a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one twoth one twoth" );
1044a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1045a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1046a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //special assign method
1047a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1048a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string result;
1049a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
1050a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.reserve(64);
1051a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1052a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.assign(one + space + two + space + three);
1053a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
1054a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1055a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.assign(one + space + two + space + three, 3, 5);
1056a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == " two " );
1057a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1058a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.assign(one + result + three);
1059a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == "one two three" );
1060a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1061a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1062a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1063a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( !(one + ' ' + two).empty() );
1064a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1065a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    char result = (one + ' ' + two)[3];
1066a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == ' ' );
1067a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1068a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result = (one + ' ' + two).at(3);
1069a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == ' ' );
1070a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1071a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
1072a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    try {
1073a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      result = (one + ' ' + two).at(10);
1074a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_FAIL;
1075a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
1076a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    catch (out_of_range const&) {
1077a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_ASSERT( result == ' ' );
1078a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
1079a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    catch (...) {
1080a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_FAIL;
1081a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
1082a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1083a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1084a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1085a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  /*
1086a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  mystring a("ing");
1087a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //gcc failed to compile following expression when template expressions are activated.
1088a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //MSVC sees no problem. gcc limitation or MSVC is too cool ??
1089a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  mystring b = "str" + a;
1090a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  */
1091a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1092a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1093a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (TE_TMP_TEST_IGNORED)
1094a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass superstring
1095a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1096a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  public:
1097a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    superstring() :
1098a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      s("super")
1099a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    {}
1100a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1101a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    superstring( const string& str ) :
1102a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      s( str )
1103a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    {}
1104a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1105a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  superstring operator / (const string& str )
1106a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    { return superstring( s + "/" + str ); }
1107a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1108a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  superstring operator / (const char* str )
1109a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    { return superstring( s + "/" + str ); }
1110a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1111a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  private:
1112a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string s;
1113a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
1114a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1115a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1116a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::te_tmp()
1117a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1118a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (TE_TMP_TEST_IGNORED)
1119a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  superstring s;
1120a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string more( "more" );
1121a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string less( "less" );
1122a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1123a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  superstring r = s / (more + less);
1124a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1125a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1126a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1127a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerclass mypath
1128a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1129a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  public:
1130a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    mypath( const string& s ) :
1131a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner        p( s )
1132a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      { }
1133a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1134a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    const mypath& operator / ( const string& );
1135a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    const string& str() const
1136a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      { return p; }
1137a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1138a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  private:
1139a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string p;
1140a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner};
1141a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1142a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnerconst mypath& mypath::operator /( const string& s )
1143a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1144a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  p += '/';
1145a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  p += s;
1146a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  return *this;
1147a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1148a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1149a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::oper_tmp()
1150a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1151a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s1( "path1" );
1152a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s2( ".ext" );
1153a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1154a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string& rs1 = s1;
1155a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string& rs2 = s2;
1156a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1157a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (mypath( string( "/root" ) ) / (rs1 + rs2)).str() == "/root/path1.ext" );
1158a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1159a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1160a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::template_wexpression()
1161a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1162a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T)
1163a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  if !defined (__CYGWIN__) || defined (STLPORT)
1164a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  wstring one(L"one"), two(L"two"), three(L"three");
1165a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  wstring space(L" ");
1166a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1167a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1168a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wstring result(one + L' ' + two + L' ' + three);
1169a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
1170a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1171a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1172a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1173a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wstring result(one + L' ' + two + L' ' + three, 4);
1174a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"two three" );
1175a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1176a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1177a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1178a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wstring result(one + L' ' + two + L' ' + three, 4, 3);
1179a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"two" );
1180a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1181a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1182a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //2 members expressions:
1183a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (L' ' + one) == L" one" );
1184a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + L' ') == L"one " );
1185a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + L" two") == L"one two" );
1186a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (L"one " + two) == L"one two" );
1187a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + space) == L"one " );
1188a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1189a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //3 members expressions:
1190a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + L"two") == L"one two" );
1191a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (L"one" + (space + two)) == L"one two" );
1192a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + two) == L"one two" );
1193a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (one + (space + two)) == L"one two" );
1194a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + L't') == L"one t" );
1195a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( (L'o' + (space + two)) == L"o two" );
1196a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1197a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //4 members expressions:
1198a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( ((one + space) + (two + space)) == L"one two " );
1199a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1200a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //special operators
1201a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1202a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wstring result;
1203a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result = one + space + two;
1204a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two" );
1205a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1206a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result += space + three;
1207a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
1208a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1209a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1210a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //special append method
1211a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1212a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wstring result;
1213a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
1214a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.reserve(64);
1215a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1216a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(one + space + two);
1217a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two" );
1218a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1219a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(space + result + space + three);
1220a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two one two three" );
1221a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1222a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result = L"one two";
1223a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(space + three, 1, 2);
1224a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( result == L"one twoth" );
1225a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1226a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.append(space + result);
1227a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one twoth one twoth" );
1228a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1229a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1230a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  //special assign method
1231a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1232a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wstring result;
1233a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    //Use reserve to avoid reallocation and really test auto-referencing problems:
1234a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.reserve(64);
1235a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1236a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.assign(one + space + two + space + three);
1237a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
1238a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1239a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.assign(one + space + two + space + three, 3, 5);
1240a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L" two " );
1241a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1242a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result.assign(one + result + three);
1243a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L"one two three" );
1244a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1245a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1246a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1247a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( !(one + L' ' + two).empty() );
1248a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1249a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    wchar_t result = (one + L' ' + two)[3];
1250a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L' ' );
1251a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1252a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    result = (one + L' ' + two).at(3);
1253a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( result == L' ' );
1254a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1255a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#    if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
1256a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    try {
1257a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      result = (one + L' ' + two).at(10);
1258a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_FAIL;
1259a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
1260a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    catch (out_of_range const&) {
1261a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_ASSERT( result == L' ' );
1262a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
1263a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    catch (...) {
1264a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner      CPPUNIT_FAIL;
1265a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    }
1266a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#    endif
1267a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1268a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  endif
1269a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1270a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1271a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1272a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::io()
1273a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1274a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
1275a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string str("STLport");
1276a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1277a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    ostringstream ostr;
1278a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    ostr << str;
1279a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( ostr.good() );
1280a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( ostr.str() == str );
1281a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1282a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1283a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    istringstream istr(str);
1284a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string istr_content;
1285a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    istr >> istr_content;
1286a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( !istr.fail() && istr.eof() );
1287a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( istr_content == str );
1288a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1289a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1290a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    istringstream istr(str);
1291a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    istr.width(3);
1292a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    string istr_content;
1293a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    istr >> istr_content;
1294a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( !istr.fail() && !istr.eof() );
1295a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( istr_content == "STL" );
1296a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1297a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1298a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1299a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1300a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::allocator_with_state()
1301a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1302a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#if !(defined (STLPORT) && defined (_STLP_NO_CUSTOM_IO))
1303a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1304a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char buf1[1024];
1305a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  StackAllocator<char> stack1(buf1, buf1 + sizeof(buf1));
1306a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1307a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  char buf2[1024];
1308a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  StackAllocator<char> stack2(buf2, buf2 + sizeof(buf2));
1309a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1310a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  typedef basic_string<char, char_traits<char>, StackAllocator<char> > StackString;
1311a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1312a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1("string stack1", stack1);
1313a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1Cpy(str1);
1314a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1315a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2("string stack2", stack2);
1316a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2Cpy(str2);
1317a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1318a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1.swap(str2);
1319a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1320a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
1321a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
1322a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1323a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
1324a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
1325a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
1326a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
1327a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1328a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
1329a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
1330a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  stack1.reset(); stack2.reset();
1331a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1332a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1333a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1("longer string from stack1 allocator instance for dynamic allocation", stack1);
1334a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1Cpy(str1);
1335a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1336a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2("longer string from stack2 allocator instance for dynamic allocation", stack2);
1337a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2Cpy(str2);
1338a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1339a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1.swap(str2);
1340a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1341a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
1342a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
1343a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1344a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
1345a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
1346a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
1347a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
1348a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1349a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
1350a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
1351a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  stack1.reset(); stack2.reset();
1352a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1353a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1354a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1355a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1("string stack1", stack1);
1356a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1Cpy(str1);
1357a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1358a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2("longer string from stack2 allocator instance for dynamic allocation", stack2);
1359a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2Cpy(str2);
1360a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1361a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1.swap(str2);
1362a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1363a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
1364a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
1365a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1366a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
1367a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
1368a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
1369a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
1370a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1371a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
1372a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
1373a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  stack1.reset(); stack2.reset();
1374a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1375a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1376a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  {
1377a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1("longer string from stack1 allocator instance for dynamic allocation", stack1);
1378a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str1Cpy(str1);
1379a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1380a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2("string stack2", stack2);
1381a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    StackString str2Cpy(str2);
1382a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1383a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    str1.swap(str2);
1384a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1385a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator().swaped() );
1386a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator().swaped() );
1387a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1388a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1 == str2Cpy );
1389a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2 == str1Cpy );
1390a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str1.get_allocator() == stack2 );
1391a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_ASSERT( str2.get_allocator() == stack1 );
1392a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1393a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack1.ok() );
1394a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_ASSERT( stack2.ok() );
1395a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  stack1.reset(); stack2.reset();
1396a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1397a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1398a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1399a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::capacity()
1400a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1401a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s;
1402a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1403a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s.capacity() > 0 );
1404a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s.capacity() < s.max_size() );
1405a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s.capacity() >= s.size() );
1406a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1407a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#ifndef _STLP_SHORT_STRING_SZ
1408a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#  define _STLP_SHORT_STRING_SZ 16 // see stlport/stl/_string_base.h
1409a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner#endif
1410a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1411a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  for ( int i = 0; i < _STLP_SHORT_STRING_SZ + 2; ++i ) {
1412a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    s += ' ';
1413a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( s.capacity() > 0 );
1414a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( s.capacity() < s.max_size() );
1415a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner    CPPUNIT_CHECK( s.capacity() >= s.size() );
1416a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  }
1417a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1418a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1419a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turnervoid StringTest::concat24()
1420a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner{
1421a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  string s = string( "123456789012345678901234" ) + string( "123456789012345678901234" );
1422a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner
1423a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s.length() == 48 );
1424a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s[23] == '4' );
1425a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s[24] == '1' );
1426a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner  CPPUNIT_CHECK( s[47] == '4' );
1427a9225dc81bae267b3454f3676a9108ecb4c9264fDavid 'Digit' Turner}
1428