1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "locale_test.h"
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <locale>
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <stdexcept>
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <algorithm>
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <vector>
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottusing namespace std;
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// tests implementation
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott//
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::collate_facet()
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( has_facet<collate<char> >(locale::classic()) );
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    collate<char> const& col = use_facet<collate<char> >(locale::classic());
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char const str1[] = "abcdef1";
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char const str2[] = "abcdef2";
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1;
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1;
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 0 );
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( col.compare(str1, str1 + size1, str2, str2 + size2) == -1 );
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //Smallest string should be before largest one:
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == -1 );
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 1 );
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc("fr_FR");
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( has_facet<collate<char> >(loc) );
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      collate<char> const& col = use_facet<collate<char> >(loc);
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      char const str1[] = "abcdef1";
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      char const str2[] = "abcdef2";
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1;
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1;
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 0 );
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1, str2, str2 + size2) == -1 );
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      //Smallest string should be before largest one:
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == -1 );
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 1 );
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( has_facet<collate<char> >(loc) );
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      collate<char> const& col = use_facet<collate<char> >(loc);
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      string strs[] = {"abdd", "ab�d", "abbd", "abcd"};
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      string transformed[4];
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      for (size_t i = 0; i < 4; ++i) {
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        transformed[i] = col.transform(strs[i].data(), strs[i].data() + strs[i].size());
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      sort(strs, strs + 4, loc);
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[0] == "abbd" );
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[1] == "abcd" );
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[2] == "ab�d" );
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[3] == "abdd" );
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      sort(transformed, transformed + 4);
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + strs[0].size()) == transformed[0] );
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[1].data(), strs[1].data() + strs[1].size()) == transformed[1] );
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[2].data(), strs[2].data() + strs[2].size()) == transformed[2] );
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[3].data(), strs[3].data() + strs[3].size()) == transformed[3] );
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // Check empty string result in empty key.
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data()).empty() );
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // Check that only characters that matter are taken into accout to build the key.
82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + 2) == col.transform(strs[1].data(), strs[1].data() + 2) );
83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T)
85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( has_facet<collate<wchar_t> >(loc) );
87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      collate<wchar_t> const& col = use_facet<collate<wchar_t> >(loc);
88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      wchar_t const str1[] = L"abcdef1";
90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      wchar_t const str2[] = L"abcdef2";
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1;
92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1;
93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 0 );
95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1, str2, str2 + size2) == -1 );
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      //Smallest string should be before largest one:
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == -1 );
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 1 );
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    {
102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      size_t i;
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( has_facet<collate<wchar_t> >(loc) );
104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      collate<wchar_t> const& col = use_facet<collate<wchar_t> >(loc);
105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // Here we would like to use L"ab�d" but it looks like all compilers
107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // do not support storage of unicode characters in exe resulting in
108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      // compilation error. We avoid this test for the moment.
109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      wstring strs[] = {L"abdd", L"abcd", L"abbd", L"abcd"};
110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      wstring transformed[4];
112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      for (i = 0; i < 4; ++i) {
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott        transformed[i] = col.transform(strs[i].data(), strs[i].data() + strs[i].size());
114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      }
115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      sort(strs, strs + 4, loc);
117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[0] == L"abbd" );
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[1] == L"abcd" );
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[2] == L"abcd" );
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( strs[3] == L"abdd" );
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      sort(transformed, transformed + 4);
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + strs[0].size()) == transformed[0] );
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[1].data(), strs[1].data() + strs[1].size()) == transformed[1] );
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[2].data(), strs[2].data() + strs[2].size()) == transformed[2] );
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[3].data(), strs[3].data() + strs[3].size()) == transformed[3] );
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data()).empty() );
130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + 2) == col.transform(strs[1].data(), strs[1].data() + 2) );
132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    }
133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const&) {
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_MESSAGE("No french locale to check collate facet");
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottvoid LocaleTest::collate_by_name()
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  /*
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   * Check of the 22.1.1.2.7 standard point. Construction of a locale
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   * instance from a null pointer or an unknown name should result in
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   * a runtime_error exception.
147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott   */
148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)
149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if defined (STLPORT) || !defined (__GNUC__)
150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), new collate_byname<char>(static_cast<char const*>(0)));
152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
153e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const& /* e */) {
155e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //CPPUNIT_MESSAGE( e.what() );
156e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
157e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), new collate_byname<char>("yasli_language"));
164e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
165e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
166e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const& /* e */) {
167e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //CPPUNIT_MESSAGE( e.what() );
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
171e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
172e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
173e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
174e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    string veryLongFacetName("LC_COLLATE=");
175e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    veryLongFacetName.append(512, '?');
176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), new collate_byname<char>(veryLongFacetName.c_str()));
177e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
178e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
179e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const& /* e */) {
180e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //CPPUNIT_MESSAGE( e.what() );
181e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
182e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
183e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
187e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), "C", locale::collate);
188e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
189e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const& e) {
190e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_MESSAGE( e.what() );
191e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
192e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
193e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
194e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
195e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
196e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
197e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
198e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // On platform without real localization support we should rely on the "C" facet.
199e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), "", locale::collate);
200e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
201e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const& e) {
202e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_MESSAGE( e.what() );
203e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
204e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
205e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
206e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
207e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
208e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
209e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
210e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), new collate_byname<char>("C"));
211e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
212e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //We check that the C locale gives a lexicographical comparison:
213e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    collate<char> const& cfacet_byname = use_facet<collate<char> >(loc);
214e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    collate<char> const& cfacet = use_facet<collate<char> >(locale::classic());
215e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
216e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char const str1[] = "abcdef1";
217e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    char const str2[] = "abcdef2";
218e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1;
219e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1;
220e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
221e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) ==
222e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    cfacet.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) );
223e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1, str2, str2 + size2) ==
224e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    cfacet.compare(str1, str1 + size1, str2, str2 + size2) );
225e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
226e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    //Smallest string should be before largest one:
227e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) ==
228e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    cfacet.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) );
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) ==
230e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    cfacet.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) );
231e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
232e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // We cannot play with '�' char here because doing so would make test result
233e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    // dependant on char being consider as signed or not...
234e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    string strs[] = {"abdd", /* "ab�d",*/ "abbd", "abcd"};
235e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<string> v1(strs, strs + sizeof(strs) / sizeof(strs[0]));
237e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    sort(v1.begin(), v1.end(), loc);
238e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    vector<string> v2(strs, strs + sizeof(strs) / sizeof(strs[0]));
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    sort(v2.begin(), v2.end(), locale::classic());
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( v1 == v2 );
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_ASSERT( (cfacet_byname.transform(v1[0].data(), v1[0].data() + v1[0].size()).compare(cfacet_byname.transform(v1[1].data(), v1[1].data() + v1[1].size())) ==
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott                    v1[0].compare(v1[1])) );
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
245e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const& /* e */) {
246e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    /* CPPUNIT_MESSAGE( e.what() ); */
247e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
248e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
249e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
250e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
251e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
252e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
253e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T)
254e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      if defined (STLPORT) || !defined (__GNUC__)
255e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
256e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), new collate_byname<wchar_t>(static_cast<char const*>(0)));
257e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
258e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
259e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const&) {
260e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
261e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
262e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
263e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
264e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#      endif
265e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
266e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  try {
267e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    locale loc(locale::classic(), new collate_byname<wchar_t>("yasli_language"));
268e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
269e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
270e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (runtime_error const&) {
271e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
272e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  catch (...) {
273e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    CPPUNIT_FAIL;
274e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
275e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#    endif
276e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
277e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
278e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
279e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
280