CPPUNIT_TEST( Extraction );
CPPUNIT_TEST( Find );
CPPUNIT_TEST( Tokenizer );
+ CPPUNIT_TEST( TokenizerGetPosition );
CPPUNIT_TEST( Replace );
CPPUNIT_TEST( Match );
CPPUNIT_TEST( CaseChanges );
void Find();
void SingleTokenizerTest( wxChar *str, wxChar *delims, size_t count , wxStringTokenizerMode mode );
void Tokenizer();
+ void TokenizerGetPosition();
void Replace();
void Match();
void CaseChanges();
#if wxUSE_WCHAR_T
void StringTestCase::ConstructorsWithConversion()
{
- // Déj`a in UTF-8 and wchar_t:
- const char utf8[] = {0x44,0xC3,0xA9,0x6A,0xC3,0xA0,0};
+ // the string "Déjà" in UTF-8 and wchar_t:
+ const unsigned char utf8Buf[] = {0x44,0xC3,0xA9,0x6A,0xC3,0xA0,0};
const wchar_t wchar[] = {0x44,0xE9,0x6A,0xE0,0};
- const char utf8sub[] = {0x44,0xC3,0xA9,0x6A,0}; // "Dej"
-
+ const unsigned char utf8subBuf[] = {0x44,0xC3,0xA9,0x6A,0}; // just "Déj"
+ const char *utf8 = (char *)utf8Buf;
+ const char *utf8sub = (char *)utf8subBuf;
+
wxString s1(utf8, wxConvUTF8);
wxString s2(wchar, wxConvUTF8);
wxString s4(wchar, wxConvUTF8, 3);
CPPUNIT_ASSERT( s3 == sub );
- CPPUNIT_ASSERT( s4 == sub );
+ CPPUNIT_ASSERT( s4 == sub );
}
#endif
void StringTestCase::Conversion()
{
#if wxUSE_UNICODE
- wxString szTheString(wxT("TheString"));
- szTheString.insert(3, 1, '\0');
+ wxString szTheString(L"The\0String", wxConvLibc, 10);
wxCharBuffer theBuffer = szTheString.mb_str();
-
- CPPUNIT_ASSERT( memcmp(theBuffer.data(), "The\0String", 11) == 0 );
+
+ CPPUNIT_ASSERT( memcmp(theBuffer.data(), "The\0String", 11) == 0 );
+
+ wxString szTheString2("The\0String", wxConvLocal, 10);
+ CPPUNIT_ASSERT( wxMemcmp(szTheString2.c_str(), L"The\0String", 11) == 0 );
#else
-# if wxUSE_WCHAR_T
+# if wxUSE_WCHAR_T
wxString szTheString(wxT("TheString"));
szTheString.insert(3, 1, '\0');
wxWCharBuffer theBuffer = szTheString.wc_str(wxConvLibc);
-
- CPPUNIT_ASSERT( memcmp(theBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 );
+
+ CPPUNIT_ASSERT( memcmp(theBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 );
wxString szLocalTheString(wxT("TheString"));
szLocalTheString.insert(3, 1, '\0');
wxWCharBuffer theLocalBuffer = szLocalTheString.wc_str(wxConvLocal);
-
- CPPUNIT_ASSERT( memcmp(theLocalBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 );
-# endif
+
+ CPPUNIT_ASSERT( memcmp(theLocalBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 );
+# endif
#endif
}
wxChar *buf, *s = NULL, *last;
if ( tkz.GetMode() == wxTOKEN_STRTOK )
- {
- buf = new wxChar[wxStrlen(str) + 1];
- wxStrcpy(buf, str);
- s = wxStrtok(buf, delims, &last);
- }
- else
- {
- buf = NULL;
- }
-
- size_t count2 = 0;
- while ( tkz.HasMoreTokens() )
- {
- wxString token = tkz.GetNextToken();
- if ( buf )
- {
- CPPUNIT_ASSERT( token == s );
- s = wxStrtok(NULL, delims, &last);
- }
- count2++;
- }
-
- CPPUNIT_ASSERT( count2 == count );
- if ( buf )
- {
- delete [] buf;
- }
+ {
+ buf = new wxChar[wxStrlen(str) + 1];
+ wxStrcpy(buf, str);
+ s = wxStrtok(buf, delims, &last);
+ }
+ else
+ {
+ buf = NULL;
+ }
+
+ size_t count2 = 0;
+ while ( tkz.HasMoreTokens() )
+ {
+ wxString token = tkz.GetNextToken();
+ if ( buf )
+ {
+ CPPUNIT_ASSERT( token == s );
+ s = wxStrtok(NULL, delims, &last);
+ }
+ count2++;
+ }
+
+ CPPUNIT_ASSERT( count2 == count );
+ if ( buf )
+ {
+ delete [] buf;
+ }
}
void StringTestCase::Tokenizer()
SingleTokenizerTest( _T("01-02/99"), _T("/-"), 3, wxTOKEN_RET_DELIMS );
}
+// call this with the string to tokenize, delimeters to use and the expected
+// positions (i.e. results of GetPosition()) after each GetNextToken() call,
+// terminate positions with 0
+static void
+DoTokenizerGetPosition(const wxChar *s, const wxChar *delims, int pos, ...)
+{
+ wxStringTokenizer tkz(s, delims);
+
+ CPPUNIT_ASSERT( tkz.GetPosition() == 0 );
+
+ va_list ap;
+ va_start(ap, pos);
+
+ for ( ;; )
+ {
+ if ( !pos )
+ {
+ CPPUNIT_ASSERT( !tkz.HasMoreTokens() );
+ break;
+ }
+
+ tkz.GetNextToken();
+
+ CPPUNIT_ASSERT( tkz.GetPosition() == (size_t)pos );
+
+ pos = va_arg(ap, int);
+ }
+
+ va_end(ap);
+}
+
+void StringTestCase::TokenizerGetPosition()
+{
+ DoTokenizerGetPosition(_T("foo"), _T("_"), 3, 0);
+ DoTokenizerGetPosition(_T("foo_bar"), _T("_"), 4, 7, 0);
+ DoTokenizerGetPosition(_T("foo_bar_"), _T("_"), 4, 8, 0);
+}
+
void StringTestCase::Replace()
{
#define TEST_REPLACE( original , pos , len , replacement , result ) \
wxString neq2 = wxT("AH");
wxString neq3 = wxT("AHHH");
wxString neq4 = wxT("AhH");
-
+
CPPUNIT_ASSERT( s1 == eq );
CPPUNIT_ASSERT( s1 != neq1 );
CPPUNIT_ASSERT( s1 != neq2 );
neq2.insert(1,1,'\0');
neq3.insert(1,1,'\0');
neq4.insert(1,1,'\0');
-
+
CPPUNIT_ASSERT( s1 == eq );
CPPUNIT_ASSERT( s1 != neq1 );
CPPUNIT_ASSERT( s1 != neq2 );
wxString neq = wxT("HAH");
wxString neq2 = wxT("AH");
wxString neq3 = wxT("AHHH");
-
+
#define CPPUNIT_CNCEQ_ASSERT(s1, s2) CPPUNIT_ASSERT( s1.CmpNoCase(s2) == 0)
#define CPPUNIT_CNCNEQ_ASSERT(s1, s2) CPPUNIT_ASSERT( s1.CmpNoCase(s2) != 0)
// wxString _neq = wxT("H\0AH");
// wxString _neq2 = wxT("A\0H");
// wxString _neq3 = wxT("A\0HHH");
-
+
s1.insert(1,1,'\0');
eq.insert(1,1,'\0');
eq2.insert(1,1,'\0');
CPPUNIT_CNCNEQ_ASSERT( s1, neq );
CPPUNIT_CNCNEQ_ASSERT( s1, neq2 );
CPPUNIT_CNCNEQ_ASSERT( s1, neq3 );
-}
\ No newline at end of file
+}
+