Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygencollate_facets_test.cpp
Go to the documentation of this file.
00001 #include "locale_test.h" 00002 00003 #if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS) 00004 # include <locale> 00005 # include <stdexcept> 00006 # include <algorithm> 00007 # include <vector> 00008 00009 # if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES) 00010 using namespace std; 00011 # endif 00012 00013 // 00014 // tests implementation 00015 // 00016 void LocaleTest::collate_facet() 00017 { 00018 { 00019 CPPUNIT_ASSERT( has_facet<collate<char> >(locale::classic()) ); 00020 collate<char> const& col = use_facet<collate<char> >(locale::classic()); 00021 00022 char const str1[] = "abcdef1"; 00023 char const str2[] = "abcdef2"; 00024 const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1; 00025 const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1; 00026 00027 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 0 ); 00028 CPPUNIT_ASSERT( col.compare(str1, str1 + size1, str2, str2 + size2) == -1 ); 00029 00030 //Smallest string should be before largest one: 00031 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == -1 ); 00032 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 1 ); 00033 } 00034 00035 # if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 00036 try { 00037 locale loc("fr_FR"); 00038 { 00039 CPPUNIT_ASSERT( has_facet<collate<char> >(loc) ); 00040 collate<char> const& col = use_facet<collate<char> >(loc); 00041 00042 char const str1[] = "abcdef1"; 00043 char const str2[] = "abcdef2"; 00044 const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1; 00045 const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1; 00046 00047 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 0 ); 00048 CPPUNIT_ASSERT( col.compare(str1, str1 + size1, str2, str2 + size2) == -1 ); 00049 00050 //Smallest string should be before largest one: 00051 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == -1 ); 00052 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 1 ); 00053 } 00054 { 00055 CPPUNIT_ASSERT( has_facet<collate<char> >(loc) ); 00056 collate<char> const& col = use_facet<collate<char> >(loc); 00057 00058 string strs[] = {"abdd", "abçd", "abbd", "abcd"}; 00059 00060 string transformed[4]; 00061 for (size_t i = 0; i < 4; ++i) { 00062 transformed[i] = col.transform(strs[i].data(), strs[i].data() + strs[i].size()); 00063 } 00064 00065 sort(strs, strs + 4, loc); 00066 CPPUNIT_ASSERT( strs[0] == "abbd" ); 00067 CPPUNIT_ASSERT( strs[1] == "abcd" ); 00068 CPPUNIT_ASSERT( strs[2] == "abçd" ); 00069 CPPUNIT_ASSERT( strs[3] == "abdd" ); 00070 00071 sort(transformed, transformed + 4); 00072 00073 CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + strs[0].size()) == transformed[0] ); 00074 CPPUNIT_ASSERT( col.transform(strs[1].data(), strs[1].data() + strs[1].size()) == transformed[1] ); 00075 CPPUNIT_ASSERT( col.transform(strs[2].data(), strs[2].data() + strs[2].size()) == transformed[2] ); 00076 CPPUNIT_ASSERT( col.transform(strs[3].data(), strs[3].data() + strs[3].size()) == transformed[3] ); 00077 00078 // Check empty string result in empty key. 00079 CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data()).empty() ); 00080 00081 // Check that only characters that matter are taken into accout to build the key. 00082 CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + 2) == col.transform(strs[1].data(), strs[1].data() + 2) ); 00083 } 00084 # if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T) 00085 { 00086 CPPUNIT_ASSERT( has_facet<collate<wchar_t> >(loc) ); 00087 collate<wchar_t> const& col = use_facet<collate<wchar_t> >(loc); 00088 00089 wchar_t const str1[] = L"abcdef1"; 00090 wchar_t const str2[] = L"abcdef2"; 00091 const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1; 00092 const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1; 00093 00094 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 0 ); 00095 CPPUNIT_ASSERT( col.compare(str1, str1 + size1, str2, str2 + size2) == -1 ); 00096 00097 //Smallest string should be before largest one: 00098 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == -1 ); 00099 CPPUNIT_ASSERT( col.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 1 ); 00100 } 00101 { 00102 size_t i; 00103 CPPUNIT_ASSERT( has_facet<collate<wchar_t> >(loc) ); 00104 collate<wchar_t> const& col = use_facet<collate<wchar_t> >(loc); 00105 00106 // Here we would like to use L"abçd" but it looks like all compilers 00107 // do not support storage of unicode characters in exe resulting in 00108 // compilation error. We avoid this test for the moment. 00109 wstring strs[] = {L"abdd", L"abcd", L"abbd", L"abcd"}; 00110 00111 wstring transformed[4]; 00112 for (i = 0; i < 4; ++i) { 00113 transformed[i] = col.transform(strs[i].data(), strs[i].data() + strs[i].size()); 00114 } 00115 00116 sort(strs, strs + 4, loc); 00117 CPPUNIT_ASSERT( strs[0] == L"abbd" ); 00118 CPPUNIT_ASSERT( strs[1] == L"abcd" ); 00119 CPPUNIT_ASSERT( strs[2] == L"abcd" ); 00120 CPPUNIT_ASSERT( strs[3] == L"abdd" ); 00121 00122 sort(transformed, transformed + 4); 00123 00124 CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + strs[0].size()) == transformed[0] ); 00125 CPPUNIT_ASSERT( col.transform(strs[1].data(), strs[1].data() + strs[1].size()) == transformed[1] ); 00126 CPPUNIT_ASSERT( col.transform(strs[2].data(), strs[2].data() + strs[2].size()) == transformed[2] ); 00127 CPPUNIT_ASSERT( col.transform(strs[3].data(), strs[3].data() + strs[3].size()) == transformed[3] ); 00128 00129 CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data()).empty() ); 00130 00131 CPPUNIT_ASSERT( col.transform(strs[0].data(), strs[0].data() + 2) == col.transform(strs[1].data(), strs[1].data() + 2) ); 00132 } 00133 # endif 00134 } 00135 catch (runtime_error const&) { 00136 CPPUNIT_MESSAGE("No french locale to check collate facet"); 00137 } 00138 # endif 00139 } 00140 00141 void LocaleTest::collate_by_name() 00142 { 00143 /* 00144 * Check of the 22.1.1.2.7 standard point. Construction of a locale 00145 * instance from a null pointer or an unknown name should result in 00146 * a runtime_error exception. 00147 */ 00148 # if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS) 00149 # if defined (STLPORT) || !defined (__GNUC__) 00150 try { 00151 locale loc(locale::classic(), new collate_byname<char>(static_cast<char const*>(0))); 00152 CPPUNIT_FAIL; 00153 } 00154 catch (runtime_error const& /* e */) { 00155 //CPPUNIT_MESSAGE( e.what() ); 00156 } 00157 catch (...) { 00158 CPPUNIT_FAIL; 00159 } 00160 # endif 00161 00162 try { 00163 locale loc(locale::classic(), new collate_byname<char>("yasli_language")); 00164 CPPUNIT_FAIL; 00165 } 00166 catch (runtime_error const& /* e */) { 00167 //CPPUNIT_MESSAGE( e.what() ); 00168 } 00169 catch (...) { 00170 CPPUNIT_FAIL; 00171 } 00172 00173 try { 00174 string veryLongFacetName("LC_COLLATE="); 00175 veryLongFacetName.append(512, '?'); 00176 locale loc(locale::classic(), new collate_byname<char>(veryLongFacetName.c_str())); 00177 CPPUNIT_FAIL; 00178 } 00179 catch (runtime_error const& /* e */) { 00180 //CPPUNIT_MESSAGE( e.what() ); 00181 } 00182 catch (...) { 00183 CPPUNIT_FAIL; 00184 } 00185 00186 try { 00187 locale loc(locale::classic(), "C", locale::collate); 00188 } 00189 catch (runtime_error const& e) { 00190 CPPUNIT_MESSAGE( e.what() ); 00191 CPPUNIT_FAIL; 00192 } 00193 catch (...) { 00194 CPPUNIT_FAIL; 00195 } 00196 00197 try { 00198 // On platform without real localization support we should rely on the "C" facet. 00199 locale loc(locale::classic(), "", locale::collate); 00200 } 00201 catch (runtime_error const& e) { 00202 CPPUNIT_MESSAGE( e.what() ); 00203 CPPUNIT_FAIL; 00204 } 00205 catch (...) { 00206 CPPUNIT_FAIL; 00207 } 00208 00209 try { 00210 locale loc(locale::classic(), new collate_byname<char>("C")); 00211 00212 //We check that the C locale gives a lexicographical comparison: 00213 collate<char> const& cfacet_byname = use_facet<collate<char> >(loc); 00214 collate<char> const& cfacet = use_facet<collate<char> >(locale::classic()); 00215 00216 char const str1[] = "abcdef1"; 00217 char const str2[] = "abcdef2"; 00218 const size_t size1 = sizeof(str1) / sizeof(str1[0]) - 1; 00219 const size_t size2 = sizeof(str2) / sizeof(str2[0]) - 1; 00220 00221 CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) == 00222 cfacet.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 1) ); 00223 CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1, str2, str2 + size2) == 00224 cfacet.compare(str1, str1 + size1, str2, str2 + size2) ); 00225 00226 //Smallest string should be before largest one: 00227 CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) == 00228 cfacet.compare(str1, str1 + size1 - 2, str2, str2 + size2 - 1) ); 00229 CPPUNIT_ASSERT( cfacet_byname.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) == 00230 cfacet.compare(str1, str1 + size1 - 1, str2, str2 + size2 - 2) ); 00231 00232 // We cannot play with 'ç' char here because doing so would make test result 00233 // dependant on char being consider as signed or not... 00234 string strs[] = {"abdd", /* "abçd",*/ "abbd", "abcd"}; 00235 00236 vector<string> v1(strs, strs + sizeof(strs) / sizeof(strs[0])); 00237 sort(v1.begin(), v1.end(), loc); 00238 vector<string> v2(strs, strs + sizeof(strs) / sizeof(strs[0])); 00239 sort(v2.begin(), v2.end(), locale::classic()); 00240 CPPUNIT_ASSERT( v1 == v2 ); 00241 00242 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())) == 00243 v1[0].compare(v1[1])) ); 00244 } 00245 catch (runtime_error const& /* e */) { 00246 /* CPPUNIT_MESSAGE( e.what() ); */ 00247 CPPUNIT_FAIL; 00248 } 00249 catch (...) { 00250 CPPUNIT_FAIL; 00251 } 00252 00253 # if !defined (STLPORT) || !defined (_STLP_NO_WCHAR_T) 00254 # if defined (STLPORT) || !defined (__GNUC__) 00255 try { 00256 locale loc(locale::classic(), new collate_byname<wchar_t>(static_cast<char const*>(0))); 00257 CPPUNIT_FAIL; 00258 } 00259 catch (runtime_error const&) { 00260 } 00261 catch (...) { 00262 CPPUNIT_FAIL; 00263 } 00264 # endif 00265 00266 try { 00267 locale loc(locale::classic(), new collate_byname<wchar_t>("yasli_language")); 00268 CPPUNIT_FAIL; 00269 } 00270 catch (runtime_error const&) { 00271 } 00272 catch (...) { 00273 CPPUNIT_FAIL; 00274 } 00275 # endif 00276 # endif 00277 } 00278 00279 #endif Generated on Sat May 26 2012 04:34:11 for ReactOS by
1.7.6.1
|