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