stdstrings.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. //////////////////////////////////////////////////////////////////////////////
  2. // Name: tests/strings/stdstrings.cpp
  3. // Purpose: wxString unit test
  4. // Author: Vadim Zeitlin, Wlodzimierz ABX Skiba
  5. // Created: 2004-05-07
  6. // Copyright: (c) 2004 Vadim Zeitlin, Wlodzimierz Skiba
  7. ///////////////////////////////////////////////////////////////////////////////
  8. // ----------------------------------------------------------------------------
  9. // headers
  10. // ----------------------------------------------------------------------------
  11. #include "testprec.h"
  12. #ifdef __BORLANDC__
  13. #pragma hdrstop
  14. #endif
  15. #ifndef WX_PRECOMP
  16. #include "wx/wx.h"
  17. #endif // WX_PRECOMP
  18. // ----------------------------------------------------------------------------
  19. // test class
  20. // ----------------------------------------------------------------------------
  21. class StdStringTestCase : public CppUnit::TestCase
  22. {
  23. public:
  24. StdStringTestCase();
  25. private:
  26. CPPUNIT_TEST_SUITE( StdStringTestCase );
  27. CPPUNIT_TEST( StdConstructors );
  28. CPPUNIT_TEST( StdIterators );
  29. CPPUNIT_TEST( StdIteratorsCmp );
  30. CPPUNIT_TEST( StdAppend );
  31. CPPUNIT_TEST( StdAssign );
  32. CPPUNIT_TEST( StdCompare );
  33. CPPUNIT_TEST( StdErase );
  34. CPPUNIT_TEST( StdFind );
  35. CPPUNIT_TEST( StdFindFirst );
  36. CPPUNIT_TEST( StdFindLast );
  37. CPPUNIT_TEST( StdInsert );
  38. CPPUNIT_TEST( StdReplace );
  39. CPPUNIT_TEST( StdRFind );
  40. CPPUNIT_TEST( StdResize );
  41. CPPUNIT_TEST( StdRiter );
  42. CPPUNIT_TEST( StdSubstr );
  43. #if wxUSE_STD_STRING
  44. CPPUNIT_TEST( StdConversion );
  45. #endif
  46. CPPUNIT_TEST_SUITE_END();
  47. void StdConstructors();
  48. void StdIterators();
  49. void StdIteratorsCmp();
  50. void StdAppend();
  51. void StdAssign();
  52. void StdCompare();
  53. void StdErase();
  54. void StdFind();
  55. void StdFindFirst();
  56. void StdFindLast();
  57. void StdInsert();
  58. void StdReplace();
  59. void StdRFind();
  60. void StdResize();
  61. void StdRiter();
  62. void StdSubstr();
  63. #if wxUSE_STD_STRING
  64. void StdConversion();
  65. #endif
  66. DECLARE_NO_COPY_CLASS(StdStringTestCase)
  67. };
  68. // register in the unnamed registry so that these tests are run by default
  69. CPPUNIT_TEST_SUITE_REGISTRATION( StdStringTestCase );
  70. // also include in its own registry so that these tests can be run alone
  71. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( StdStringTestCase, "StdStringTestCase" );
  72. StdStringTestCase::StdStringTestCase()
  73. {
  74. }
  75. void StdStringTestCase::StdConstructors()
  76. {
  77. wxString s1(wxT("abcdefgh")),
  78. s2(wxT("abcdefghijklm"), 8),
  79. s3(wxT("abcdefghijklm")),
  80. s4(8, wxT('a'));
  81. wxString s5(s1),
  82. s6(s3, 0, 8),
  83. s7(s3.begin(), s3.begin() + 8);
  84. wxString s8(s1, 4, 8);
  85. CPPUNIT_ASSERT_EQUAL( wxT("abcdefgh"), s1 );
  86. CPPUNIT_ASSERT_EQUAL( s1, s2 );
  87. CPPUNIT_ASSERT_EQUAL( wxT("aaaaaaaa"), s4 );
  88. CPPUNIT_ASSERT_EQUAL( wxT("abcdefgh"), s5 );
  89. CPPUNIT_ASSERT_EQUAL( s1, s6 );
  90. CPPUNIT_ASSERT_EQUAL( s1, s7 );
  91. CPPUNIT_ASSERT_EQUAL( wxT("efgh"), s8 );
  92. const char *pc = s1.c_str();
  93. CPPUNIT_ASSERT_EQUAL( "bcd", wxString(pc + 1, pc + 4) );
  94. const wchar_t *pw = s2.c_str();
  95. CPPUNIT_ASSERT_EQUAL( "a", wxString(pw, pw + 1) );
  96. }
  97. void StdStringTestCase::StdIterators()
  98. {
  99. // test compilation of default iterators ctors:
  100. wxString::iterator i1;
  101. wxString::const_iterator i2;
  102. wxString::reverse_iterator i3;
  103. wxString::const_reverse_iterator i4;
  104. }
  105. void StdStringTestCase::StdIteratorsCmp()
  106. {
  107. wxString s("foobar");
  108. wxString::iterator i = s.begin();
  109. wxString::const_iterator ci = s.begin();
  110. CPPUNIT_ASSERT( i == ci );
  111. CPPUNIT_ASSERT( i >= ci );
  112. CPPUNIT_ASSERT( i <= ci );
  113. CPPUNIT_ASSERT( ci == i );
  114. CPPUNIT_ASSERT( ci >= i );
  115. CPPUNIT_ASSERT( ci <= i );
  116. ci++;
  117. CPPUNIT_ASSERT( i != ci );
  118. CPPUNIT_ASSERT( i < ci );
  119. CPPUNIT_ASSERT( !(i > ci) );
  120. CPPUNIT_ASSERT( ci != i );
  121. CPPUNIT_ASSERT( ci > i );
  122. CPPUNIT_ASSERT( !(ci < i) );
  123. }
  124. void StdStringTestCase::StdAppend()
  125. {
  126. wxString s1, s2, s3, s4, s5, s6, s7, s8;
  127. s1 = s2 = s3 = s4 = s5 = s6 = wxT("abc");
  128. s1.append(wxT("def"));
  129. s2.append(wxT("defgh"), 3);
  130. s3.append(wxString(wxT("abcdef")), 3, 6);
  131. s4.append(s1);
  132. s5.append(3, wxT('a'));
  133. s5.append(2, 'x');
  134. s5.append(1, (unsigned char)'y');
  135. s6.append(s1.begin() + 3, s1.end());
  136. CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s1 );
  137. CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s2 );
  138. CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s3 );
  139. CPPUNIT_ASSERT_EQUAL( wxT("abcabcdef"), s4 );
  140. CPPUNIT_ASSERT_EQUAL( wxT("abcaaaxxy"), s5 );
  141. CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s6 );
  142. const char *pc = s1.c_str() + 2;
  143. s7.append(pc, pc + 4);
  144. CPPUNIT_ASSERT_EQUAL( "cdef", s7 );
  145. const wchar_t *pw = s2.c_str() + 2;
  146. s8.append(pw, pw + 4);
  147. CPPUNIT_ASSERT_EQUAL( "cdef", s8 );
  148. s7 = s8 = wxString(wxT("null\0time"), 9);
  149. s7.append(wxT("def"));
  150. s8.append(wxT("defgh"), 3);
  151. CPPUNIT_ASSERT_EQUAL( wxString(wxT("null\0timedef"), 12), s7 );
  152. CPPUNIT_ASSERT_EQUAL( wxString(wxT("null\0timedef"), 12), s8 );
  153. }
  154. void StdStringTestCase::StdAssign()
  155. {
  156. wxString s1, s2, s3, s4, s5, s6, s7, s8;
  157. s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = wxT("abc");
  158. s1.assign(wxT("def"));
  159. s2.assign(wxT("defgh"), 3);
  160. s3.assign(wxString(wxT("abcdef")), 3, 6);
  161. s4.assign(s1);
  162. s5.assign(3, wxT('a'));
  163. s6.assign(s1.begin() + 1, s1.end());
  164. CPPUNIT_ASSERT_EQUAL( wxT("def"), s1 );
  165. CPPUNIT_ASSERT_EQUAL( wxT("def"), s2 );
  166. CPPUNIT_ASSERT_EQUAL( wxT("def"), s3 );
  167. CPPUNIT_ASSERT_EQUAL( wxT("def"), s4 );
  168. CPPUNIT_ASSERT_EQUAL( wxT("aaa"), s5 );
  169. CPPUNIT_ASSERT_EQUAL( wxT("ef"), s6 );
  170. const char *pc = s1.c_str();
  171. s7.assign(pc, pc + 2);
  172. CPPUNIT_ASSERT_EQUAL( "de", s7 );
  173. const wchar_t *pw = s1.c_str();
  174. s8.assign(pw + 2, pw + 3);
  175. CPPUNIT_ASSERT_EQUAL( "f", s8 );
  176. s1.assign(s1, 1, 1);
  177. CPPUNIT_ASSERT_EQUAL("e", s1);
  178. }
  179. void StdStringTestCase::StdCompare()
  180. {
  181. wxString s1, s2, s3, s4, s5, s6, s7, s8;
  182. s1 = wxT("abcdefgh");
  183. s2 = wxT("abcdefgh");
  184. s3 = wxT("abc");
  185. s4 = wxT("abcdefghi");
  186. s5 = wxT("aaa");
  187. s6 = wxT("zzz");
  188. CPPUNIT_ASSERT( s1.compare(s2) == 0 );
  189. CPPUNIT_ASSERT( s1.compare(s3) > 0 );
  190. CPPUNIT_ASSERT( s1.compare(s4) < 0 );
  191. CPPUNIT_ASSERT( s1.compare(s5) > 0 );
  192. CPPUNIT_ASSERT( s1.compare(s6) < 0 );
  193. CPPUNIT_ASSERT( s1.compare(1, 12, s1) > 0);
  194. CPPUNIT_ASSERT( s1.compare(wxT("abcdefgh")) == 0);
  195. CPPUNIT_ASSERT( s1.compare(1, 7, wxT("bcdefgh")) == 0);
  196. CPPUNIT_ASSERT( s1.compare(1, 7, wxT("bcdefgh"), 7) == 0);
  197. }
  198. void StdStringTestCase::StdErase()
  199. {
  200. wxString s1, s2, s3, s4, s5, s6, s7;
  201. s1 = wxT("abcdefgh");
  202. s2 = wxT("abcdefgh");
  203. s3 = wxT("abc");
  204. s4 = wxT("abcdefghi");
  205. s5 = wxT("aaa");
  206. s6 = wxT("zzz");
  207. s7 = wxT("zabcdefg");
  208. s1.erase(1, 1);
  209. s2.erase(4, 12);
  210. wxString::iterator it = s3.erase(s3.begin() + 1);
  211. wxString::iterator it2 = s4.erase(s4.begin() + 4, s4.begin() + 6);
  212. wxString::iterator it3 = s7.erase(s7.begin() + 4, s7.begin() + 8);
  213. CPPUNIT_ASSERT_EQUAL( wxT("acdefgh"), s1 );
  214. CPPUNIT_ASSERT_EQUAL( wxT("abcd"), s2 );
  215. CPPUNIT_ASSERT_EQUAL( wxT("ac"), s3 );
  216. CPPUNIT_ASSERT_EQUAL( wxT("abcdghi"), s4 );
  217. CPPUNIT_ASSERT_EQUAL( wxT("zabc"), s7 );
  218. CPPUNIT_ASSERT( *it == wxT('c') );
  219. CPPUNIT_ASSERT( *it2 == wxT('g') );
  220. CPPUNIT_ASSERT( it3 == s7.end() );
  221. }
  222. void StdStringTestCase::StdFind()
  223. {
  224. // 0 1 2
  225. // 01234567890123456789012345
  226. wxString s1 = wxT("abcdefgABCDEFGabcABCabcABC");
  227. wxString s2 = wxT("gAB");
  228. CPPUNIT_ASSERT( s1.find(wxT('A')) == 7u );
  229. CPPUNIT_ASSERT( s1.find(wxT('A'), 7) == 7u );
  230. CPPUNIT_ASSERT( s1.find(wxT('Z')) == wxString::npos );
  231. CPPUNIT_ASSERT( s1.find(wxT('C'), 22) == 25u );
  232. CPPUNIT_ASSERT( s1.find(wxT("gAB")) == 6u );
  233. CPPUNIT_ASSERT( s1.find(wxT("gAB"), 7) == wxString::npos );
  234. CPPUNIT_ASSERT( s1.find(wxT("gAB"), 6) == 6u );
  235. CPPUNIT_ASSERT( s1.find(wxT("gABZZZ"), 2, 3) == 6u );
  236. CPPUNIT_ASSERT( s1.find(wxT("gABZZZ"), 7, 3) == wxString::npos );
  237. CPPUNIT_ASSERT( s1.find(s2) == 6u );
  238. CPPUNIT_ASSERT( s1.find(s2, 7) == wxString::npos );
  239. CPPUNIT_ASSERT( s1.find(s2, 6) == 6u );
  240. // 0 1 2
  241. // 0123456 78901234567 8901234567
  242. //wxString _s1 = wxT("abcdefg\0ABCDEFGabc\0ABCabcABC");
  243. //wxString _s2 = wxT("g\0AB");
  244. wxString _s1 = wxT("abcdefgABCDEFGabcABCabcABC");
  245. wxString _s2 = wxT("gAB");
  246. _s1.insert(7, 1, '\0');
  247. _s1.insert(18, 1, '\0');
  248. _s2.insert(1, 1, '\0');
  249. CPPUNIT_ASSERT( _s1.find(wxT('A')) == 8u );
  250. CPPUNIT_ASSERT( _s1.find(wxT('A'), 8) == 8u );
  251. CPPUNIT_ASSERT( _s1.find(wxT('Z')) == wxString::npos );
  252. CPPUNIT_ASSERT( _s1.find(wxT('C'), 22) == 27u );
  253. CPPUNIT_ASSERT( _s1.find(wxT("AB")) == 8u );
  254. CPPUNIT_ASSERT( _s1.find(wxT("AB"), 26) == wxString::npos );
  255. CPPUNIT_ASSERT( _s1.find(wxT("AB"), 23) == 25u );
  256. CPPUNIT_ASSERT( _s1.find(wxT("ABZZZ"), 2, 2) == 8u );
  257. CPPUNIT_ASSERT( _s1.find(wxT("ABZZZ"), 26, 2) == wxString::npos );
  258. CPPUNIT_ASSERT( _s1.find(_s2) == 6u );
  259. CPPUNIT_ASSERT( _s1.find(_s2, 7) == wxString::npos );
  260. CPPUNIT_ASSERT( _s1.find(_s2, 6) == 6u );
  261. }
  262. void StdStringTestCase::StdFindFirst()
  263. {
  264. // 0 1 2 3
  265. // 01234567890123456789012345678901234
  266. wxString s1 = wxT("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
  267. wxString s2 = wxT("aaaaaa");
  268. CPPUNIT_ASSERT( s1.find_first_not_of(wxT('a')) == 6u );
  269. CPPUNIT_ASSERT( s1.find_first_not_of(wxT('a'), 7) == 7u );
  270. CPPUNIT_ASSERT( s2.find_first_not_of(wxT('a')) == wxString::npos );
  271. CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abde"), 4) == 7u );
  272. CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abde"), 7) == 7u );
  273. CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abcdefghijkl")) == wxString::npos );
  274. CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abcdefghi"), 0, 4) == 9u );
  275. CPPUNIT_ASSERT( s1.find_first_of(wxT('c')) == 7u );
  276. CPPUNIT_ASSERT( s1.find_first_of(wxT('v')) == wxString::npos );
  277. CPPUNIT_ASSERT( s1.find_first_of(wxT('c'), 10) == 24u );
  278. CPPUNIT_ASSERT( s1.find_first_of(wxT("ijkl")) == 13u );
  279. CPPUNIT_ASSERT( s1.find_first_of(wxT("ddcfg"), 17) == 24u );
  280. CPPUNIT_ASSERT( s1.find_first_of(wxT("ddcfga"), 17, 5) == 24u );
  281. }
  282. void StdStringTestCase::StdFindLast()
  283. {
  284. // 0 1 2 3
  285. // 01234567890123456789012345678901234
  286. wxString s1 = wxT("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
  287. wxString s2 = wxT("aaaaaa");
  288. CPPUNIT_ASSERT( s2.find_last_not_of(wxT('a')) == wxString::npos );
  289. CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d')) == 33u );
  290. CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d'), 25) == 24u );
  291. CPPUNIT_ASSERT( s1.find_last_not_of(wxT("bcd")) == 22u );
  292. CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abc"), 24) == 16u );
  293. CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abcdefghijklmnopqrstuv"), 24, 3) == 16u );
  294. CPPUNIT_ASSERT( s2.find_last_of(wxT('c')) == wxString::npos );
  295. CPPUNIT_ASSERT( s1.find_last_of(wxT('a')) == 22u );
  296. CPPUNIT_ASSERT( s1.find_last_of(wxT('b'), 24) == 23u );
  297. CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklm")) == 16u );
  298. CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklma"), 33, 4) == 16u );
  299. CPPUNIT_ASSERT( s1.find_last_of(wxT("a"), 17) == 17u );
  300. // 0 1 2 3
  301. // 012345 67890123456789 01234567890123456
  302. // wxString s1 = wxT("aaaaaa\0bcdefghlkjiaa\0aaaabcdbcdbcdbcd");
  303. // wxString s2 = wxT("aaaaaa\0");
  304. s1.insert(6,1,'\0');
  305. s1.insert(20,1,'\0');
  306. s2.insert(6,1,'\0');
  307. CPPUNIT_ASSERT( s2.find_last_not_of(wxT('a')) == 6u );
  308. CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d')) == 35u );
  309. CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d'), 27) == 26u );
  310. CPPUNIT_ASSERT( s1.find_last_not_of(wxT("bcd")) == 24u );
  311. CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abc"), 26) == 20u );
  312. CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abcdefghijklmnopqrstuv"), 26, 3) == 20u );
  313. CPPUNIT_ASSERT( s2.find_last_of(wxT('c')) == wxString::npos );
  314. CPPUNIT_ASSERT( s1.find_last_of(wxT('a')) == 24u );
  315. CPPUNIT_ASSERT( s1.find_last_of(wxT('b'), 26) == 25u );
  316. CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklm")) == 17u );
  317. CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklma"), 35, 4) == 17u );
  318. CPPUNIT_ASSERT( s1.find_last_of(wxT("a"), 18) == 18u );
  319. }
  320. void StdStringTestCase::StdInsert()
  321. {
  322. wxString s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
  323. s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = wxT("aaaa");
  324. s9 = s10 = wxT("cdefg");
  325. s1.insert(1, wxT("cc") );
  326. s2.insert(2, wxT("cdef"), 3);
  327. s3.insert(2, s10);
  328. s4.insert(2, s10, 3, 7);
  329. s5.insert(1, 2, wxT('c'));
  330. s6.insert(s6.begin() + 3, wxT('X'));
  331. s7.insert(s7.begin(), s9.begin(), s9.end() - 1);
  332. s8.insert(s8.begin(), 2, wxT('c'));
  333. CPPUNIT_ASSERT_EQUAL( wxT("accaaa") , s1 );
  334. CPPUNIT_ASSERT_EQUAL( wxT("aacdeaa") , s2 );
  335. CPPUNIT_ASSERT_EQUAL( wxT("aacdefgaa"), s3 );
  336. CPPUNIT_ASSERT_EQUAL( wxT("aafgaa") , s4 );
  337. CPPUNIT_ASSERT_EQUAL( wxT("accaaa") , s5 );
  338. CPPUNIT_ASSERT_EQUAL( wxT("aaaXa") , s6 );
  339. CPPUNIT_ASSERT_EQUAL( wxT("cdefaaaa") , s7 );
  340. CPPUNIT_ASSERT_EQUAL( wxT("ccaaaa") , s8 );
  341. s1 = s2 = s3 = wxT("aaaa");
  342. s1.insert(0, wxT("ccc"), 2);
  343. s2.insert(4, wxT("ccc"), 2);
  344. CPPUNIT_ASSERT_EQUAL( wxT("ccaaaa"), s1 );
  345. CPPUNIT_ASSERT_EQUAL( wxT("aaaacc"), s2 );
  346. }
  347. void StdStringTestCase::StdReplace()
  348. {
  349. wxString s1, s2, s3, s4, s5, s6, s7, s8, s9;
  350. s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = wxT("QWERTYUIOP");
  351. s9 = wxT("werty");
  352. s1.replace(3, 4, wxT("rtyu"));
  353. s1.replace(8, 7, wxT("opopop"));
  354. s2.replace(10, 12, wxT("WWWW"));
  355. s3.replace(1, 5, s9);
  356. s4.replace(1, 4, s9, 0, 4);
  357. s5.replace(1, 2, s9, 1, 12);
  358. s6.replace(0, 123, s9, 0, 123);
  359. s7.replace(2, 7, s9);
  360. CPPUNIT_ASSERT_EQUAL( wxT("QWErtyuIopopop"), s1 );
  361. CPPUNIT_ASSERT_EQUAL( wxT("QWERTYUIOPWWWW"), s2 );
  362. CPPUNIT_ASSERT_EQUAL( wxT("QwertyUIOP") , s3 );
  363. CPPUNIT_ASSERT_EQUAL( wxT("QwertYUIOP") , s4 );
  364. CPPUNIT_ASSERT_EQUAL( wxT("QertyRTYUIOP") , s5 );
  365. CPPUNIT_ASSERT_EQUAL( s9, s6 );
  366. CPPUNIT_ASSERT_EQUAL( wxT("QWwertyP"), s7 );
  367. }
  368. void StdStringTestCase::StdRFind()
  369. {
  370. // 0 1 2
  371. // 01234567890123456789012345
  372. wxString s1 = wxT("abcdefgABCDEFGabcABCabcABC");
  373. wxString s2 = wxT("gAB");
  374. wxString s3 = wxT("ab");
  375. CPPUNIT_ASSERT( s1.rfind(wxT('A')) == 23u );
  376. CPPUNIT_ASSERT( s1.rfind(wxT('A'), 7) == 7u );
  377. CPPUNIT_ASSERT( s1.rfind(wxT('Z')) == wxString::npos );
  378. CPPUNIT_ASSERT( s1.rfind(wxT('C'), 22) == 19u );
  379. CPPUNIT_ASSERT( s1.rfind(wxT("cAB")) == 22u );
  380. CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 15) == wxString::npos );
  381. CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 21) == 16u );
  382. CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 7, 3) == 6u );
  383. CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 5, 3) == wxString::npos );
  384. CPPUNIT_ASSERT( s1.rfind(s2) == 6u );
  385. CPPUNIT_ASSERT( s1.rfind(s2, 5) == wxString::npos );
  386. CPPUNIT_ASSERT( s1.rfind(s2, 6) == 6u );
  387. CPPUNIT_ASSERT( s1.rfind(s3, 1) == 0u );
  388. // 0 1 2
  389. // 01234 56789012 345678901234567
  390. // wxString s1 = wxT("abcde\0fgABCDE\0FGabcABCabcABC");
  391. // wxString s2 = wxT("gAB");
  392. // wxString s3 = wxT("ab");
  393. s1.insert(5,1,'\0');
  394. s1.insert(13,1,'\0');
  395. CPPUNIT_ASSERT( s1.rfind(wxT('A')) == 25u );
  396. CPPUNIT_ASSERT( s1.rfind(wxT('A'), 8) == 8u );
  397. CPPUNIT_ASSERT( s1.rfind(wxT('Z')) == wxString::npos );
  398. CPPUNIT_ASSERT( s1.rfind(wxT('C'), 22) == 21u );
  399. CPPUNIT_ASSERT( s1.rfind(wxT("cAB")) == 24u );
  400. CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 15) == wxString::npos );
  401. CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 21) == 18u );
  402. CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 8, 3) == 7u );
  403. CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 5, 3) == wxString::npos );
  404. }
  405. void StdStringTestCase::StdResize()
  406. {
  407. wxString s1, s2, s3, s4;
  408. s1 = s2 = s3 = s4 = wxT("abcABCdefDEF");
  409. s1.resize( 12 );
  410. s2.resize( 10 );
  411. s3.resize( 14, wxT(' ') );
  412. s4.resize( 14, wxT('W') );
  413. CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefDEF"), s1 );
  414. CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefD"), s2 );
  415. CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefDEF "), s3 );
  416. CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefDEFWW"), s4 );
  417. #if wxUSE_UNICODE
  418. wxString s =
  419. wxString::FromUTF8("\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82");
  420. s.resize(3);
  421. CPPUNIT_ASSERT_EQUAL( wxString::FromUTF8("\xd0\x9f\xd1\x80\xd0\xb8"), s);
  422. #endif // wxUSE_UNICODE
  423. }
  424. void StdStringTestCase::StdRiter()
  425. {
  426. const wxString s(wxT("fozbar"));
  427. wxString::const_reverse_iterator ri(s.rbegin());
  428. CPPUNIT_ASSERT( wxT('r') == *ri );
  429. CPPUNIT_ASSERT( wxT('a') == *++ri );
  430. CPPUNIT_ASSERT( wxT('r') == *--ri );
  431. ri = s.rend();
  432. ri--;
  433. CPPUNIT_ASSERT( wxT('f') == *ri );
  434. --ri;
  435. CPPUNIT_ASSERT( wxT('o') == *ri );
  436. wxString::const_iterator i = ri.base();
  437. CPPUNIT_ASSERT( wxT('z') == *i );
  438. }
  439. void StdStringTestCase::StdSubstr()
  440. {
  441. wxString s1 = wxT("abcdefgABCDEFG");
  442. CPPUNIT_ASSERT( s1.substr( 0, 14 ) == s1 );
  443. CPPUNIT_ASSERT( s1.substr( 1, 13 ) == wxT("bcdefgABCDEFG") );
  444. CPPUNIT_ASSERT( s1.substr( 1, 20 ) == wxT("bcdefgABCDEFG") );
  445. CPPUNIT_ASSERT( s1.substr( 14, 30 ) == wxT("") );
  446. s1.insert(3,1,'\0');
  447. s1.insert(8,1,'\0');
  448. s1.insert(13,1,'\0');
  449. wxString s2 = wxT("bcdefgABCDEFG");
  450. s2.insert(2,1,'\0');
  451. s2.insert(7,1,'\0');
  452. s2.insert(12,1,'\0');
  453. CPPUNIT_ASSERT( s1.substr( 0, 17 ) == s1 );
  454. CPPUNIT_ASSERT( s1.substr( 1, 17 ) == s2 );
  455. CPPUNIT_ASSERT( s1.substr( 1, 20 ) == s2 );
  456. CPPUNIT_ASSERT( s1.substr( 17, 30 ) == wxT("") );
  457. }
  458. #if wxUSE_STD_STRING
  459. void StdStringTestCase::StdConversion()
  460. {
  461. std::string strStd("std::string value");
  462. wxStdWideString strStdWide(L"std::wstring value");
  463. wxString s1(strStd);
  464. CPPUNIT_ASSERT_EQUAL( "std::string value", s1 );
  465. wxString s2(strStdWide);
  466. CPPUNIT_ASSERT_EQUAL( "std::wstring value", s2 );
  467. wxString s3;
  468. s3 = strStd;
  469. CPPUNIT_ASSERT_EQUAL( "std::string value", s3 );
  470. s3 = strStdWide;
  471. CPPUNIT_ASSERT_EQUAL( "std::wstring value", s3 );
  472. wxString s4("hello");
  473. // notice that implicit wxString -> std::string conversion is only
  474. // available in wxUSE_STL case, because it conflicts with conversion to
  475. // const char*/wchar_t*
  476. #if wxUSE_STL
  477. std::string s5 = s4;
  478. #else
  479. std::string s5 = s4.ToStdString();
  480. #endif
  481. CPPUNIT_ASSERT_EQUAL( "hello", s5 );
  482. #if wxUSE_STL
  483. wxStdWideString s6 = s4;
  484. #else
  485. wxStdWideString s6 = s4.ToStdWstring();
  486. #endif
  487. CPPUNIT_ASSERT_EQUAL( "hello", s6 );
  488. std::string s7(s4);
  489. CPPUNIT_ASSERT( s7 == "hello" );
  490. wxStdWideString s8(s4);
  491. CPPUNIT_ASSERT( s8 == "hello" );
  492. }
  493. #endif // wxUSE_STD_STRING