// Purpose: wxStringTokenizer unit test
// Author: Vadim Zeitlin
// Created: 2005-12-20 (extacted from strings.cpp)
-// RCS-ID: $Id$
// Copyright: (c) 2004-2005 Vadim Zeitlin
///////////////////////////////////////////////////////////////////////////////
CPPUNIT_TEST_SUITE( TokenizerTestCase );
CPPUNIT_TEST( GetCount );
CPPUNIT_TEST( GetPosition );
+ CPPUNIT_TEST( GetString );
+ CPPUNIT_TEST( LastDelimiter );
CPPUNIT_TEST( StrtokCompat );
CPPUNIT_TEST_SUITE_END();
void GetCount();
void GetPosition();
+ void GetString();
+ void LastDelimiter();
void StrtokCompat();
DECLARE_NO_COPY_CLASS(TokenizerTestCase)
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( TokenizerTestCase );
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TokenizerTestCase, "TokenizerTestCase" );
// ----------------------------------------------------------------------------
}
gs_testData[] =
{
- { _T(""), _T(" "), wxTOKEN_DEFAULT , 0 },
- { _T("Hello, world"), _T(" "), wxTOKEN_DEFAULT , 2 },
- { _T("Hello, world "), _T(" "), wxTOKEN_DEFAULT , 2 },
- { _T("Hello, world"), _T(","), wxTOKEN_DEFAULT , 2 },
- { _T("Hello, world!"), _T(",!"), wxTOKEN_DEFAULT , 2 },
- { _T("Hello,, world!"), _T(",!"), wxTOKEN_DEFAULT , 3 },
- { _T("Hello,, world!"), _T(",!"), wxTOKEN_STRTOK , 2 },
- { _T("Hello, world!"), _T(",!"), wxTOKEN_RET_EMPTY_ALL, 3 },
- { _T("username:password:uid:gid:gecos:home:shell"),
- _T(":"), wxTOKEN_DEFAULT , 7 },
- { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_DEFAULT , 4 },
- { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_RET_EMPTY , 6 },
- { _T("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_RET_EMPTY_ALL, 9 },
- { _T("01/02/99"), _T("/-"), wxTOKEN_DEFAULT , 3 },
- { _T("01-02/99"), _T("/-"), wxTOKEN_RET_DELIMS , 3 },
+ { wxT(""), wxT(" "), wxTOKEN_DEFAULT, 0 },
+ { wxT(""), wxT(" "), wxTOKEN_RET_EMPTY, 0 },
+ { wxT(""), wxT(" "), wxTOKEN_RET_EMPTY_ALL, 0 },
+ { wxT(""), wxT(" "), wxTOKEN_RET_DELIMS, 0 },
+ { wxT(":"), wxT(":"), wxTOKEN_RET_EMPTY, 1 },
+ { wxT(":"), wxT(":"), wxTOKEN_RET_DELIMS, 1 },
+ { wxT(":"), wxT(":"), wxTOKEN_RET_EMPTY_ALL, 2 },
+ { wxT("::"), wxT(":"), wxTOKEN_RET_EMPTY, 1 },
+ { wxT("::"), wxT(":"), wxTOKEN_RET_DELIMS, 1 },
+ { wxT("::"), wxT(":"), wxTOKEN_RET_EMPTY_ALL, 3 },
+
+ { wxT("Hello, world"), wxT(" "), wxTOKEN_DEFAULT, 2 },
+ { wxT("Hello, world "), wxT(" "), wxTOKEN_DEFAULT, 2 },
+ { wxT("Hello, world"), wxT(","), wxTOKEN_DEFAULT, 2 },
+ { wxT("Hello, world!"), wxT(",!"), wxTOKEN_DEFAULT, 2 },
+ { wxT("Hello,, world!"), wxT(",!"), wxTOKEN_DEFAULT, 3 },
+ { wxT("Hello,, world!"), wxT(",!"), wxTOKEN_STRTOK, 2 },
+ { wxT("Hello, world!"), wxT(",!"), wxTOKEN_RET_EMPTY_ALL, 3 },
+
+ { wxT("username:password:uid:gid:gecos:home:shell"),
+ wxT(":"), wxTOKEN_DEFAULT, 7 },
+
+ { wxT("1:2::3:"), wxT(":"), wxTOKEN_DEFAULT, 4 },
+ { wxT("1:2::3:"), wxT(":"), wxTOKEN_RET_EMPTY, 4 },
+ { wxT("1:2::3:"), wxT(":"), wxTOKEN_RET_EMPTY_ALL, 5 },
+ { wxT("1:2::3:"), wxT(":"), wxTOKEN_RET_DELIMS, 4 },
+ { wxT("1:2::3:"), wxT(":"), wxTOKEN_STRTOK, 3 },
+
+ { wxT("1:2::3::"), wxT(":"), wxTOKEN_DEFAULT, 4 },
+ { wxT("1:2::3::"), wxT(":"), wxTOKEN_RET_EMPTY, 4 },
+ { wxT("1:2::3::"), wxT(":"), wxTOKEN_RET_EMPTY_ALL, 6 },
+ { wxT("1:2::3::"), wxT(":"), wxTOKEN_RET_DELIMS, 4 },
+ { wxT("1:2::3::"), wxT(":"), wxTOKEN_STRTOK, 3 },
+
+ { wxT("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_DEFAULT, 4 },
+ { wxT("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_STRTOK, 4 },
+ { wxT("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_RET_EMPTY, 6 },
+ { wxT("1 \t3\t4 6 "), wxDEFAULT_DELIMITERS, wxTOKEN_RET_EMPTY_ALL, 9 },
+
+ { wxT("01/02/99"), wxT("/-"), wxTOKEN_DEFAULT, 3 },
+ { wxT("01-02/99"), wxT("/-"), wxTOKEN_RET_DELIMS, 3 },
};
+// helper function returning the string showing the index for which the test
+// fails in the diagnostic message
+static std::string Nth(size_t n)
+{
+ return std::string(wxString::Format(wxT("for loop index %lu"),
+ (unsigned long)n).mb_str());
+}
+
// ----------------------------------------------------------------------------
// the tests
// ----------------------------------------------------------------------------
const TokenizerTestData& ttd = gs_testData[n];
wxStringTokenizer tkz(ttd.str, ttd.delims, ttd.mode);
- CPPUNIT_ASSERT( tkz.CountTokens() == ttd.count );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( Nth(n), ttd.count, tkz.CountTokens() );
size_t count = 0;
while ( tkz.HasMoreTokens() )
count++;
}
- CPPUNIT_ASSERT_EQUAL( ttd.count, count );
+ CPPUNIT_ASSERT_EQUAL_MESSAGE( Nth(n), ttd.count, count );
}
}
void TokenizerTestCase::GetPosition()
{
- DoTestGetPosition(_T("foo"), _T("_"), 3, 0);
- DoTestGetPosition(_T("foo_bar"), _T("_"), 4, 7, 0);
- DoTestGetPosition(_T("foo_bar_"), _T("_"), 4, 8, 0);
+ DoTestGetPosition(wxT("foo"), wxT("_"), 3, 0);
+ DoTestGetPosition(wxT("foo_bar"), wxT("_"), 4, 7, 0);
+ DoTestGetPosition(wxT("foo_bar_"), wxT("_"), 4, 8, 0);
+}
+
+// helper for GetString(): the parameters are the same as for DoTestGetPosition
+// but it checks GetString() return value instead of GetPosition()
+static void
+DoTestGetString(const wxChar *s, const wxChar *delims, int pos, ...)
+{
+ wxStringTokenizer tkz(s, delims);
+
+ CPPUNIT_ASSERT_EQUAL( wxString(s), tkz.GetString() );
+
+ va_list ap;
+ va_start(ap, pos);
+
+ for ( ;; )
+ {
+ if ( !pos )
+ {
+ CPPUNIT_ASSERT( tkz.GetString().empty() ) ;
+ break;
+ }
+
+ tkz.GetNextToken();
+
+ CPPUNIT_ASSERT_EQUAL( wxString(s + pos), tkz.GetString() );
+
+ pos = va_arg(ap, int);
+ }
+
+ va_end(ap);
+}
+
+void TokenizerTestCase::GetString()
+{
+ DoTestGetString(wxT("foo"), wxT("_"), 3, 0);
+ DoTestGetString(wxT("foo_bar"), wxT("_"), 4, 7, 0);
+ DoTestGetString(wxT("foo_bar_"), wxT("_"), 4, 8, 0);
+}
+
+void TokenizerTestCase::LastDelimiter()
+{
+ wxStringTokenizer tkz(wxT("a+-b=c"), wxT("+-="));
+
+ tkz.GetNextToken();
+ CPPUNIT_ASSERT_EQUAL( wxT('+'), tkz.GetLastDelimiter() );
+
+ tkz.GetNextToken();
+ CPPUNIT_ASSERT_EQUAL( wxT('-'), tkz.GetLastDelimiter() );
+
+ tkz.GetNextToken();
+ CPPUNIT_ASSERT_EQUAL( wxT('='), tkz.GetLastDelimiter() );
+
+ tkz.GetNextToken();
+ CPPUNIT_ASSERT_EQUAL( wxT('\0'), tkz.GetLastDelimiter() );
}
void TokenizerTestCase::StrtokCompat()
if ( ttd.mode != wxTOKEN_STRTOK )
continue;
- wxCharBuffer buf(ttd.str);
+#if wxUSE_UNICODE
+ wxWCharBuffer
+#else
+ wxCharBuffer
+#endif
+ buf(ttd.str);
wxChar *last;
wxChar *s = wxStrtok(buf.data(), ttd.delims, &last);