1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "locale_test.h" 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <sstream> 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <locale> 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include <stdexcept> 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std; 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic const char* tested_locales[] = { 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//name, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott "fr_FR", 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott "ru_RU.koi8r", 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott "en_GB", 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott "en_US", 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott "", 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott "C" 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick ScottCPPUNIT_TEST_SUITE_REGISTRATION(LocaleTest); 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttypedef void (LocaleTest::*_Test) (const locale&); 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic void test_supported_locale(LocaleTest &inst, _Test __test) { 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t n = sizeof(tested_locales) / sizeof(tested_locales[0]); 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (size_t i = 0; i < n; ++i) { 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc; 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale tmp(tested_locales[i]); 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = tmp; 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const&) { 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //This locale is not supported. 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott continue; 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE( loc.name().c_str() ); 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (inst.*__test)(loc); 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::locale_by_name() { 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Check of the 22.1.1.2.7 standard point. Construction of a locale 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * instance from a null pointer or an unknown name should result in 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * a runtime_error exception. 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(static_cast<char const*>(0)); 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const&) { 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc("yasli_language"); 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const& /* e */) { 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_MESSAGE( e.what() ); 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string very_large_locale_name(1024, '?'); 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(very_large_locale_name.c_str()); 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const& /* e */) { 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_MESSAGE( e.what() ); 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (STLPORT) || !defined (_MSC_VER) || (_MSC_VER > 1400) 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string very_large_locale_name("LC_CTYPE="); 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott very_large_locale_name.append(1024, '?'); 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(very_large_locale_name.c_str()); 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const& /* e */) { 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_MESSAGE( e.what() ); 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string very_large_locale_name("LC_ALL="); 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott very_large_locale_name.append(1024, '?'); 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(very_large_locale_name.c_str()); 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const& /* e */) { 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //CPPUNIT_MESSAGE( e.what() ); 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc("C"); 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const& /* e */) { 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* CPPUNIT_MESSAGE( e.what() ); */ 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // On platform without real localization support we should rely on the "C" locale facet. 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(""); 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const& /* e */) { 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* CPPUNIT_MESSAGE( e.what() ); */ 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (...) { 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::loc_has_facet() { 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc("C"); 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef numpunct<char> implemented_facet; 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( has_facet<implemented_facet>(loc) ); 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef num_put<char, back_insert_iterator<string> > not_implemented_facet; 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( !has_facet<not_implemented_facet>(loc) ); 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::locale_init_problem() { 156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES) 157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott test_supported_locale(*this, &LocaleTest::_locale_init_problem); 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Creation of a locale instance imply initialization of some STLport internal 163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * static objects first. We use a static instance of locale to check that this 164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * initialization is done correctly. 165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic locale global_loc; 167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstatic locale other_loc(""); 168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES) 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::_locale_init_problem( const locale& loc) 171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (__APPLE__) && !defined (__FreeBSD__) || \ 173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott !defined(__GNUC__) || ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__> 3))) 174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef codecvt<char,char,mbstate_t> my_facet; 175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# else 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// std::mbstate_t required for gcc 3.3.2 on FreeBSD... 177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// I am not sure what key here---FreeBSD or 3.3.2... 178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// - ptr 2005-04-04 179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef codecvt<char,char,std::mbstate_t> my_facet; 180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc_ref(global_loc); 183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale gloc( loc_ref, new my_facet() ); 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( has_facet<my_facet>( gloc ) ); 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //The following code is just here to try to confuse the reference counting underlying mecanism: 187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::global( locale::classic() ); 188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale::global( gloc ); 189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream os("test") ; 195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc2( loc, new my_facet() ); 196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_ASSERT( has_facet<my_facet>( loc2 ) ); 197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott os.imbue( loc2 ); 198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch ( runtime_error& ) { 201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch ( ... ) { 204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream os2("test2"); 212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch ( runtime_error& ) { 215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch ( ... ) { 218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::default_locale() 225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc( "" ); 227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass dummy_facet : public locale::facet { 230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic: 231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static locale::id id; 232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottlocale::id dummy_facet::id; 235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::combine() 237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ 238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if (!defined (STLPORT) || \ 239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott (defined (_STLP_USE_EXCEPTIONS) && !defined (_STLP_NO_MEMBER_TEMPLATES) && !defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS))) 240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(""); 243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!has_facet<messages<char> >(loc)) { 244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc.combine<messages<char> >(loc); 245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (const runtime_error & /* e */) { 249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* CPPUNIT_MESSAGE( e.what() ); */ 250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc; 254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!has_facet<dummy_facet>(loc)) { 255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc.combine<dummy_facet>(loc); 256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_FAIL; 257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (const runtime_error & /* e */) { 260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott /* CPPUNIT_MESSAGE( e.what() ); */ 261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc1(locale::classic()), loc2; 265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t loc1_index = 0; 266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott for (size_t i = 0; _get_ref_monetary(i) != 0; ++i) { 267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott try { 268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc(_get_ref_monetary_name(_get_ref_monetary(i))); 270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (loc1 == locale::classic()) 271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc1 = loc; 273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc1_index = i; 274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott continue; 275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else 277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc2 = loc; 279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 280e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 281e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 282e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //We can start the test 283e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostringstream ostr; 284e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ostr << "combining '" << loc2.name() << "' money facets with '" << loc1.name() << "'"; 285e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott CPPUNIT_MESSAGE( ostr.str().c_str() ); 286e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 287e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //We are going to combine money facets as all formats are different. 288e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 289e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //We check that resulting locale has correctly acquire loc2 facets. 290e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc = loc1.combine<moneypunct<char, true> >(loc2); 291e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = loc.combine<moneypunct<char, false> >(loc2); 292e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = loc.combine<money_put<char> >(loc2); 293e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = loc.combine<money_get<char> >(loc2); 294e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 295e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Check loc has the correct facets: 296e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _money_put_get2(loc2, loc, _get_ref_monetary(i)); 297e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 298e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Check loc1 has not been impacted: 299e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _money_put_get2(loc1, loc1, _get_ref_monetary(loc1_index)); 300e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 301e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Check loc2 has not been impacted: 302e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _money_put_get2(loc2, loc2, _get_ref_monetary(i)); 303e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 304e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 305e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //We check that resulting locale has not wrongly acquire loc1 facets that hasn't been combine: 306e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale loc = loc2.combine<numpunct<char> >(loc1); 307e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = loc.combine<time_put<char> >(loc1); 308e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc = loc.combine<time_get<char> >(loc1); 309e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 310e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Check loc has the correct facets: 311e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _money_put_get2(loc2, loc, _get_ref_monetary(i)); 312e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 313e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Check loc1 has not been impacted: 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _money_put_get2(loc1, loc1, _get_ref_monetary(loc1_index)); 315e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 316e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //Check loc2 has not been impacted: 317e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _money_put_get2(loc2, loc2, _get_ref_monetary(i)); 318e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 319e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { 321e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Check auto combination do not result in weird reference counting behavior 322e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // (might generate a crash). 323e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc1.combine<numpunct<char> >(loc1); 324e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 325e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 326e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc1 = loc2; 327e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott loc1_index = i; 328e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 329e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catch (runtime_error const&) { 330e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //This locale is not supported. 331e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott continue; 332e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 333e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 334e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif 335e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 336e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 337e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 338