X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a6121fc4e06c935848b6887f3ac10995784231ae..14a83cbf361d8bd14aad290a87df7d00bbd6656a:/tests/datetime/datetimetest.cpp diff --git a/tests/datetime/datetimetest.cpp b/tests/datetime/datetimetest.cpp index 24f554e37b..a9992e71bd 100644 --- a/tests/datetime/datetimetest.cpp +++ b/tests/datetime/datetimetest.cpp @@ -23,6 +23,7 @@ #if wxUSE_DATETIME #include "wx/datetime.h" +#include "wx/wxcrt.h" // for wxStrstr() // need this to be able to use CPPUNIT_ASSERT_EQUAL with wxDateTime objects static std::ostream& operator<<(std::ostream& ostr, const wxDateTime& dt) @@ -82,6 +83,61 @@ private: #endif // CHANGE_SYSTEM_DATE +// helper class setting the locale to "C" for its lifetime +class CLocaleSetter +{ +public: + CLocaleSetter() : m_locOld(setlocale(LC_ALL, "C")) { } + ~CLocaleSetter() { setlocale(LC_ALL, m_locOld); } + +private: + const char * const m_locOld; + wxDECLARE_NO_COPY_CLASS(CLocaleSetter); +}; + +// helper function translating week day/month names from English to the current +// locale +static wxString TranslateDate(const wxString& str) +{ + // small optimization: if there are no alphabetic characters in the string, + // there is nothing to translate + wxString::const_iterator i, end = str.end(); + for ( i = str.begin(); i != end; ++i ) + { + if ( isalpha(*i) ) + break; + } + + if ( i == end ) + return str; + + wxString trans(str); + + for ( wxDateTime::WeekDay wd = wxDateTime::Sun; + wd < wxDateTime::Inv_WeekDay; + wxNextWDay(wd) ) + { + trans.Replace + ( + wxDateTime::GetEnglishWeekDayName(wd, wxDateTime::Name_Abbr), + wxDateTime::GetWeekDayName(wd, wxDateTime::Name_Abbr) + ); + } + + for ( wxDateTime::Month mon = wxDateTime::Jan; + mon < wxDateTime::Inv_Month; + wxNextMonth(mon) ) + { + trans.Replace + ( + wxDateTime::GetEnglishMonthName(mon, wxDateTime::Name_Abbr), + wxDateTime::GetMonthName(mon, wxDateTime::Name_Abbr) + ); + } + + return trans; +} + // ---------------------------------------------------------------------------- // broken down date representation used for testing // ---------------------------------------------------------------------------- @@ -648,7 +704,7 @@ void DateTimeTestCase::TestTimeFormat() for ( size_t n = 0; n < WXSIZEOF(formatTestFormats); n++ ) { const char *fmt = formatTestFormats[n].format; - + // skip the check with %p for those locales which have empty AM/PM strings: // for those locales it's impossible to pass the test with %p... wxString am, pm; @@ -671,12 +727,14 @@ void DateTimeTestCase::TestTimeFormat() } else // conversion succeeded { - // ParseFormat() should have parsed the entire string or left - // some final useless strings (e.g. with Italian locale the - // 's' string for the first test date looks like - // "---> sab 29 mag 1976 18:30:00 CET" - // so we just need to ignore CET) - CPPUNIT_ASSERT( !*result || strcmp(result, "CET") == 0 ); + // currently ParseFormat() doesn't support "%Z" and so is + // incapable of parsing time zone part used at the end of date + // representations in many (but not "C") locales, compensate + // for it ourselves by simply consuming and ignoring it + while ( *result && (*result >= 'A' && *result <= 'Z') ) + result++; + + CPPUNIT_ASSERT( !*result ); switch ( kind ) { @@ -906,15 +964,24 @@ void DateTimeTestCase::TestDateParse() for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ ) { - if ( dt.ParseDate(parseTestDates[n].str) ) + const wxString datestr = TranslateDate(parseTestDates[n].str); + + const char * const end = dt.ParseDate(datestr); + if ( end && !*end ) { - CPPUNIT_ASSERT( parseTestDates[n].good ); + WX_ASSERT_MESSAGE( + ("Erroneously parsed \"%s\"", datestr), + parseTestDates[n].good + ); CPPUNIT_ASSERT_EQUAL( parseTestDates[n].date.DT(), dt ); } else // failed to parse { - CPPUNIT_ASSERT( !parseTestDates[n].good ); + WX_ASSERT_MESSAGE( + ("Failed to parse \"%s\"", datestr), + !parseTestDates[n].good + ); } } } @@ -1006,18 +1073,32 @@ void DateTimeTestCase::TestDateTimeParse() { 22, wxDateTime::Nov, 2007, 19, 40, 0}, true }, }; - // special cases + // the test strings here use "PM" which is not available in all locales so + // we need to use "C" locale for them + CLocaleSetter cloc; + wxDateTime dt; for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ ) { - if ( dt.ParseDateTime(parseTestDates[n].str) ) + const wxString datestr = TranslateDate(parseTestDates[n].str); + + const char * const end = dt.ParseDateTime(datestr); + if ( end && !*end ) { - CPPUNIT_ASSERT( parseTestDates[n].good ); + WX_ASSERT_MESSAGE( + ("Erroneously parsed \"%s\"", datestr), + parseTestDates[n].good + ); CPPUNIT_ASSERT_EQUAL( parseTestDates[n].date.DT(), dt ); } else // failed to parse { + WX_ASSERT_MESSAGE( + ("Failed to parse \"%s\"", datestr), + !parseTestDates[n].good + ); + CPPUNIT_ASSERT( !parseTestDates[n].good ); } }