ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

collate_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.