| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: tests/xlocale/xlocale.cpp
- // Purpose: wxXLocale & related unit test
- // Author: Brian Vanderburg II, Vadim Zeitlin
- // Created: 2008-01-16
- // Copyright: (c) 2008 Brian Vanderburg II
- // 2008 Vadim Zeitlin <vadim@wxwidgets.org>
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- // ----------------------------------------------------------------------------
- // headers
- // ----------------------------------------------------------------------------
- #include "testprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #if wxUSE_XLOCALE
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif // WX_PRECOMP
- #include "wx/xlocale.h"
- // --------------------------------------------------------------------------
- // test class
- // --------------------------------------------------------------------------
- class XLocaleTestCase : public CppUnit::TestCase
- {
- public:
- XLocaleTestCase() { }
- private:
- CPPUNIT_TEST_SUITE( XLocaleTestCase );
- CPPUNIT_TEST( TestCtor );
- CPPUNIT_TEST( PreserveLocale );
- CPPUNIT_TEST( TestCtypeFunctions );
- CPPUNIT_TEST( TestStdlibFunctions );
- CPPUNIT_TEST_SUITE_END();
- void TestCtor();
- void PreserveLocale();
- void TestCtypeFunctions();
- void TestStdlibFunctions();
- void TestCtypeFunctionsWith(const wxXLocale& loc);
- void TestStdlibFunctionsWith(const wxXLocale& loc);
- DECLARE_NO_COPY_CLASS(XLocaleTestCase)
- };
- // register in the unnamed registry so that these tests are run by default
- CPPUNIT_TEST_SUITE_REGISTRATION( XLocaleTestCase );
- // also include in its own registry so that these tests can be run alone
- CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( XLocaleTestCase, "XLocaleTestCase" );
- // test the different wxXLocale ctors
- void XLocaleTestCase::TestCtor()
- {
- CPPUNIT_ASSERT( !wxXLocale().IsOk() );
- CPPUNIT_ASSERT( wxCLocale.IsOk() );
- CPPUNIT_ASSERT( wxXLocale("C").IsOk() );
- CPPUNIT_ASSERT( !wxXLocale("bloordyblop").IsOk() );
- if (!wxLocale::IsAvailable(wxLANGUAGE_FRENCH))
- return; // you should have french support installed to continue this test!
- #ifdef wxHAS_XLOCALE_SUPPORT
- CPPUNIT_ASSERT( wxXLocale(wxLANGUAGE_FRENCH).IsOk() );
- #ifdef __WINDOWS__
- CPPUNIT_ASSERT( wxXLocale("french").IsOk() );
- #else
- CPPUNIT_ASSERT( wxXLocale("fr_FR").IsOk() );
- #endif
- #endif
- }
- void XLocaleTestCase::PreserveLocale()
- {
- // Test that using locale functions doesn't change the global C locale.
- const wxString origLocale(setlocale(LC_ALL, NULL));
- wxStrtod_l(wxT("1.234"), NULL, wxCLocale);
- CPPUNIT_ASSERT_EQUAL( origLocale, setlocale(LC_ALL, NULL) );
- }
- // test the ctype functions with the given locale
- void XLocaleTestCase::TestCtypeFunctionsWith(const wxXLocale& loc)
- {
- // NOTE: here go the checks which must pass under _any_ locale "loc";
- // checks for specific locales are in TestCtypeFunctions()
- // isalnum
- CPPUNIT_ASSERT( wxIsalnum_l('0', loc) );
- CPPUNIT_ASSERT( wxIsalnum_l('9', loc) );
- CPPUNIT_ASSERT( wxIsalnum_l('A', loc) );
- CPPUNIT_ASSERT( wxIsalnum_l('Z', loc) );
- CPPUNIT_ASSERT( wxIsalnum_l('a', loc) );
- CPPUNIT_ASSERT( wxIsalnum_l('z', loc) );
- CPPUNIT_ASSERT( !wxIsalnum_l('*', loc) );
- CPPUNIT_ASSERT( !wxIsalnum_l('@', loc) );
- CPPUNIT_ASSERT( !wxIsalnum_l('+', loc) );
- // isalpha
- CPPUNIT_ASSERT( !wxIsalpha_l('0', loc) );
- CPPUNIT_ASSERT( !wxIsalpha_l('9', loc) );
- CPPUNIT_ASSERT( wxIsalpha_l('A', loc) );
- CPPUNIT_ASSERT( wxIsalpha_l('Z', loc) );
- CPPUNIT_ASSERT( wxIsalpha_l('a', loc) );
- CPPUNIT_ASSERT( wxIsalpha_l('z', loc) );
- CPPUNIT_ASSERT( !wxIsalpha_l('*', loc) );
- CPPUNIT_ASSERT( !wxIsalpha_l('@', loc) );
- CPPUNIT_ASSERT( !wxIsalpha_l('+', loc) );
- // TODO: iscntrl
- // isdigit
- CPPUNIT_ASSERT( wxIsdigit_l('0', loc) );
- CPPUNIT_ASSERT( wxIsdigit_l('9', loc) );
- CPPUNIT_ASSERT( !wxIsdigit_l('A', loc) );
- CPPUNIT_ASSERT( !wxIsdigit_l('Z', loc) );
- CPPUNIT_ASSERT( !wxIsdigit_l('a', loc) );
- CPPUNIT_ASSERT( !wxIsdigit_l('z', loc) );
- // TODO: isgraph
- // islower
- CPPUNIT_ASSERT( !wxIslower_l('A', loc) );
- CPPUNIT_ASSERT( !wxIslower_l('Z', loc) );
- CPPUNIT_ASSERT( wxIslower_l('a', loc) );
- CPPUNIT_ASSERT( wxIslower_l('z', loc) );
- CPPUNIT_ASSERT( !wxIslower_l('0', loc) );
- CPPUNIT_ASSERT( !wxIslower_l('9', loc) );
- // TODO: isprint
- // TODO: ispunct
- // isspace
- CPPUNIT_ASSERT( wxIsspace_l(' ', loc) );
- CPPUNIT_ASSERT( wxIsspace_l('\t', loc) );
- CPPUNIT_ASSERT( wxIsspace_l('\r', loc) );
- CPPUNIT_ASSERT( wxIsspace_l('\n', loc) );
- CPPUNIT_ASSERT( !wxIsspace_l('0', loc) );
- CPPUNIT_ASSERT( !wxIsspace_l('a', loc) );
- CPPUNIT_ASSERT( !wxIsspace_l('A', loc) );
- // isupper
- CPPUNIT_ASSERT( !wxIsupper_l('0', loc) );
- CPPUNIT_ASSERT( !wxIsupper_l('9', loc) );
- CPPUNIT_ASSERT( wxIsupper_l('A', loc) );
- CPPUNIT_ASSERT( wxIsupper_l('Z', loc) );
- CPPUNIT_ASSERT( !wxIsupper_l('a', loc) );
- CPPUNIT_ASSERT( !wxIsupper_l('z', loc) );
- // isxdigit
- CPPUNIT_ASSERT( wxIsxdigit_l('0', loc) );
- CPPUNIT_ASSERT( wxIsxdigit_l('9', loc) );
- CPPUNIT_ASSERT( wxIsxdigit_l('A', loc) );
- CPPUNIT_ASSERT( wxIsxdigit_l('F', loc) );
- CPPUNIT_ASSERT( !wxIsxdigit_l('Z', loc) );
- CPPUNIT_ASSERT( wxIsxdigit_l('a', loc) );
- CPPUNIT_ASSERT( wxIsxdigit_l('f', loc) );
- CPPUNIT_ASSERT( !wxIsxdigit_l('z', loc) );
- // tolower
- CPPUNIT_ASSERT_EQUAL( 'a', (char)wxTolower_l('A', loc) );
- CPPUNIT_ASSERT_EQUAL( 'a', (char)wxTolower_l('a', loc) );
- CPPUNIT_ASSERT_EQUAL( 'z', (char)wxTolower_l('Z', loc) );
- CPPUNIT_ASSERT_EQUAL( 'z', (char)wxTolower_l('z', loc) );
- CPPUNIT_ASSERT_EQUAL( '0', (char)wxTolower_l('0', loc) );
- CPPUNIT_ASSERT_EQUAL( '9', (char)wxTolower_l('9', loc) );
- // toupper
- CPPUNIT_ASSERT_EQUAL( 'A', (char)wxToupper_l('A', loc) );
- CPPUNIT_ASSERT_EQUAL( 'A', (char)wxToupper_l('a', loc) );
- CPPUNIT_ASSERT_EQUAL( 'Z', (char)wxToupper_l('Z', loc) );
- CPPUNIT_ASSERT_EQUAL( 'Z', (char)wxToupper_l('z', loc) );
- CPPUNIT_ASSERT_EQUAL( '0', (char)wxToupper_l('0', loc) );
- CPPUNIT_ASSERT_EQUAL( '9', (char)wxToupper_l('9', loc) );
- }
- // test the stdlib functions with the given locale
- void XLocaleTestCase::TestStdlibFunctionsWith(const wxXLocale& loc)
- {
- // NOTE: here go the checks which must pass under _any_ locale "loc";
- // checks for specific locales are in TestStdlibFunctions()
- #if wxUSE_UNICODE
- wchar_t* endptr;
- #else
- char* endptr;
- #endif
- // strtod (don't use decimal separator as it's locale-specific)
- CPPUNIT_ASSERT_EQUAL( 0.0, wxStrtod_l(wxT("0"), NULL, loc) );
- CPPUNIT_ASSERT_EQUAL( 1234.0, wxStrtod_l(wxT("1234"), NULL, loc) );
- // strtol
- endptr = NULL;
- CPPUNIT_ASSERT_EQUAL( 100, wxStrtol_l(wxT("100"), NULL, 0, loc) );
- CPPUNIT_ASSERT_EQUAL( 0xFF, wxStrtol_l(wxT("0xFF"), NULL, 0, loc) );
- CPPUNIT_ASSERT_EQUAL( 2001, wxStrtol_l(wxT("2001 60c0c0 -1101110100110100100000 0x6fffff"), &endptr, 10, loc) );
- CPPUNIT_ASSERT_EQUAL( 0x60c0c0, wxStrtol_l(endptr, &endptr, 16, loc) );
- CPPUNIT_ASSERT_EQUAL( -0x374D20, wxStrtol_l(endptr, &endptr, 2, loc) );
- CPPUNIT_ASSERT_EQUAL( 0x6fffff, wxStrtol_l(endptr, NULL, 0, loc) );
- // strtoul
- // NOTE: 3147483647 and 0xEE6B2800 are greater than LONG_MAX (on 32bit machines) but
- // smaller than ULONG_MAX
- CPPUNIT_ASSERT_EQUAL( 3147483647ul, wxStrtoul_l(wxT("3147483647"), NULL, 0, loc) );
- CPPUNIT_ASSERT_EQUAL( 0xEE6B2800ul, wxStrtoul_l(wxT("0xEE6B2800"), NULL, 0, loc) );
- // TODO: test for "failure" behaviour of the functions above
- }
- void XLocaleTestCase::TestCtypeFunctions()
- {
- TestCtypeFunctionsWith(wxCLocale);
- #ifdef wxHAS_XLOCALE_SUPPORT
- // french
- if (!wxLocale::IsAvailable(wxLANGUAGE_FRENCH))
- return; // you should have french support installed to continue this test!
- wxXLocale locFR(wxLANGUAGE_FRENCH);
- CPPUNIT_ASSERT( locFR.IsOk() ); // doesn't make sense to continue otherwise
- TestCtypeFunctionsWith(locFR);
- CPPUNIT_ASSERT( wxIsalpha_l(wxT('\xe9'), locFR) );
- CPPUNIT_ASSERT( wxIslower_l(wxT('\xe9'), locFR) );
- CPPUNIT_ASSERT( !wxIslower_l(wxT('\xc9'), locFR) );
- CPPUNIT_ASSERT( wxIsupper_l(wxT('\xc9'), locFR) );
- CPPUNIT_ASSERT( wxIsalpha_l(wxT('\xe7'), locFR) );
- CPPUNIT_ASSERT( wxIslower_l(wxT('\xe7'), locFR) );
- CPPUNIT_ASSERT( wxIsupper_l(wxT('\xc7'), locFR) );
- // italian
- if (!wxLocale::IsAvailable(wxLANGUAGE_ITALIAN))
- return; // you should have italian support installed to continue this test!
- wxXLocale locIT(wxLANGUAGE_ITALIAN);
- CPPUNIT_ASSERT( locIT.IsOk() ); // doesn't make sense to continue otherwise
- TestCtypeFunctionsWith(locIT);
- CPPUNIT_ASSERT( wxIsalpha_l(wxT('\xe1'), locIT) );
- CPPUNIT_ASSERT( wxIslower_l(wxT('\xe1'), locIT) );
- #endif
- }
- void XLocaleTestCase::TestStdlibFunctions()
- {
- TestStdlibFunctionsWith(wxCLocale);
- #if wxUSE_UNICODE
- wchar_t* endptr;
- #else
- char* endptr;
- #endif
- // strtod checks specific for C locale
- endptr = NULL;
- CPPUNIT_ASSERT_EQUAL( 0.0, wxStrtod_l(wxT("0.000"), NULL, wxCLocale) );
- CPPUNIT_ASSERT_EQUAL( 1.234, wxStrtod_l(wxT("1.234"), NULL, wxCLocale) );
- CPPUNIT_ASSERT_EQUAL( -1.234E-5, wxStrtod_l(wxT("-1.234E-5"), NULL, wxCLocale) );
- CPPUNIT_ASSERT_EQUAL( 365.24, wxStrtod_l(wxT("365.24 29.53"), &endptr, wxCLocale) );
- CPPUNIT_ASSERT_EQUAL( 29.53, wxStrtod_l(endptr, NULL, wxCLocale) );
- #ifdef wxHAS_XLOCALE_SUPPORT
- // french
- if (!wxLocale::IsAvailable(wxLANGUAGE_FRENCH))
- return; // you should have french support installed to continue this test!
- wxXLocale locFR(wxLANGUAGE_FRENCH);
- CPPUNIT_ASSERT( locFR.IsOk() ); // doesn't make sense to continue otherwise
- TestCtypeFunctionsWith(locFR);
- // comma as decimal point:
- CPPUNIT_ASSERT_EQUAL( 1.234, wxStrtod_l(wxT("1,234"), NULL, locFR) );
- // space as thousands separator is not recognized by wxStrtod_l():
- CPPUNIT_ASSERT( 1234.5 != wxStrtod_l(wxT("1 234,5"), NULL, locFR) );
- // italian
- if (!wxLocale::IsAvailable(wxLANGUAGE_ITALIAN))
- return; // you should have italian support installed to continue this test!
- wxXLocale locIT(wxLANGUAGE_ITALIAN);
- CPPUNIT_ASSERT( locIT.IsOk() ); // doesn't make sense to continue otherwise
- TestStdlibFunctionsWith(locIT);
- // comma as decimal point:
- CPPUNIT_ASSERT_EQUAL( 1.234, wxStrtod_l(wxT("1,234"), NULL, locIT) );
- // dot as thousands separator is not recognized by wxStrtod_l():
- CPPUNIT_ASSERT( 1234.5 != wxStrtod_l(wxT("1.234,5"), NULL, locIT) );
- #endif
- }
- #endif // wxUSE_XLOCALE
|