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