X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/53e372c281e6780adc282d30e7e55c094e1b0e49..f521bae6653b1c2f0e196fb5c5550c03206e59ce:/include/wx/cppunit.h diff --git a/include/wx/cppunit.h b/include/wx/cppunit.h index fc9d5cf084..59f79b831d 100644 --- a/include/wx/cppunit.h +++ b/include/wx/cppunit.h @@ -55,6 +55,8 @@ #include #include "wx/afterstd.h" +#include "wx/string.h" + /////////////////////////////////////////////////////////////////////////////// // Set of helpful test macros. @@ -81,23 +83,128 @@ #define WXTEST_FAIL_WITH_CONDITION(suiteName, Condition, testMethod) \ WXTEST_ANY_WITH_CONDITION(suiteName, Condition, testMethod, CPPUNIT_TEST_FAIL(testMethod)) -// Use this macro to compare a wxString with a literal string. -#define WX_ASSERT_STR_EQUAL(p, s) CPPUNIT_ASSERT_EQUAL(wxString(p), s) +CPPUNIT_NS_BEGIN -// Use this macro to compare a size_t with a literal integer -#define WX_ASSERT_SIZET_EQUAL(n, m) CPPUNIT_ASSERT_EQUAL(((size_t)n), m) +// provide an overload of cppunit assertEquals(T, T) which can be used to +// compare wxStrings directly with C strings +inline void +assertEquals(const char *expected, + const wxString& actual, + CppUnit::SourceLine sourceLine, + const std::string& message) +{ + assertEquals(wxString(expected), actual, sourceLine, message); +} -/////////////////////////////////////////////////////////////////////////////// -// stream inserter for wxString +inline void +assertEquals(const wchar_t *expected, + const wxString& actual, + CppUnit::SourceLine sourceLine, + const std::string& message) +{ + assertEquals(wxString(expected), actual, sourceLine, message); +} + +#define WX_CPPUNIT_ASSERT_EQUALS(T1, T2) \ + inline void \ + assertEquals(T1 expected, \ + T2 actual, \ + CppUnit::SourceLine sourceLine, \ + const std::string& message) \ + { \ + if ( !assertion_traits::equal(expected,actual) ) \ + { \ + Asserter::failNotEqual( assertion_traits::toString(expected), \ + assertion_traits::toString(actual), \ + sourceLine, \ + message ); \ + } \ + } + +// and another to be able to specify (usually literal) ints as expected values +// for functions returning size_t +WX_CPPUNIT_ASSERT_EQUALS(int, size_t) + +// special section with VC6 workarounds: due to incorrect resolution of +// overloaded/template functions in this compiler (it basically doesn't use the +// template version at all if any overloaded function matches partially even if +// none of them matches fully) we also need +#ifdef __VISUALC6__ + +WX_CPPUNIT_ASSERT_EQUALS(int, int) +WX_CPPUNIT_ASSERT_EQUALS(size_t, size_t) + +#endif // VC6 + +CPPUNIT_NS_END + +// Use this macro to compare a wxArrayString with the pipe-separated elements +// of the given string // +// NB: it's a macro and not a function to have the correct line numbers in the +// test failure messages +#define WX_ASSERT_STRARRAY_EQUAL(s, a) \ + { \ + wxArrayString expected(wxSplit(s, '|', '\0')); \ + \ + CPPUNIT_ASSERT_EQUAL( expected.size(), a.size() ); \ + \ + for ( size_t n = 0; n < a.size(); n++ ) \ + { \ + CPPUNIT_ASSERT_EQUAL( expected[n], a[n] ); \ + } \ + } + +// Use this macro to assert with the given formatted message (it should contain +// the format string and arguments in a separate pair of parentheses) +#define WX_ASSERT_MESSAGE(msg, cond) \ + CPPUNIT_ASSERT_MESSAGE(std::string(wxString::Format msg .mb_str()), (cond)) + +#define WX_ASSERT_EQUAL_MESSAGE(msg, expected, actual) \ + CPPUNIT_ASSERT_EQUAL_MESSAGE(std::string(wxString::Format msg .mb_str()), \ + (expected), (actual)) + +/////////////////////////////////////////////////////////////////////////////// +// define stream inserter for wxString if it's not defined in the main library, +// we need it to output the test failures involving wxString +#if !wxUSE_STD_IOSTREAM #include "wx/string.h" +#include + inline std::ostream& operator<<(std::ostream& o, const wxString& s) { - return o << (const char *)wxSafeConvertWX2MB(s); +#if wxUSE_UNICODE + return o << (const char *)wxSafeConvertWX2MB(s.wc_str()); +#else + return o << s.c_str(); +#endif +} + +#endif // !wxUSE_STD_IOSTREAM + +// VC6 doesn't provide overloads for operator<<(__int64) in its stream classes +// so do it ourselves +#if defined(__VISUALC6__) && defined(wxLongLong_t) + +#include "wx/longlong.h" + +inline std::ostream& operator<<(std::ostream& ostr, wxLongLong_t ll) +{ + ostr << wxLongLong(ll).ToString(); + + return ostr; +} + +inline std::ostream& operator<<(std::ostream& ostr, unsigned wxLongLong_t llu) +{ + ostr << wxULongLong(llu).ToString(); + + return ostr; } +#endif // VC6 && wxLongLong_t /////////////////////////////////////////////////////////////////////////////// // Some more compiler warning tweaking and auto linking.