mirror of
https://github.com/reactos/reactos.git
synced 2024-10-21 00:18:26 +00:00
298 lines
7.5 KiB
C++
298 lines
7.5 KiB
C++
|
#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
|