Files
wxWidgets/tests/strings/stdstrings.cpp
Vadim Zeitlin 9e4d51dfca Disable tests not working in ANSI build
Most of them can't be expected to work, e.g. non-ASCII file names can't
be supported without Unicode support.

Some others, e.g. test for NULs in wxDataOutputStream, are questionable,
as it seems that it might be possible to fix them in ANSI build too, but
for now just do the simplest thing to make the tests pass on Travis.
2020-10-18 23:47:29 +02:00

656 lines
21 KiB
C++

//////////////////////////////////////////////////////////////////////////////
// Name: tests/strings/stdstrings.cpp
// Purpose: wxString unit test
// Author: Vadim Zeitlin, Wlodzimierz ABX Skiba
// Created: 2004-05-07
// Copyright: (c) 2004 Vadim Zeitlin, Wlodzimierz Skiba
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif // WX_PRECOMP
#include <algorithm>
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class StdStringTestCase : public CppUnit::TestCase
{
public:
StdStringTestCase();
private:
CPPUNIT_TEST_SUITE( StdStringTestCase );
CPPUNIT_TEST( StdConstructors );
CPPUNIT_TEST( StdIterators );
CPPUNIT_TEST( StdIteratorsCmp );
CPPUNIT_TEST( StdAppend );
CPPUNIT_TEST( StdAssign );
CPPUNIT_TEST( StdCompare );
CPPUNIT_TEST( StdErase );
CPPUNIT_TEST( StdFind );
CPPUNIT_TEST( StdFindFirst );
CPPUNIT_TEST( StdFindLast );
CPPUNIT_TEST( StdStartsEndsWith );
CPPUNIT_TEST( StdInsert );
CPPUNIT_TEST( StdReplace );
CPPUNIT_TEST( StdRFind );
CPPUNIT_TEST( StdResize );
CPPUNIT_TEST( StdRiter );
CPPUNIT_TEST( StdSubstr );
#if wxUSE_STD_STRING
CPPUNIT_TEST( StdConversion );
#endif
CPPUNIT_TEST( StdAlgo );
CPPUNIT_TEST_SUITE_END();
void StdConstructors();
void StdIterators();
void StdIteratorsCmp();
void StdAppend();
void StdAssign();
void StdCompare();
void StdErase();
void StdFind();
void StdFindFirst();
void StdFindLast();
void StdStartsEndsWith();
void StdInsert();
void StdReplace();
void StdRFind();
void StdResize();
void StdRiter();
void StdSubstr();
#if wxUSE_STD_STRING
void StdConversion();
#endif
void StdAlgo();
wxDECLARE_NO_COPY_CLASS(StdStringTestCase);
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( StdStringTestCase );
// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( StdStringTestCase, "StdStringTestCase" );
StdStringTestCase::StdStringTestCase()
{
}
void StdStringTestCase::StdConstructors()
{
wxString s1(wxT("abcdefgh")),
s2(wxT("abcdefghijklm"), 8),
s3(wxT("abcdefghijklm")),
s4(8, wxT('a'));
wxString s5(s1),
s6(s3, 0, 8),
s7(s3.begin(), s3.begin() + 8);
wxString s8(s1, 4, 8);
CPPUNIT_ASSERT_EQUAL( wxT("abcdefgh"), s1 );
CPPUNIT_ASSERT_EQUAL( s1, s2 );
CPPUNIT_ASSERT_EQUAL( wxT("aaaaaaaa"), s4 );
CPPUNIT_ASSERT_EQUAL( wxT("abcdefgh"), s5 );
CPPUNIT_ASSERT_EQUAL( s1, s6 );
CPPUNIT_ASSERT_EQUAL( s1, s7 );
CPPUNIT_ASSERT_EQUAL( wxT("efgh"), s8 );
const char *pc = s1.c_str();
CPPUNIT_ASSERT_EQUAL( "bcd", wxString(pc + 1, pc + 4) );
const wchar_t *pw = s2.c_str();
CPPUNIT_ASSERT_EQUAL( "a", wxString(pw, pw + 1) );
}
void StdStringTestCase::StdIterators()
{
// test compilation of default iterators ctors:
wxString::iterator i1;
wxString::const_iterator i2;
wxString::reverse_iterator i3;
wxString::const_reverse_iterator i4;
}
void StdStringTestCase::StdIteratorsCmp()
{
wxString s("foobar");
wxString::iterator i = s.begin();
wxString::const_iterator ci = s.begin();
CPPUNIT_ASSERT( i == ci );
CPPUNIT_ASSERT( i >= ci );
CPPUNIT_ASSERT( i <= ci );
CPPUNIT_ASSERT( ci == i );
CPPUNIT_ASSERT( ci >= i );
CPPUNIT_ASSERT( ci <= i );
ci++;
CPPUNIT_ASSERT( i != ci );
CPPUNIT_ASSERT( i < ci );
CPPUNIT_ASSERT( !(i > ci) );
CPPUNIT_ASSERT( ci != i );
CPPUNIT_ASSERT( ci > i );
CPPUNIT_ASSERT( !(ci < i) );
}
void StdStringTestCase::StdAppend()
{
wxString s1, s2, s3, s4, s5, s6, s7, s8;
s1 = s2 = s3 = s4 = s5 = s6 = wxT("abc");
s1.append(wxT("def"));
s2.append(wxT("defgh"), 3);
s3.append(wxString(wxT("abcdef")), 3, 6);
s4.append(s1);
s5.append(3, wxT('a'));
s5.append(2, 'x');
s5.append(1, (unsigned char)'y');
s6.append(s1.begin() + 3, s1.end());
CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s1 );
CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s2 );
CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s3 );
CPPUNIT_ASSERT_EQUAL( wxT("abcabcdef"), s4 );
CPPUNIT_ASSERT_EQUAL( wxT("abcaaaxxy"), s5 );
CPPUNIT_ASSERT_EQUAL( wxT("abcdef"), s6 );
const char *pc = s1.c_str() + 2;
s7.append(pc, pc + 4);
CPPUNIT_ASSERT_EQUAL( "cdef", s7 );
const wchar_t *pw = s2.c_str() + 2;
s8.append(pw, pw + 4);
CPPUNIT_ASSERT_EQUAL( "cdef", s8 );
s7 = s8 = wxString(wxT("null\0time"), 9);
s7.append(wxT("def"));
s8.append(wxT("defgh"), 3);
CPPUNIT_ASSERT_EQUAL( wxString(wxT("null\0timedef"), 12), s7 );
CPPUNIT_ASSERT_EQUAL( wxString(wxT("null\0timedef"), 12), s8 );
}
void StdStringTestCase::StdAssign()
{
wxString s1, s2, s3, s4, s5, s6, s7, s8;
s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = wxT("abc");
s1.assign(wxT("def"));
s2.assign(wxT("defgh"), 3);
s3.assign(wxString(wxT("abcdef")), 3, 6);
s4.assign(s1);
s5.assign(3, wxT('a'));
s6.assign(s1.begin() + 1, s1.end());
CPPUNIT_ASSERT_EQUAL( wxT("def"), s1 );
CPPUNIT_ASSERT_EQUAL( wxT("def"), s2 );
CPPUNIT_ASSERT_EQUAL( wxT("def"), s3 );
CPPUNIT_ASSERT_EQUAL( wxT("def"), s4 );
CPPUNIT_ASSERT_EQUAL( wxT("aaa"), s5 );
CPPUNIT_ASSERT_EQUAL( wxT("ef"), s6 );
const char *pc = s1.c_str();
s7.assign(pc, pc + 2);
CPPUNIT_ASSERT_EQUAL( "de", s7 );
const wchar_t *pw = s1.c_str();
s8.assign(pw + 2, pw + 3);
CPPUNIT_ASSERT_EQUAL( "f", s8 );
s1.assign(s1, 1, 1);
CPPUNIT_ASSERT_EQUAL("e", s1);
}
void StdStringTestCase::StdCompare()
{
wxString s1, s2, s3, s4, s5, s6, s7, s8;
s1 = wxT("abcdefgh");
s2 = wxT("abcdefgh");
s3 = wxT("abc");
s4 = wxT("abcdefghi");
s5 = wxT("aaa");
s6 = wxT("zzz");
CPPUNIT_ASSERT( s1.compare(s2) == 0 );
CPPUNIT_ASSERT( s1.compare(s3) > 0 );
CPPUNIT_ASSERT( s1.compare(s4) < 0 );
CPPUNIT_ASSERT( s1.compare(s5) > 0 );
CPPUNIT_ASSERT( s1.compare(s6) < 0 );
CPPUNIT_ASSERT( s1.compare(1, 12, s1) > 0);
CPPUNIT_ASSERT( s1.compare(wxT("abcdefgh")) == 0);
CPPUNIT_ASSERT( s1.compare(1, 7, wxT("bcdefgh")) == 0);
CPPUNIT_ASSERT( s1.compare(1, 7, wxT("bcdefgh"), 7) == 0);
}
void StdStringTestCase::StdErase()
{
wxString s1, s2, s3, s4, s5, s6, s7;
s1 = wxT("abcdefgh");
s2 = wxT("abcdefgh");
s3 = wxT("abc");
s4 = wxT("abcdefghi");
s5 = wxT("aaa");
s6 = wxT("zzz");
s7 = wxT("zabcdefg");
s1.erase(1, 1);
s2.erase(4, 12);
wxString::iterator it = s3.erase(s3.begin() + 1);
wxString::iterator it2 = s4.erase(s4.begin() + 4, s4.begin() + 6);
wxString::iterator it3 = s7.erase(s7.begin() + 4, s7.begin() + 8);
CPPUNIT_ASSERT_EQUAL( wxT("acdefgh"), s1 );
CPPUNIT_ASSERT_EQUAL( wxT("abcd"), s2 );
CPPUNIT_ASSERT_EQUAL( wxT("ac"), s3 );
CPPUNIT_ASSERT_EQUAL( wxT("abcdghi"), s4 );
CPPUNIT_ASSERT_EQUAL( wxT("zabc"), s7 );
CPPUNIT_ASSERT( *it == wxT('c') );
CPPUNIT_ASSERT( *it2 == wxT('g') );
CPPUNIT_ASSERT( it3 == s7.end() );
}
void StdStringTestCase::StdFind()
{
// 0 1 2
// 01234567890123456789012345
wxString s1 = wxT("abcdefgABCDEFGabcABCabcABC");
wxString s2 = wxT("gAB");
CPPUNIT_ASSERT( s1.find(wxT('A')) == 7u );
CPPUNIT_ASSERT( s1.find(wxT('A'), 7) == 7u );
CPPUNIT_ASSERT( s1.find(wxT('Z')) == wxString::npos );
CPPUNIT_ASSERT( s1.find(wxT('C'), 22) == 25u );
CPPUNIT_ASSERT( s1.find(wxT("gAB")) == 6u );
CPPUNIT_ASSERT( s1.find(wxT("gAB"), 7) == wxString::npos );
CPPUNIT_ASSERT( s1.find(wxT("gAB"), 6) == 6u );
CPPUNIT_ASSERT( s1.find(wxT("gABZZZ"), 2, 3) == 6u );
CPPUNIT_ASSERT( s1.find(wxT("gABZZZ"), 7, 3) == wxString::npos );
CPPUNIT_ASSERT( s1.find(s2) == 6u );
CPPUNIT_ASSERT( s1.find(s2, 7) == wxString::npos );
CPPUNIT_ASSERT( s1.find(s2, 6) == 6u );
// 0 1 2
// 0123456 78901234567 8901234567
//wxString _s1 = wxT("abcdefg\0ABCDEFGabc\0ABCabcABC");
//wxString _s2 = wxT("g\0AB");
wxString _s1 = wxT("abcdefgABCDEFGabcABCabcABC");
wxString _s2 = wxT("gAB");
_s1.insert(7, 1, '\0');
_s1.insert(18, 1, '\0');
_s2.insert(1, 1, '\0');
CPPUNIT_ASSERT( _s1.find(wxT('A')) == 8u );
CPPUNIT_ASSERT( _s1.find(wxT('A'), 8) == 8u );
CPPUNIT_ASSERT( _s1.find(wxT('Z')) == wxString::npos );
CPPUNIT_ASSERT( _s1.find(wxT('C'), 22) == 27u );
CPPUNIT_ASSERT( _s1.find(wxT("AB")) == 8u );
CPPUNIT_ASSERT( _s1.find(wxT("AB"), 26) == wxString::npos );
CPPUNIT_ASSERT( _s1.find(wxT("AB"), 23) == 25u );
CPPUNIT_ASSERT( _s1.find(wxT("ABZZZ"), 2, 2) == 8u );
CPPUNIT_ASSERT( _s1.find(wxT("ABZZZ"), 26, 2) == wxString::npos );
CPPUNIT_ASSERT( _s1.find(_s2) == 6u );
CPPUNIT_ASSERT( _s1.find(_s2, 7) == wxString::npos );
CPPUNIT_ASSERT( _s1.find(_s2, 6) == 6u );
}
void StdStringTestCase::StdFindFirst()
{
// 0 1 2 3
// 01234567890123456789012345678901234
wxString s1 = wxT("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
wxString s2 = wxT("aaaaaa");
CPPUNIT_ASSERT( s1.find_first_not_of(wxT('a')) == 6u );
CPPUNIT_ASSERT( s1.find_first_not_of(wxT('a'), 7) == 7u );
CPPUNIT_ASSERT( s2.find_first_not_of(wxT('a')) == wxString::npos );
CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abde"), 4) == 7u );
CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abde"), 7) == 7u );
CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abcdefghijkl")) == wxString::npos );
CPPUNIT_ASSERT( s1.find_first_not_of(wxT("abcdefghi"), 0, 4) == 9u );
CPPUNIT_ASSERT( s1.find_first_of(wxT('c')) == 7u );
CPPUNIT_ASSERT( s1.find_first_of(wxT('v')) == wxString::npos );
CPPUNIT_ASSERT( s1.find_first_of(wxT('c'), 10) == 24u );
CPPUNIT_ASSERT( s1.find_first_of(wxT("ijkl")) == 13u );
CPPUNIT_ASSERT( s1.find_first_of(wxT("ddcfg"), 17) == 24u );
CPPUNIT_ASSERT( s1.find_first_of(wxT("ddcfga"), 17, 5) == 24u );
}
void StdStringTestCase::StdFindLast()
{
// 0 1 2 3
// 01234567890123456789012345678901234
wxString s1 = wxT("aaaaaabcdefghlkjiaaaaaabcdbcdbcdbcd");
wxString s2 = wxT("aaaaaa");
CPPUNIT_ASSERT( s2.find_last_not_of(wxT('a')) == wxString::npos );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d')) == 33u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d'), 25) == 24u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT("bcd")) == 22u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abc"), 24) == 16u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abcdefghijklmnopqrstuv"), 24, 3) == 16u );
CPPUNIT_ASSERT( s2.find_last_of(wxT('c')) == wxString::npos );
CPPUNIT_ASSERT( s1.find_last_of(wxT('a')) == 22u );
CPPUNIT_ASSERT( s1.find_last_of(wxT('b'), 24) == 23u );
CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklm")) == 16u );
CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklma"), 33, 4) == 16u );
CPPUNIT_ASSERT( s1.find_last_of(wxT("a"), 17) == 17u );
// 0 1 2 3
// 012345 67890123456789 01234567890123456
// wxString s1 = wxT("aaaaaa\0bcdefghlkjiaa\0aaaabcdbcdbcdbcd");
// wxString s2 = wxT("aaaaaa\0");
s1.insert(6,1,'\0');
s1.insert(20,1,'\0');
s2.insert(6,1,'\0');
CPPUNIT_ASSERT( s2.find_last_not_of(wxT('a')) == 6u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d')) == 35u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT('d'), 27) == 26u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT("bcd")) == 24u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abc"), 26) == 20u );
CPPUNIT_ASSERT( s1.find_last_not_of(wxT("abcdefghijklmnopqrstuv"), 26, 3) == 20u );
CPPUNIT_ASSERT( s2.find_last_of(wxT('c')) == wxString::npos );
CPPUNIT_ASSERT( s1.find_last_of(wxT('a')) == 24u );
CPPUNIT_ASSERT( s1.find_last_of(wxT('b'), 26) == 25u );
CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklm")) == 17u );
CPPUNIT_ASSERT( s1.find_last_of(wxT("ijklma"), 35, 4) == 17u );
CPPUNIT_ASSERT( s1.find_last_of(wxT("a"), 18) == 18u );
}
void StdStringTestCase::StdStartsEndsWith()
{
const wxString s(wxT("Hello, world!"));
CPPUNIT_ASSERT_EQUAL( true, s.starts_with(wxT("Hello")) );
CPPUNIT_ASSERT_EQUAL( true, s.starts_with(wxT("Hello, ")) );
CPPUNIT_ASSERT_EQUAL( true, s.starts_with(wxT("Hello, world!")) );
CPPUNIT_ASSERT_EQUAL( false, s.starts_with(wxT("Hello, world!!!")) );
CPPUNIT_ASSERT_EQUAL( true, s.starts_with(wxT("")) );
CPPUNIT_ASSERT_EQUAL( false, s.starts_with(wxT("Goodbye")) );
CPPUNIT_ASSERT_EQUAL( false, s.starts_with(wxT("Hi")) );
CPPUNIT_ASSERT_EQUAL( true, s.ends_with(wxT("Hello, world!")) );
CPPUNIT_ASSERT_EQUAL( true, s.ends_with(wxT("world!")) );
CPPUNIT_ASSERT_EQUAL( false, s.ends_with(wxT("Hello")) );
CPPUNIT_ASSERT_EQUAL( true, s.ends_with(wxT("!")) );
CPPUNIT_ASSERT_EQUAL( true, s.ends_with(wxT("")) );
CPPUNIT_ASSERT_EQUAL( false, s.ends_with(wxT("very long string")) );
CPPUNIT_ASSERT_EQUAL( false, s.ends_with(wxT("?")) );
CPPUNIT_ASSERT_EQUAL( false, s.ends_with(wxT("Hello, world")) );
CPPUNIT_ASSERT_EQUAL( false, s.ends_with(wxT("Gello, world!")) );
}
void StdStringTestCase::StdInsert()
{
wxString s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = wxT("aaaa");
s9 = s10 = wxT("cdefg");
s1.insert(1, wxT("cc") );
s2.insert(2, wxT("cdef"), 3);
s3.insert(2, s10);
s4.insert(2, s10, 3, 7);
s5.insert(1, 2, wxT('c'));
s6.insert(s6.begin() + 3, wxT('X'));
s7.insert(s7.begin(), s9.begin(), s9.end() - 1);
s8.insert(s8.begin(), 2, wxT('c'));
CPPUNIT_ASSERT_EQUAL( wxT("accaaa") , s1 );
CPPUNIT_ASSERT_EQUAL( wxT("aacdeaa") , s2 );
CPPUNIT_ASSERT_EQUAL( wxT("aacdefgaa"), s3 );
CPPUNIT_ASSERT_EQUAL( wxT("aafgaa") , s4 );
CPPUNIT_ASSERT_EQUAL( wxT("accaaa") , s5 );
CPPUNIT_ASSERT_EQUAL( wxT("aaaXa") , s6 );
CPPUNIT_ASSERT_EQUAL( wxT("cdefaaaa") , s7 );
CPPUNIT_ASSERT_EQUAL( wxT("ccaaaa") , s8 );
s1 = s2 = s3 = wxT("aaaa");
s1.insert(0, wxT("ccc"), 2);
s2.insert(4, wxT("ccc"), 2);
CPPUNIT_ASSERT_EQUAL( wxT("ccaaaa"), s1 );
CPPUNIT_ASSERT_EQUAL( wxT("aaaacc"), s2 );
}
void StdStringTestCase::StdReplace()
{
wxString s1, s2, s3, s4, s5, s6, s7, s8, s9;
s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = wxT("QWERTYUIOP");
s9 = wxT("werty");
s1.replace(3, 4, wxT("rtyu"));
s1.replace(8, 7, wxT("opopop"));
s2.replace(10, 12, wxT("WWWW"));
s3.replace(1, 5, s9);
s4.replace(1, 4, s9, 0, 4);
s5.replace(1, 2, s9, 1, 12);
s6.replace(0, 123, s9, 0, 123);
s7.replace(2, 7, s9);
CPPUNIT_ASSERT_EQUAL( wxT("QWErtyuIopopop"), s1 );
CPPUNIT_ASSERT_EQUAL( wxT("QWERTYUIOPWWWW"), s2 );
CPPUNIT_ASSERT_EQUAL( wxT("QwertyUIOP") , s3 );
CPPUNIT_ASSERT_EQUAL( wxT("QwertYUIOP") , s4 );
CPPUNIT_ASSERT_EQUAL( wxT("QertyRTYUIOP") , s5 );
CPPUNIT_ASSERT_EQUAL( s9, s6 );
CPPUNIT_ASSERT_EQUAL( wxT("QWwertyP"), s7 );
}
void StdStringTestCase::StdRFind()
{
// 0 1 2
// 01234567890123456789012345
wxString s1 = wxT("abcdefgABCDEFGabcABCabcABC");
wxString s2 = wxT("gAB");
wxString s3 = wxT("ab");
CPPUNIT_ASSERT( s1.rfind(wxT('A')) == 23u );
CPPUNIT_ASSERT( s1.rfind(wxT('A'), 7) == 7u );
CPPUNIT_ASSERT( s1.rfind(wxT('Z')) == wxString::npos );
CPPUNIT_ASSERT( s1.rfind(wxT('C'), 22) == 19u );
CPPUNIT_ASSERT( s1.rfind(wxT("cAB")) == 22u );
CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 15) == wxString::npos );
CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 21) == 16u );
CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 7, 3) == 6u );
CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 5, 3) == wxString::npos );
CPPUNIT_ASSERT( s1.rfind(s2) == 6u );
CPPUNIT_ASSERT( s1.rfind(s2, 5) == wxString::npos );
CPPUNIT_ASSERT( s1.rfind(s2, 6) == 6u );
CPPUNIT_ASSERT( s1.rfind(s3, 1) == 0u );
// 0 1 2
// 01234 56789012 345678901234567
// wxString s1 = wxT("abcde\0fgABCDE\0FGabcABCabcABC");
// wxString s2 = wxT("gAB");
// wxString s3 = wxT("ab");
s1.insert(5,1,'\0');
s1.insert(13,1,'\0');
CPPUNIT_ASSERT( s1.rfind(wxT('A')) == 25u );
CPPUNIT_ASSERT( s1.rfind(wxT('A'), 8) == 8u );
CPPUNIT_ASSERT( s1.rfind(wxT('Z')) == wxString::npos );
CPPUNIT_ASSERT( s1.rfind(wxT('C'), 22) == 21u );
CPPUNIT_ASSERT( s1.rfind(wxT("cAB")) == 24u );
CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 15) == wxString::npos );
CPPUNIT_ASSERT( s1.rfind(wxT("cAB"), 21) == 18u );
CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 8, 3) == 7u );
CPPUNIT_ASSERT( s1.rfind(wxT("gABZZZ"), 5, 3) == wxString::npos );
}
void StdStringTestCase::StdResize()
{
wxString s1, s2, s3, s4;
s1 = s2 = s3 = s4 = wxT("abcABCdefDEF");
s1.resize( 12 );
s2.resize( 10 );
s3.resize( 14, wxT(' ') );
s4.resize( 14, wxT('W') );
CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefDEF"), s1 );
CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefD"), s2 );
CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefDEF "), s3 );
CPPUNIT_ASSERT_EQUAL( wxT("abcABCdefDEFWW"), s4 );
#if wxUSE_UNICODE
wxString s =
wxString::FromUTF8("\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82");
s.resize(3);
CPPUNIT_ASSERT_EQUAL( wxString::FromUTF8("\xd0\x9f\xd1\x80\xd0\xb8"), s);
#endif // wxUSE_UNICODE
}
void StdStringTestCase::StdRiter()
{
const wxString s(wxT("fozbar"));
wxString::const_reverse_iterator ri(s.rbegin());
CPPUNIT_ASSERT( wxT('r') == *ri );
CPPUNIT_ASSERT( wxT('a') == *++ri );
CPPUNIT_ASSERT( wxT('r') == *--ri );
ri = s.rend();
ri--;
CPPUNIT_ASSERT( wxT('f') == *ri );
--ri;
CPPUNIT_ASSERT( wxT('o') == *ri );
wxString::const_iterator i = ri.base();
CPPUNIT_ASSERT( wxT('z') == *i );
}
void StdStringTestCase::StdSubstr()
{
wxString s1 = wxT("abcdefgABCDEFG");
CPPUNIT_ASSERT( s1.substr( 0, 14 ) == s1 );
CPPUNIT_ASSERT( s1.substr( 1, 13 ) == wxT("bcdefgABCDEFG") );
CPPUNIT_ASSERT( s1.substr( 1, 20 ) == wxT("bcdefgABCDEFG") );
CPPUNIT_ASSERT( s1.substr( 14, 30 ) == wxT("") );
s1.insert(3,1,'\0');
s1.insert(8,1,'\0');
s1.insert(13,1,'\0');
wxString s2 = wxT("bcdefgABCDEFG");
s2.insert(2,1,'\0');
s2.insert(7,1,'\0');
s2.insert(12,1,'\0');
CPPUNIT_ASSERT( s1.substr( 0, 17 ) == s1 );
CPPUNIT_ASSERT( s1.substr( 1, 17 ) == s2 );
CPPUNIT_ASSERT( s1.substr( 1, 20 ) == s2 );
CPPUNIT_ASSERT( s1.substr( 17, 30 ) == wxT("") );
}
#if wxUSE_STD_STRING
void StdStringTestCase::StdConversion()
{
std::string strStd("std::string value");
wxStdWideString strStdWide(L"std::wstring value");
wxString s1(strStd);
CPPUNIT_ASSERT_EQUAL( "std::string value", s1 );
wxString s2(strStdWide);
CPPUNIT_ASSERT_EQUAL( "std::wstring value", s2 );
wxString s3;
s3 = strStd;
CPPUNIT_ASSERT_EQUAL( "std::string value", s3 );
s3 = strStdWide;
CPPUNIT_ASSERT_EQUAL( "std::wstring value", s3 );
wxString s4("hello");
// notice that implicit wxString -> std::string conversion is only
// available in wxUSE_STL case, because it conflicts with conversion to
// const char*/wchar_t*
#if wxUSE_STL && wxUSE_UNSAFE_WXSTRING_CONV
std::string s5 = s4;
#else
std::string s5 = s4.ToStdString();
#endif
CPPUNIT_ASSERT_EQUAL( "hello", s5 );
#if wxUSE_STL
wxStdWideString s6 = s4;
#else
wxStdWideString s6 = s4.ToStdWstring();
#endif
CPPUNIT_ASSERT_EQUAL( "hello", s6 );
#if wxUSE_UNSAFE_WXSTRING_CONV
std::string s7(s4);
CPPUNIT_ASSERT( s7 == "hello" );
#endif
wxStdWideString s8(s4);
CPPUNIT_ASSERT( s8 == "hello" );
#if wxUSE_UNICODE
std::string s9("\xF0\x9F\x90\xB1\0\xE7\x8C\xAB", 9); /* U+1F431 U+0000 U+732B */
wxString s10 = wxString::FromUTF8(s9);
CPPUNIT_ASSERT_EQUAL( s9, s10.ToStdString(wxConvUTF8) );
#endif // wxUSE_UNICODE
std::string s11("xyz\0\xFF", 5); /* an invalid UTF-8 sequence */
CPPUNIT_ASSERT_EQUAL( wxString::FromUTF8(s11), "" );
}
#endif // wxUSE_STD_STRING
void StdStringTestCase::StdAlgo()
{
wxString s("AB");
std::reverse(s.begin(), s.end());
CPPUNIT_ASSERT_EQUAL( "BA", s );
}