diff options
Diffstat (limited to 'test/unit/money_facets_test.cpp')
-rw-r--r-- | test/unit/money_facets_test.cpp | 655 |
1 files changed, 0 insertions, 655 deletions
diff --git a/test/unit/money_facets_test.cpp b/test/unit/money_facets_test.cpp deleted file mode 100644 index 5ace770..0000000 --- a/test/unit/money_facets_test.cpp +++ /dev/null @@ -1,655 +0,0 @@ -#include "locale_test.h" - -#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) -# include <locale> -# include <sstream> -# include <stdexcept> - -# if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) -using namespace std; -# endif - -struct ref_monetary { - const char *name; - const char *money_int_prefix; - const char *money_int_prefix_old; - const char *money_prefix; - const char *money_suffix; - const char *money_decimal_point; - const char *money_thousands_sep; -}; - -static const ref_monetary tested_locales[] = { -//{ name, money_int_prefix, money_int_prefix_old, money_prefix, money_suffix, money_decimal_point, money_thousands_sep}, -# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) - { "fr_FR", "EUR ", "FRF ", "", "", ",", -# if defined (WIN32) || defined (_WIN32) - "\xa0" }, -# else - " " }, -# endif - { "ru_RU.koi8r", "RUB ", "RUR ", "", "\xd2\xd5\xc2", ".", " " }, - { "en_GB", "GBP ", "", "\xa3", "", ".", "," }, - { "en_US", "USD ", "", "$", "", ".", "," }, -# endif - { "C", "", "", "", "", " ", " " }, -}; - - -const ref_monetary* LocaleTest::_get_ref_monetary(size_t i) -{ - if (i < sizeof(tested_locales) / sizeof(tested_locales[0])) { - return tested_locales + i; - } - return 0; -} - -const char* LocaleTest::_get_ref_monetary_name(const ref_monetary* _ref) -{ - return _ref->name; -} - -void LocaleTest::_money_put_get( const locale& loc, const ref_monetary* rl ) -{ - _money_put_get2(loc, loc, rl); -} - -void LocaleTest::_money_put_get2( const locale& loc, const locale& streamLoc, const ref_monetary* prl ) -{ - const ref_monetary &rl = *prl; - CPPUNIT_ASSERT( has_facet<money_put<char> >(loc) ); - money_put<char> const& fmp = use_facet<money_put<char> >(loc); - CPPUNIT_ASSERT( has_facet<money_get<char> >(loc) ); - money_get<char> const& fmg = use_facet<money_get<char> >(loc); - - ostringstream ostr; - ostr.imbue(streamLoc); - ostr << showbase; - - //Check a positive value (international format) - { - string str_res; - //money_put - { - CPPUNIT_ASSERT( (has_facet<moneypunct<char, true> >(loc)) ); - moneypunct<char, true> const& intl_fmp = use_facet<moneypunct<char, true> >(loc); - - ostreambuf_iterator<char, char_traits<char> > res = fmp.put(ostr, true, ostr, ' ', 123456); - - CPPUNIT_ASSERT( !res.failed() ); - str_res = ostr.str(); - //CPPUNIT_MESSAGE(str_res.c_str()); - - size_t fieldIndex = 0; - size_t index = 0; - - //On a positive value we skip the sign field if exists: - if (intl_fmp.pos_format().field[fieldIndex] == money_base::sign) { - ++fieldIndex; - } - // international currency abbreviation, if it is before value - - /* - * int_curr_symbol - * - * The international currency symbol. The operand is a four-character - * string, with the first three characters containing the alphabetic - * international currency symbol in accordance with those specified - * in the ISO 4217 specification. The fourth character is the character used - * to separate the international currency symbol from the monetary quantity. - * - * (http://www.opengroup.org/onlinepubs/7990989775/xbd/locale.html) - */ - string::size_type p = strlen( rl.money_int_prefix ); - if (p != 0) { - CPPUNIT_ASSERT( intl_fmp.pos_format().field[fieldIndex] == money_base::symbol ); - string::size_type p_old = strlen( rl.money_int_prefix_old ); - CPPUNIT_ASSERT( (str_res.substr(index, p) == rl.money_int_prefix) || - ((p_old != 0) && - (str_res.substr(index, p_old) == rl.money_int_prefix_old)) ); - if ( str_res.substr(index, p) == rl.money_int_prefix ) { - index += p; - } else { - index += p_old; - } - ++fieldIndex; - } - - // space after currency - if (intl_fmp.pos_format().field[fieldIndex] == money_base::space || - intl_fmp.pos_format().field[fieldIndex] == money_base::none) { - // iternational currency symobol has four chars, one of these chars - // is separator, so if format has space on this place, it should - // be skipped. - ++fieldIndex; - } - - // sign - if (intl_fmp.pos_format().field[fieldIndex] == money_base::sign) { - ++fieldIndex; - } - - // value - CPPUNIT_ASSERT( str_res[index++] == '1' ); - if (!intl_fmp.grouping().empty()) { - CPPUNIT_ASSERT( str_res[index++] == /* intl_fmp.thousands_sep() */ *rl.money_thousands_sep ); - } - CPPUNIT_ASSERT( str_res[index++] == '2' ); - CPPUNIT_ASSERT( str_res[index++] == '3' ); - CPPUNIT_ASSERT( str_res[index++] == '4' ); - if (intl_fmp.frac_digits() != 0) { - CPPUNIT_ASSERT( str_res[index++] == /* intl_fmp.decimal_point() */ *rl.money_decimal_point ); - } - CPPUNIT_ASSERT( str_res[index++] == '5' ); - CPPUNIT_ASSERT( str_res[index++] == '6' ); - ++fieldIndex; - - // sign - if (intl_fmp.pos_format().field[fieldIndex] == money_base::sign) { - ++fieldIndex; - } - - // space - if (intl_fmp.pos_format().field[fieldIndex] == money_base::space ) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - - // sign - if (intl_fmp.pos_format().field[fieldIndex] == money_base::sign) { - ++fieldIndex; - } - - //as space cannot be last the only left format can be none: - while ( fieldIndex < 3 ) { - CPPUNIT_ASSERT( intl_fmp.pos_format().field[fieldIndex] == money_base::none ); - ++fieldIndex; - } - } - - //money_get - { - ios_base::iostate err = ios_base::goodbit; - string digits; - - istringstream istr(str_res); - ostr.str( "" ); - ostr.clear(); - fmg.get(istr, istreambuf_iterator<char, char_traits<char> >(), true, ostr, err, digits); - CPPUNIT_ASSERT( (err & (ios_base::failbit | ios_base::badbit)) == 0 ); - CPPUNIT_ASSERT( digits == "123456" ); - } - } - - ostr.str(""); - //Check a negative value (national format) - { - CPPUNIT_ASSERT( (has_facet<moneypunct<char, false> >(loc)) ); - moneypunct<char, false> const& dom_fmp = use_facet<moneypunct<char, false> >(loc); - string str_res; - //Check money_put - { - ostreambuf_iterator<char, char_traits<char> > res = fmp.put(ostr, false, ostr, ' ', -123456); - - CPPUNIT_ASSERT( !res.failed() ); - str_res = ostr.str(); - //CPPUNIT_MESSAGE(str_res.c_str()); - - size_t fieldIndex = 0; - size_t index = 0; - - if (dom_fmp.neg_format().field[fieldIndex] == money_base::sign) { - CPPUNIT_ASSERT( str_res.substr(index, dom_fmp.negative_sign().size()) == dom_fmp.negative_sign() ); - index += dom_fmp.negative_sign().size(); - ++fieldIndex; - } - - string::size_type p = strlen( rl.money_prefix ); - if (p != 0) { - CPPUNIT_ASSERT( str_res.substr(index, p) == rl.money_prefix ); - index += p; - ++fieldIndex; - } - if (dom_fmp.neg_format().field[fieldIndex] == money_base::space || - dom_fmp.neg_format().field[fieldIndex] == money_base::none) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - - CPPUNIT_ASSERT( str_res[index++] == '1' ); - if (!dom_fmp.grouping().empty()) { - CPPUNIT_ASSERT( str_res[index++] == dom_fmp.thousands_sep() ); - } - CPPUNIT_ASSERT( str_res[index++] == '2' ); - CPPUNIT_ASSERT( str_res[index++] == '3' ); - CPPUNIT_ASSERT( str_res[index++] == '4' ); - if (dom_fmp.frac_digits() != 0) { - CPPUNIT_ASSERT( str_res[index++] == dom_fmp.decimal_point() ); - } - CPPUNIT_ASSERT( str_res[index++] == '5' ); - CPPUNIT_ASSERT( str_res[index++] == '6' ); - ++fieldIndex; - - //space cannot be last: - if ((fieldIndex < 3) && - dom_fmp.neg_format().field[fieldIndex] == money_base::space) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - - if (fieldIndex == 3) { - //If none is last we should not add anything to the resulting string: - if (dom_fmp.neg_format().field[fieldIndex] == money_base::none) { - CPPUNIT_ASSERT( index == str_res.size() ); - } else { - CPPUNIT_ASSERT( dom_fmp.neg_format().field[fieldIndex] == money_base::symbol ); - CPPUNIT_ASSERT( str_res.substr(index, strlen(rl.money_suffix)) == rl.money_suffix ); - } - } - } - - //money_get - { - ios_base::iostate err = ios_base::goodbit; -# if defined (STLPORT) - _STLP_LONGEST_FLOAT_TYPE val; -# else - long double val; -# endif - - istringstream istr(str_res); - fmg.get(istr, istreambuf_iterator<char, char_traits<char> >(), false, ostr, err, val); - CPPUNIT_ASSERT( (err & (ios_base::failbit | ios_base::badbit)) == 0 ); - if (dom_fmp.negative_sign().empty()) { - //Without negative sign there is no way to guess the resulting amount sign ("C" locale): - CPPUNIT_ASSERT( val == 123456 ); - } - else { - CPPUNIT_ASSERT( val == -123456 ); - } - } - } -} - - -// Test for bug in case when number of digits in value less then number -// of digits in fraction. I.e. '9' should be printed as '0.09', -// if x.frac_digits() == 2. - -void LocaleTest::_money_put_X_bug( const locale& loc, const ref_monetary* prl ) -{ - const ref_monetary &rl = *prl; - CPPUNIT_ASSERT( has_facet<money_put<char> >(loc) ); - money_put<char> const& fmp = use_facet<money_put<char> >(loc); - - ostringstream ostr; - ostr.imbue(loc); - ostr << showbase; - - // ostr.str(""); - // Check value with one decimal digit: - { - CPPUNIT_ASSERT( (has_facet<moneypunct<char, false> >(loc)) ); - moneypunct<char, false> const& dom_fmp = use_facet<moneypunct<char, false> >(loc); - string str_res; - // Check money_put - { - ostreambuf_iterator<char, char_traits<char> > res = fmp.put(ostr, false, ostr, ' ', 9); - - CPPUNIT_ASSERT( !res.failed() ); - str_res = ostr.str(); - - size_t fieldIndex = 0; - size_t index = 0; - - if (dom_fmp.pos_format().field[fieldIndex] == money_base::sign) { - CPPUNIT_ASSERT( str_res.substr(index, dom_fmp.positive_sign().size()) == dom_fmp.positive_sign() ); - index += dom_fmp.positive_sign().size(); - ++fieldIndex; - } - - string::size_type p = strlen( rl.money_prefix ); - if (p != 0) { - CPPUNIT_ASSERT( str_res.substr(index, p) == rl.money_prefix ); - index += p; - ++fieldIndex; - } - if (dom_fmp.neg_format().field[fieldIndex] == money_base::space || - dom_fmp.neg_format().field[fieldIndex] == money_base::none) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - if (dom_fmp.frac_digits() != 0) { - CPPUNIT_ASSERT( str_res[index++] == '0' ); - CPPUNIT_ASSERT( str_res[index++] == dom_fmp.decimal_point() ); - for ( int fd = 1; fd < dom_fmp.frac_digits(); ++fd ) { - CPPUNIT_ASSERT( str_res[index++] == '0' ); - } - } - CPPUNIT_ASSERT( str_res[index++] == '9' ); - ++fieldIndex; - - //space cannot be last: - if ((fieldIndex < 3) && - dom_fmp.neg_format().field[fieldIndex] == money_base::space) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - - if (fieldIndex == 3) { - //If none is last we should not add anything to the resulting string: - if (dom_fmp.neg_format().field[fieldIndex] == money_base::none) { - CPPUNIT_ASSERT( index == str_res.size() ); - } else { - CPPUNIT_ASSERT( dom_fmp.neg_format().field[fieldIndex] == money_base::symbol ); - CPPUNIT_ASSERT( str_res.substr(index, strlen(rl.money_suffix)) == rl.money_suffix ); - } - } - } - } - - ostr.str(""); - // Check value with two decimal digit: - { - CPPUNIT_ASSERT( (has_facet<moneypunct<char, false> >(loc)) ); - moneypunct<char, false> const& dom_fmp = use_facet<moneypunct<char, false> >(loc); - string str_res; - // Check money_put - { - ostreambuf_iterator<char, char_traits<char> > res = fmp.put(ostr, false, ostr, ' ', 90); - - CPPUNIT_ASSERT( !res.failed() ); - str_res = ostr.str(); - - size_t fieldIndex = 0; - size_t index = 0; - - if (dom_fmp.pos_format().field[fieldIndex] == money_base::sign) { - CPPUNIT_ASSERT( str_res.substr(index, dom_fmp.positive_sign().size()) == dom_fmp.positive_sign() ); - index += dom_fmp.positive_sign().size(); - ++fieldIndex; - } - - string::size_type p = strlen( rl.money_prefix ); - if (p != 0) { - CPPUNIT_ASSERT( str_res.substr(index, p) == rl.money_prefix ); - index += p; - ++fieldIndex; - } - if (dom_fmp.neg_format().field[fieldIndex] == money_base::space || - dom_fmp.neg_format().field[fieldIndex] == money_base::none) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - if (dom_fmp.frac_digits() != 0) { - CPPUNIT_ASSERT( str_res[index++] == '0' ); - CPPUNIT_ASSERT( str_res[index++] == dom_fmp.decimal_point() ); - for ( int fd = 1; fd < dom_fmp.frac_digits() - 1; ++fd ) { - CPPUNIT_ASSERT( str_res[index++] == '0' ); - } - } - CPPUNIT_ASSERT( str_res[index++] == '9' ); - if (dom_fmp.frac_digits() != 0) { - CPPUNIT_ASSERT( str_res[index++] == '0' ); - } - ++fieldIndex; - - //space cannot be last: - if ((fieldIndex < 3) && - dom_fmp.neg_format().field[fieldIndex] == money_base::space) { - CPPUNIT_ASSERT( str_res[index++] == ' ' ); - ++fieldIndex; - } - - if (fieldIndex == 3) { - //If none is last we should not add anything to the resulting string: - if (dom_fmp.neg_format().field[fieldIndex] == money_base::none) { - CPPUNIT_ASSERT( index == str_res.size() ); - } else { - CPPUNIT_ASSERT( dom_fmp.neg_format().field[fieldIndex] == money_base::symbol ); - CPPUNIT_ASSERT( str_res.substr(index, strlen(rl.money_suffix)) == rl.money_suffix ); - } - } - } - } -} - -typedef void (LocaleTest::*_Test) (const locale&, const ref_monetary*); -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::monetary); - loc = tmp; - } - (inst.*__test)(loc, tested_locales + i); - - { - locale tmp0(locale::classic(), new moneypunct_byname<char, true>(tested_locales[i].name)); - locale tmp1(tmp0, new moneypunct_byname<char, false>(tested_locales[i].name)); - loc = tmp1; - } - (inst.*__test)(loc, tested_locales + i); - } -} - -void LocaleTest::money_put_get() -{ test_supported_locale(*this, &LocaleTest::_money_put_get); } - -void LocaleTest::money_put_X_bug() -{ test_supported_locale(*this, &LocaleTest::_money_put_X_bug); } - -void LocaleTest::moneypunct_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 moneypunct_byname<char, true>(static_cast<char const*>(0))); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } -# endif - - try { - locale loc(locale::classic(), new moneypunct_byname<char, true>("yasli_language")); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } - - try { - string veryLongFacetName("LC_MONETARY="); - veryLongFacetName.append(512, '?'); - locale loc(locale::classic(), new moneypunct_byname<char, true>(veryLongFacetName.c_str())); - CPPUNIT_FAIL; - } - catch (runtime_error const& /* e */) { - //CPPUNIT_MESSAGE( e.what() ); - } - catch (...) { - CPPUNIT_FAIL; - } - -# if defined (STLPORT) || !defined (__GNUC__) - try { - locale loc(locale::classic(), new moneypunct_byname<char, false>(static_cast<char const*>(0))); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } -# endif - - try { - locale loc(locale::classic(), new moneypunct_byname<char, false>("yasli_language")); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } - - try { - string veryLongFacetName("LC_MONETARY="); - veryLongFacetName.append(512, '?'); - locale loc(locale::classic(), new moneypunct_byname<char, false>(veryLongFacetName.c_str())); - CPPUNIT_FAIL; - } - catch (runtime_error const& /* e */) { - //CPPUNIT_MESSAGE( e.what() ); - } - catch (...) { - CPPUNIT_FAIL; - } - - try { - locale loc(locale::classic(), new moneypunct_byname<char, false>("C")); - moneypunct<char, false> const& cfacet_byname = use_facet<moneypunct<char, false> >(loc); - moneypunct<char, false> const& cfacet = use_facet<moneypunct<char, false> >(locale::classic()); - - money_base::pattern cp = cfacet.pos_format(); - money_base::pattern cp_bn = cfacet_byname.pos_format(); - CPPUNIT_CHECK( cp_bn.field[0] == cp.field[0] ); - CPPUNIT_CHECK( cp_bn.field[1] == cp.field[1] ); - CPPUNIT_CHECK( cp_bn.field[2] == cp.field[2] ); - CPPUNIT_CHECK( cp_bn.field[3] == cp.field[3] ); - - CPPUNIT_CHECK( cfacet_byname.frac_digits() == cfacet.frac_digits() ); - if (cfacet_byname.frac_digits() != 0) - CPPUNIT_CHECK( cfacet_byname.decimal_point() == cfacet.decimal_point() ); - CPPUNIT_CHECK( cfacet_byname.grouping() == cfacet.grouping() ); - if (!cfacet_byname.grouping().empty()) - CPPUNIT_CHECK( cfacet_byname.thousands_sep() == cfacet.thousands_sep() ); - CPPUNIT_CHECK( cfacet_byname.positive_sign() == cfacet.positive_sign() ); - CPPUNIT_CHECK( cfacet_byname.negative_sign() == cfacet.negative_sign() ); - } - catch (runtime_error const& /* e */) { - /* CPPUNIT_MESSAGE( e.what() ); */ - CPPUNIT_FAIL; - } - catch (...) { - CPPUNIT_FAIL; - } - - try { - locale loc(locale::classic(), new moneypunct_byname<char, true>("C")); - moneypunct<char, true> const& cfacet_byname = use_facet<moneypunct<char, true> >(loc); - moneypunct<char, true> const& cfacet = use_facet<moneypunct<char, true> >(locale::classic()); - - money_base::pattern cp = cfacet.pos_format(); - money_base::pattern cp_bn = cfacet_byname.pos_format(); - CPPUNIT_CHECK( cp_bn.field[0] == cp.field[0] ); - CPPUNIT_CHECK( cp_bn.field[1] == cp.field[1] ); - CPPUNIT_CHECK( cp_bn.field[2] == cp.field[2] ); - CPPUNIT_CHECK( cp_bn.field[3] == cp.field[3] ); - - CPPUNIT_CHECK( cfacet_byname.frac_digits() == cfacet.frac_digits() ); - if (cfacet_byname.frac_digits() != 0) - CPPUNIT_CHECK( cfacet_byname.decimal_point() == cfacet.decimal_point() ); - CPPUNIT_CHECK( cfacet_byname.grouping() == cfacet.grouping() ); - if (!cfacet_byname.grouping().empty()) - CPPUNIT_CHECK( cfacet_byname.thousands_sep() == cfacet.thousands_sep() ); - CPPUNIT_CHECK( cfacet_byname.positive_sign() == cfacet.positive_sign() ); - CPPUNIT_CHECK( cfacet_byname.negative_sign() == cfacet.negative_sign() ); - } - 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 moneypunct_byname<char, false>("")); - } - 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 moneypunct_byname<wchar_t, true>(static_cast<char const*>(0))); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } -# endif - - try { - locale loc(locale::classic(), new moneypunct_byname<wchar_t, true>("yasli_language")); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } - -# if defined (STLPORT) || !defined (__GNUC__) - try { - locale loc(locale::classic(), new moneypunct_byname<wchar_t, false>(static_cast<char const*>(0))); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } -# endif - - try { - locale loc(locale::classic(), new moneypunct_byname<wchar_t, false>("yasli_language")); - CPPUNIT_FAIL; - } - catch (runtime_error const&) { - } - catch (...) { - CPPUNIT_FAIL; - } -# endif -# endif -} - -#endif |