X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6e4ae332ac7d85be3592640ffef56a60924cc1c9..43c42c18d36c703a88b1b7b697bac27fe5608eca:/tests/xlocale/xlocale.cpp?ds=sidebyside diff --git a/tests/xlocale/xlocale.cpp b/tests/xlocale/xlocale.cpp index 9a6ba3aa36..2b3474b96f 100644 --- a/tests/xlocale/xlocale.cpp +++ b/tests/xlocale/xlocale.cpp @@ -39,13 +39,18 @@ public: 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) }; @@ -53,7 +58,7 @@ private: // register in the unnamed registry so that these tests are run by default CPPUNIT_TEST_SUITE_REGISTRATION( XLocaleTestCase ); -// 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( XLocaleTestCase, "XLocaleTestCase" ); @@ -63,17 +68,38 @@ 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() ); - CPPUNIT_ASSERT( wxXLocale("fr_FR").IsOk() ); +#ifdef __WINDOWS__ CPPUNIT_ASSERT( wxXLocale("french").IsOk() ); +#else + CPPUNIT_ASSERT( wxXLocale("fr_FR").IsOk() ); +#endif #endif - CPPUNIT_ASSERT( !wxXLocale("bloordyblop").IsOk() ); +} + +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) ); @@ -148,20 +174,54 @@ void XLocaleTestCase::TestCtypeFunctionsWith(const wxXLocale& loc) CPPUNIT_ASSERT( !wxIsxdigit_l('z', loc) ); // tolower - CPPUNIT_ASSERT_EQUAL( 'a', wxTolower_l('A', loc) ); - CPPUNIT_ASSERT_EQUAL( 'a', wxTolower_l('a', loc) ); - CPPUNIT_ASSERT_EQUAL( 'z', wxTolower_l('Z', loc) ); - CPPUNIT_ASSERT_EQUAL( 'z', wxTolower_l('z', loc) ); - CPPUNIT_ASSERT_EQUAL( '0', wxTolower_l('0', loc) ); - CPPUNIT_ASSERT_EQUAL( '9', wxTolower_l('9', loc) ); + 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', wxToupper_l('A', loc) ); - CPPUNIT_ASSERT_EQUAL( 'A', wxToupper_l('a', loc) ); - CPPUNIT_ASSERT_EQUAL( 'Z', wxToupper_l('Z', loc) ); - CPPUNIT_ASSERT_EQUAL( 'Z', wxToupper_l('z', loc) ); - CPPUNIT_ASSERT_EQUAL( '0', wxToupper_l('0', loc) ); - CPPUNIT_ASSERT_EQUAL( '9', wxToupper_l('9', loc) ); + 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() @@ -169,13 +229,93 @@ void XLocaleTestCase::TestCtypeFunctions() TestCtypeFunctionsWith(wxCLocale); #ifdef wxHAS_XLOCALE_SUPPORT - wxXLocale locFR("fr_FR"); + + // 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('é', locFR) ); - CPPUNIT_ASSERT( wxIslower_l('é', locFR) ); - CPPUNIT_ASSERT( !wxIslower_l('É', locFR) ); - CPPUNIT_ASSERT( wxIsupper_l('É', 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 }