ctype_facets_test.cpp

来自「stl的源码」· C++ 代码 · 共 430 行

CPP
430
字号
#include "locale_test.h"#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)#  include <locale>#  include <stdexcept>#  if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)using namespace std;#  endifstatic const char* tested_locales[] = {//name,#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)  // We need exception support to check support of the following localizations.  "fr_FR",  "ru_RU.koi8r",  "en_GB",  "en_US",#  endif  "",  "C"};//// tests implementation//void LocaleTest::_ctype_facet( const locale& loc){  CPPUNIT_ASSERT( has_facet<ctype<char> >(loc) );  ctype<char> const& ct = use_facet<ctype<char> >(loc);  //is  {    CPPUNIT_ASSERT( ct.is(ctype_base::digit, '0') );    CPPUNIT_ASSERT( ct.is(ctype_base::upper, 'A') );    CPPUNIT_ASSERT( ct.is(ctype_base::lower, 'a') );    CPPUNIT_ASSERT( ct.is(ctype_base::alpha, 'A') );    CPPUNIT_ASSERT( ct.is(ctype_base::space, ' ') );    CPPUNIT_ASSERT( !ct.is(ctype_base::space, '2') );    CPPUNIT_ASSERT( ct.is(ctype_base::punct, '.') );    CPPUNIT_ASSERT( ct.is(ctype_base::xdigit, 'a') );  }  //is range  {    char values[] = "0Aa .";    ctype_base::mask res[sizeof(values)];    ct.is(values, values + sizeof(values), res);    // '0'    CPPUNIT_ASSERT( (res[0] & ctype_base::print) != 0 );    CPPUNIT_ASSERT( (res[0] & ctype_base::digit) != 0 );    CPPUNIT_ASSERT( (res[0] & ctype_base::xdigit) != 0 );    // 'A'    CPPUNIT_ASSERT( (res[1] & ctype_base::print) != 0 );    CPPUNIT_ASSERT( (res[1] & ctype_base::alpha) != 0 );    CPPUNIT_ASSERT( (res[1] & ctype_base::xdigit) != 0 );    CPPUNIT_ASSERT( (res[1] & ctype_base::upper) != 0 );    // 'a'    CPPUNIT_ASSERT( (res[2] & ctype_base::print) != 0 );    CPPUNIT_ASSERT( (res[2] & ctype_base::alpha) != 0 );    CPPUNIT_ASSERT( (res[2] & ctype_base::xdigit) != 0 );    CPPUNIT_ASSERT( (res[2] & ctype_base::lower) != 0 );    CPPUNIT_ASSERT( (res[2] & ctype_base::space) == 0 );    // ' '    CPPUNIT_ASSERT( (res[3] & ctype_base::print) != 0 );    CPPUNIT_ASSERT( (res[3] & ctype_base::space) != 0 );    CPPUNIT_ASSERT( (res[3] & ctype_base::digit) == 0 );    // '.'    CPPUNIT_ASSERT( (res[4] & ctype_base::print) != 0 );    CPPUNIT_ASSERT( (res[4] & ctype_base::punct) != 0 );    CPPUNIT_ASSERT( (res[4] & ctype_base::digit) == 0 );  }  //scan_is  {    char range[] = "abAc123 .";    const char *rbeg = range;    const char *rend = range + sizeof(range);    const char *res;    res = ct.scan_is((ctype_base::mask)(ctype_base::alpha | ctype_base::lower), rbeg, rend);    CPPUNIT_ASSERT( res != rend );    CPPUNIT_ASSERT( *res == 'a' );    res = ct.scan_is(ctype_base::upper, rbeg, rend);    CPPUNIT_ASSERT( res != rend );    CPPUNIT_ASSERT( *res == 'A' );    res = ct.scan_is(ctype_base::punct, rbeg, rend);    CPPUNIT_ASSERT( res != rend );    CPPUNIT_ASSERT( *res == '.' );  }  //scan_not  {    char range[] = "abAc123 .";    const char *rbeg = range;    const char *rend = range + sizeof(range);    const char *res;    res = ct.scan_not((ctype_base::mask)(ctype_base::alpha | ctype_base::lower), rbeg, rend);    CPPUNIT_ASSERT( res != rend );    CPPUNIT_ASSERT( *res == '1' );    res = ct.scan_not(ctype_base::alpha, rbeg, rend);    CPPUNIT_ASSERT( res != rend );    CPPUNIT_ASSERT( *res == '1' );    res = ct.scan_not(ctype_base::punct, rbeg, rend);    CPPUNIT_ASSERT( res != rend );    CPPUNIT_ASSERT( *res == 'a' );  }  //toupper  {    CPPUNIT_ASSERT( ct.toupper('a') == 'A' );    CPPUNIT_ASSERT( ct.toupper('A') == 'A' );    CPPUNIT_ASSERT( ct.toupper('1') == '1' );  }  //toupper range  {    char range[] = "abAc1";    char expected_range[] = "ABAC1";    ct.toupper(range, range + sizeof(range));    CPPUNIT_ASSERT( equal(range, range + sizeof(range), expected_range) );  }  //tolower  {    CPPUNIT_ASSERT( ct.tolower('A') == 'a' );    CPPUNIT_ASSERT( ct.tolower('a') == 'a' );    CPPUNIT_ASSERT( ct.tolower('1') == '1' );  }  //tolower range  {    char range[] = "ABaC1";    char expected_range[] = "abac1";    ct.tolower(range, range + sizeof(range));    CPPUNIT_ASSERT( equal(range, range + sizeof(range), expected_range) );  }  //widen  {    CPPUNIT_ASSERT( ct.widen('a') == 'a' );  }  //widen range  {    char range[] = "ABaC1";    char res[sizeof(range)];    ct.widen(range, range + sizeof(range), res);    CPPUNIT_ASSERT( equal(range, range + sizeof(range), res) );  }  //narrow  {    CPPUNIT_ASSERT( ct.narrow('a', 'b') == 'a' );  }  //narrow range  {    char range[] = "ABaC1";    char res[sizeof(range)];    ct.narrow(range, range + sizeof(range), 'b', res);    CPPUNIT_ASSERT( equal(range, range + sizeof(range), res) );  }}void LocaleTest::_ctype_facet_w( const locale& loc ){# ifndef _STLP_NO_WCHAR_T  CPPUNIT_ASSERT( has_facet<ctype<wchar_t> >(loc) );  ctype<wchar_t> const& wct = use_facet<ctype<wchar_t> >(loc);  //is  {    CPPUNIT_CHECK( wct.is(ctype_base::digit, L'0') );    CPPUNIT_CHECK( wct.is(ctype_base::upper, L'A') );    CPPUNIT_CHECK( wct.is(ctype_base::lower, L'a') );    CPPUNIT_CHECK( wct.is(ctype_base::alpha, L'A') );    CPPUNIT_CHECK( wct.is(ctype_base::space, L' ') );    CPPUNIT_CHECK( !wct.is(ctype_base::space, L'2') );    CPPUNIT_CHECK( wct.is(ctype_base::punct, L'.') );    CPPUNIT_CHECK( wct.is(ctype_base::xdigit, L'a') );  }  //is range  {    wchar_t values[] = L"0Aa .";    ctype_base::mask res[sizeof(values) / sizeof(wchar_t)];    wct.is(values, values + (sizeof(values) / sizeof(wchar_t)), res);    // '0'    CPPUNIT_CHECK( (res[0] & ctype_base::print) != 0 );    CPPUNIT_CHECK( (res[0] & ctype_base::digit) != 0 );    CPPUNIT_CHECK( (res[0] & ctype_base::xdigit) != 0 );    // 'A'    CPPUNIT_CHECK( (res[1] & ctype_base::print) != 0 );    CPPUNIT_CHECK( (res[1] & ctype_base::alpha) != 0 );    CPPUNIT_CHECK( (res[1] & ctype_base::xdigit) != 0 );    CPPUNIT_CHECK( (res[1] & ctype_base::upper) != 0 );    // 'a'    CPPUNIT_CHECK( (res[2] & ctype_base::print) != 0 );    CPPUNIT_CHECK( (res[2] & ctype_base::alpha) != 0 );    CPPUNIT_CHECK( (res[2] & ctype_base::xdigit) != 0 );    CPPUNIT_CHECK( (res[2] & ctype_base::lower) != 0 );    CPPUNIT_CHECK( (res[2] & ctype_base::space) == 0 );    // ' '    CPPUNIT_CHECK( (res[3] & ctype_base::print) != 0 );    CPPUNIT_CHECK( (res[3] & ctype_base::space) != 0 );    CPPUNIT_CHECK( (res[3] & ctype_base::digit) == 0 );    // '.'    CPPUNIT_CHECK( (res[4] & ctype_base::print) != 0 );    CPPUNIT_CHECK( (res[4] & ctype_base::punct) != 0 );    CPPUNIT_CHECK( (res[4] & ctype_base::digit) == 0 );  }  //scan_is  {    wchar_t range[] = L"abAc123 .";    const wchar_t *rbeg = range;    const wchar_t *rend = range + (sizeof(range) / sizeof(wchar_t));    const wchar_t *res;    res = wct.scan_is((ctype_base::mask)(ctype_base::alpha | ctype_base::lower), rbeg, rend);    CPPUNIT_CHECK( res != rend );    CPPUNIT_CHECK( *res == L'a' );    res = wct.scan_is(ctype_base::upper, rbeg, rend);    CPPUNIT_CHECK( res != rend );    CPPUNIT_CHECK( *res == L'A' );    res = wct.scan_is(ctype_base::punct, rbeg, rend);    CPPUNIT_CHECK( res != rend );    CPPUNIT_CHECK( *res == L'.' );  }  //scan_not  {    wchar_t range[] = L"abAc123 .";    const wchar_t *rbeg = range;    const wchar_t *rend = range + (sizeof(range) / sizeof(wchar_t));    const wchar_t *res;    res = wct.scan_not((ctype_base::mask)(ctype_base::alpha | ctype_base::lower), rbeg, rend);    CPPUNIT_CHECK( res != rend );    CPPUNIT_CHECK( *res == L'1' );    res = wct.scan_not(ctype_base::alpha, rbeg, rend);    CPPUNIT_CHECK( res != rend );    CPPUNIT_CHECK( *res == L'1' );    res = wct.scan_not(ctype_base::punct, rbeg, rend);    CPPUNIT_CHECK( res != rend );    CPPUNIT_CHECK( *res == L'a' );  }  //toupper  {    CPPUNIT_CHECK( wct.toupper(L'a') == L'A' );    CPPUNIT_CHECK( wct.toupper(L'A') == L'A' );    CPPUNIT_CHECK( wct.toupper(L'1') == L'1' );  }  //toupper range  {    wchar_t range[] = L"abAc1";    wchar_t expected_range[] = L"ABAC1";    wct.toupper(range, range + sizeof(range) / sizeof(wchar_t));    CPPUNIT_CHECK( equal(range, range + sizeof(range) / sizeof(wchar_t), expected_range) );  }  //tolower  {    CPPUNIT_CHECK( wct.tolower(L'A') == L'a' );    CPPUNIT_CHECK( wct.tolower(L'a') == L'a' );    CPPUNIT_CHECK( wct.tolower(L'1') == L'1' );  }  //tolower range  {    wchar_t range[] = L"ABaC1";    wchar_t expected_range[] = L"abac1";    wct.tolower(range, range + sizeof(range) / sizeof(wchar_t));    CPPUNIT_CHECK( equal(range, range + sizeof(range) / sizeof(wchar_t), expected_range) );  }  //widen  {    CPPUNIT_CHECK( wct.widen('a') == L'a' );  }  //widen range  {    char range[] = "ABaC1";    wchar_t res[sizeof(range)];    wchar_t expected_res[] = L"ABaC1";    wct.widen(range, range + sizeof(range), res);    CPPUNIT_CHECK( equal(expected_res, expected_res + sizeof(range), res) );  }  //narrow  {    CPPUNIT_CHECK( wct.narrow(L'a', 'b') == L'a' );  }  //narrow range  {    wchar_t range[] = L"ABaC1";    char res[sizeof(range) / sizeof(wchar_t)];    char expected_res[] = "ABaC1";    wct.narrow(range, range + sizeof(range) / sizeof(wchar_t), 'b', res);    CPPUNIT_CHECK( equal(expected_res, expected_res + sizeof(range) / sizeof(wchar_t), res) );  }# endif}typedef void (LocaleTest::*_Test) (const locale&);static void test_supported_locale(LocaleTest& inst, _Test __test) {  size_t n = sizeof(tested_locales) / sizeof(tested_locales[0]);  for (size_t i = 0; i < n; ++i) {    locale loc;#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)    try#  endif    {      locale tmp(tested_locales[i]);      loc = tmp;    }#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)    catch (runtime_error const&) {      //This locale is not supported.      continue;    }#  endif    CPPUNIT_MESSAGE( loc.name().c_str() );    (inst.*__test)(loc);    {      locale tmp(locale::classic(), tested_locales[i], locale::ctype);      loc = tmp;    }    (inst.*__test)(loc);    {      locale tmp(locale::classic(), new ctype_byname<char>(tested_locales[i]));#ifndef _STLP_NO_WCHAR_T      locale tmp0(tmp, new ctype_byname<wchar_t>(tested_locales[i]));      tmp = tmp0;#endif      loc = tmp;    }    (inst.*__test)(loc);  }}void LocaleTest::ctype_facet(){  test_supported_locale(*this, &LocaleTest::_ctype_facet);#ifndef _STLP_NO_WCHAR_T  test_supported_locale(*this, &LocaleTest::_ctype_facet_w);#endif}void LocaleTest::ctype_by_name(){  /*   * Check of the 22.1.1.2.7 standard point. Construction of a locale   * instance from a null pointer or an unknown name should result in   * a runtime_error exception.   */#  if !defined (STLPORT) || defined (_STLP_USE_EXCEPTIONS)#    if  defined (STLPORT) || (!defined(__GNUC__) && (!defined (_MSC_VER) || (_MSC_VER > 1400)))   // libstdc++ call freelocate on bad locale  try {    locale loc(locale::classic(), new ctype_byname<char>(static_cast<char const*>(0)));    CPPUNIT_ASSERT( false );  }  catch (runtime_error const& /* e */) {    //CPPUNIT_MESSAGE( e.what() );  }  catch (...) {    CPPUNIT_ASSERT( false );  }#    endif  try {    locale loc(locale::classic(), new ctype_byname<char>("yasli_language"));    CPPUNIT_FAIL;  }  catch (runtime_error const& /* e */) {    //CPPUNIT_MESSAGE( e.what() );  }  catch (...) {    CPPUNIT_FAIL;  }#    if  defined(STLPORT) || !defined(__GNUC__)  try {    locale loc(locale::classic(), new codecvt_byname<char, char, mbstate_t>(static_cast<char const*>(0)));    CPPUNIT_FAIL;  }  catch (runtime_error const& /* e */) {    //CPPUNIT_MESSAGE( e.what() );  }  catch (...) {    CPPUNIT_FAIL;  }#    endif  try {    locale loc(locale::classic(), new codecvt_byname<char, char, mbstate_t>("yasli_language"));    //STLport implementation do not care about name pass to this facet.#    if !defined (STLPORT)    CPPUNIT_FAIL;#    endif  }  catch (runtime_error const& /* e */) {    //CPPUNIT_MESSAGE( e.what() );  }  catch (...) {    CPPUNIT_FAIL;  }  try {    locale loc(locale::classic(), new ctype_byname<char>("fr_FR"));    CPPUNIT_ASSERT( has_facet<ctype<char> >(loc) );    ctype<char> const& ct = use_facet<ctype<char> >(loc);    CPPUNIT_ASSERT( ct.is(ctype_base::mask(ctype_base::print | ctype_base::lower | ctype_base::alpha), '

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?