// 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( (unsigned long)3147483647, wxStrtoul_l(wxT("3147483647"), NULL, 0, loc) ); CPPUNIT_ASSERT_EQUAL( (unsigned long)0xEE6B2800, wxStrtoul_l(wxT("0xEE6B2800"), NULL, 0, loc) ); // TODO: test for "failure" behaviour of the functions above }
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 }
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) ); }