#include "locale_test.h" #if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) # include <locale> # include <sstream> # include <stdexcept> # include "complete_digits.h" # if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) using namespace std; # endif struct ref_locale { const char *name; const char *decimal_point; const char *thousands_sep; }; static const ref_locale tested_locales[] = { //{ name, decimal_point, thousands_sepy_thousands_sep}, # if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) { "fr_FR", ",", "\xa0"}, { "ru_RU.koi8r", ",", "."}, { "en_GB", ".", ","}, { "en_US", ".", ","}, # endif { "C", ".", ","}, }; // // tests implementation // void LocaleTest::_num_put_get( const locale& loc, const ref_locale* prl ) { const ref_locale& rl = *prl; CPPUNIT_ASSERT( has_facet<numpunct<char> >(loc) ); numpunct<char> const& npct = use_facet<numpunct<char> >(loc); CPPUNIT_ASSERT( npct.decimal_point() == *rl.decimal_point ); float val = 1234.56f; ostringstream fostr; fostr.imbue(loc); fostr << val; string ref = "1"; if (!npct.grouping().empty()) { ref += npct.thousands_sep(); } ref += "234"; ref += npct.decimal_point(); ref += "56"; //cout << "In " << loc.name() << " 1234.56 is written: " << fostr.str() << endl; CPPUNIT_ASSERT( fostr.str() == ref ); val = 12345678.9f; ref = "1"; ref += npct.decimal_point(); ref += "23457e+"; string digits = "7"; complete_digits(digits); ref += digits; fostr.str(""); fostr << val; CPPUNIT_ASSERT( fostr.str() == ref ); val = 1000000000.0f; fostr.str(""); fostr << val; digits = "9"; complete_digits(digits); CPPUNIT_ASSERT( fostr.str() == string("1e+") + digits ); val = 1234.0f; ref = "1"; if (!npct.grouping().empty()) { ref += npct.thousands_sep(); } ref += "234"; fostr.str(""); fostr << val; CPPUNIT_ASSERT( fostr.str() == ref ); val = 10000001.0f; fostr.str(""); fostr << val; digits = "7"; complete_digits(digits); CPPUNIT_ASSERT( fostr.str() == string("1e+") + digits ); if (npct.grouping().size() == 1 && npct.grouping()[0] == 3) { int ival = 1234567890; fostr.str(""); fostr << ival; ref = "1"; ref += npct.thousands_sep(); ref += "234"; ref += npct.thousands_sep(); ref += "567"; ref += npct.thousands_sep(); ref += "890"; CPPUNIT_ASSERT( fostr.str() == ref ); } #if defined (__BORLANDC__) num_put<char> const& nput = use_facet<num_put<char> >(loc); typedef numeric_limits<double> limd; fostr.setf(ios_base::uppercase | ios_base::showpos); if (limd::has_infinity) { double infinity = limd::infinity(); fostr.str(""); nput.put(fostr, fostr, ' ', infinity); CPPUNIT_ASSERT( fostr.str() == string("+Inf") ); } if (limd::has_quiet_NaN) { /* Ignore FPU exceptions */ unsigned int _float_control_word = _control87(0, 0); _control87(EM_INVALID|EM_INEXACT, MCW_EM); double qnan = limd::quiet_NaN(); /* Reset floating point control word */ _clear87(); _control87(_float_control_word, MCW_EM); fostr.str(""); nput.put(fostr, fostr, ' ', qnan); CPPUNIT_ASSERT( fostr.str() == string("+NaN") ); } #endif } typedef void (LocaleTest::*_Test) (const locale&, const ref_locale*); static void test_supported_locale(LocaleTest& inst, _Test __test) { size_t n = sizeof(tested_locales) / sizeof(tested_locales[0]); for (size_t i = 0; i < n; ++i) { locale loc; # if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) try # endif { locale tmp(tested_locales[i].name); loc = tmp; } # if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) catch (runtime_error const&) { //This locale is not supported. continue; } # endif CPPUNIT_MESSAGE( loc.name().c_str() ); (inst.*__test)(loc, tested_locales + i); { locale tmp(locale::classic(), tested_locales[i].name, locale::numeric); loc = tmp; } (inst.*__test)(loc, tested_locales + i); { locale tmp(locale::classic(), new numpunct_byname<char>(tested_locales[i].name)); loc = tmp; } (inst.*__test)(loc, tested_locales + i); } } void LocaleTest::num_put_get() { test_supported_locale(*this, &LocaleTest::_num_put_get); } void LocaleTest::numpunct_by_name() { /* * Check of the 22.1.1.2.7 standard point. Construction of a locale * instance from a null pointer or an unknown name should result in * a runtime_error exception. */ # if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) # if defined (STLPORT) || !defined (__GNUC__) try { locale loc(locale::classic(), new numpunct_byname<char>(static_cast<char const*>(0))); CPPUNIT_FAIL; } catch (runtime_error const& /* e */) { //CPPUNIT_MESSAGE( e.what() ); } catch (...) { CPPUNIT_FAIL; } # endif try { locale loc(locale::classic(), new numpunct_byname<char>("yasli_language")); CPPUNIT_FAIL; } catch (runtime_error const& /* e */) { //CPPUNIT_MESSAGE( e.what() ); } catch (...) { CPPUNIT_FAIL; } try { string veryLongFacetName("LC_NUMERIC="); veryLongFacetName.append(512, '?'); locale loc(locale::classic(), new numpunct_byname<char>(veryLongFacetName.c_str())); CPPUNIT_FAIL; } catch (runtime_error const& /* e */) { //CPPUNIT_MESSAGE( e.what() ); } catch (...) { CPPUNIT_FAIL; } try { locale loc(locale::classic(), "C", locale::numeric); } catch (runtime_error const& e) { CPPUNIT_MESSAGE( e.what() ); CPPUNIT_FAIL; } catch (...) { CPPUNIT_FAIL; } try { // On platform without real localization support we should rely on the "C" facet. locale loc(locale::classic(), "", locale::numeric); } catch (runtime_error const& e) { CPPUNIT_MESSAGE( e.what() ); CPPUNIT_FAIL; } catch (...) { CPPUNIT_FAIL; } try { locale loc(locale::classic(), new numpunct_byname<char>("C")); numpunct<char> const& cfacet_byname = use_facet<numpunct<char> >(loc); numpunct<char> const& cfacet = use_facet<numpunct<char> >(locale::classic()); CPPUNIT_CHECK( cfacet_byname.decimal_point() == cfacet.decimal_point() ); CPPUNIT_CHECK( cfacet_byname.grouping() == cfacet.grouping() ); if (!cfacet.grouping().empty()) CPPUNIT_CHECK( cfacet_byname.thousands_sep() == cfacet.thousands_sep() ); # if !defined (STLPORT) || !defined (__GLIBC__) CPPUNIT_CHECK( cfacet_byname.truename() == cfacet.truename() ); CPPUNIT_CHECK( cfacet_byname.falsename() == cfacet.falsename() ); # endif } catch (runtime_error const& /* e */) { //CPPUNIT_MESSAGE( e.what() ); CPPUNIT_FAIL; } catch (...) { CPPUNIT_FAIL; } try { // On platform without real localization support we should rely on the "C" locale facet. locale loc(locale::classic(), new numpunct_byname<char>("")); } catch (runtime_error const& e) { CPPUNIT_MESSAGE( e.what() ); CPPUNIT_FAIL; } catch (...) { CPPUNIT_FAIL; } # if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T) # if defined (STLPORT) || !defined (__GNUC__) try { locale loc(locale::classic(), new numpunct_byname<wchar_t>(static_cast<char const*>(0))); CPPUNIT_FAIL; } catch (runtime_error const&) { } catch (...) { CPPUNIT_FAIL; } # endif try { locale loc(locale::classic(), new numpunct_byname<wchar_t>("yasli_language")); CPPUNIT_FAIL; } catch (runtime_error const&) { } catch (...) { CPPUNIT_FAIL; } # endif # endif } #endif