test_icu.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 650 行 · 第 1/2 页
CPP
650 行
compare_result(what, what8c, static_cast<boost::mpl::int_<1> const*>(0)); } else if(answer_table[0] >= 0) { // we should have had a match but didn't: BOOST_REGEX_TEST_ERROR("Expected match was not found.", UChar32); } } } } // // finally try a grep: // test_icu_grep(r, search_text); } catch(const boost::bad_expression& e) { BOOST_REGEX_TEST_ERROR("Expression did not compile when it should have done: " << e.what(), UChar32); } catch(const std::runtime_error& r) { BOOST_REGEX_TEST_ERROR("Received an unexpected std::runtime_error: " << r.what(), UChar32); } catch(const std::exception& r) { BOOST_REGEX_TEST_ERROR("Received an unexpected std::exception: " << r.what(), UChar32); } catch(...) { BOOST_REGEX_TEST_ERROR("Received an unexpected exception of unknown type", UChar32); }}void test_icu(const wchar_t&, const test_invalid_regex_tag&){ typedef boost::u16_to_u32_iterator<std::wstring::const_iterator, ::UChar32> conv_iterator; std::vector< ::UChar32> expression;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS expression.assign(test_info<wchar_t>::expression().begin(), test_info<wchar_t>::expression().end());#else std::copy(test_info<wchar_t>::expression().begin(), test_info<wchar_t>::expression().end(), std::back_inserter(expression));#endif boost::regex_constants::syntax_option_type syntax_options = test_info<wchar_t>::syntax_options(); boost::u32regex r; if(*test_locale::c_str()) { U_NAMESPACE_QUALIFIER Locale l(test_locale::c_str()); if(l.isBogus()) return; r.imbue(l); } // // try it with exceptions disabled first: // try {#if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__) if(0 == r.assign(expression.begin(), expression.end(), syntax_options | boost::regex_constants::no_except).status())#else if(expression.size()) r.assign(&*expression.begin(), expression.size(), syntax_options | boost::regex_constants::no_except); else r.assign(static_cast<UChar32 const*>(0), static_cast<boost::u32regex::size_type>(0), syntax_options | boost::regex_constants::no_except); if(0 == r.status())#endif { BOOST_REGEX_TEST_ERROR("Expression compiled when it should not have done so.", wchar_t); } } catch(...) { BOOST_REGEX_TEST_ERROR("Unexpected exception thrown.", wchar_t); } // // now try again with exceptions: // bool have_catch = false; try{#if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__) r.assign(expression.begin(), expression.end(), syntax_options);#else if(expression.size()) r.assign(&*expression.begin(), expression.size(), syntax_options); else r.assign(static_cast<UChar32 const*>(0), static_cast<boost::u32regex::size_type>(0), syntax_options);#endif#ifdef BOOST_NO_EXCEPTIONS if(r.status()) have_catch = true;#endif } catch(const boost::bad_expression&) { have_catch = true; } catch(const std::runtime_error& r) { have_catch = true; BOOST_REGEX_TEST_ERROR("Expected a bad_expression exception, but a std::runtime_error instead: " << r.what(), wchar_t); } catch(const std::exception& r) { have_catch = true; BOOST_REGEX_TEST_ERROR("Expected a bad_expression exception, but a std::exception instead: " << r.what(), wchar_t); } catch(...) { have_catch = true; BOOST_REGEX_TEST_ERROR("Expected a bad_expression exception, but got an exception of unknown type instead", wchar_t); } if(!have_catch) { // oops expected exception was not thrown: BOOST_REGEX_TEST_ERROR("Expected an exception, but didn't find one.", wchar_t); } if(0 == *test_locale::c_str()) { // // Now try UTF-16 construction: // typedef boost::u32_to_u16_iterator<std::vector<UChar32>::const_iterator> u16_conv; std::vector<UChar> expression16;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS expression16.assign(u16_conv(expression.begin()), u16_conv(expression.end()));#else std::copy(u16_conv(expression.begin()), u16_conv(expression.end()), std::back_inserter(expression16));#endif if(0 == boost::make_u32regex(expression16.begin(), expression16.end(), syntax_options | boost::regex_constants::no_except).status()) { BOOST_REGEX_TEST_ERROR("Expression compiled when it should not have done so.", wchar_t); } if(std::find(expression16.begin(), expression16.end(), 0) == expression16.end()) { expression16.push_back(0); if(0 == boost::make_u32regex(&*expression16.begin(), syntax_options | boost::regex_constants::no_except).status()) { BOOST_REGEX_TEST_ERROR("Expression compiled when it should not have done so.", wchar_t); } } // // Now try UTF-8 construction: // typedef boost::u32_to_u8_iterator<std::vector<UChar32>::const_iterator> u8_conv; std::vector<unsigned char> expression8;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS expression8.assign(u8_conv(expression.begin()), u8_conv(expression.end()));#else std::copy(u8_conv(expression.begin()), u8_conv(expression.end()), std::back_inserter(expression8));#endif if(0 == boost::make_u32regex(expression8.begin(), expression8.end(), syntax_options | boost::regex_constants::no_except).status()) { BOOST_REGEX_TEST_ERROR("Expression compiled when it should not have done so.", wchar_t); } if(std::find(expression8.begin(), expression8.end(), 0) == expression8.end()) { expression8.push_back(0); if(0 == boost::make_u32regex(&*expression8.begin(), syntax_options | boost::regex_constants::no_except).status()) { BOOST_REGEX_TEST_ERROR("Expression compiled when it should not have done so.", wchar_t); } } }}void test_icu(const wchar_t&, const test_regex_replace_tag&){ std::vector< ::UChar32> expression;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS expression.assign(test_info<wchar_t>::expression().begin(), test_info<wchar_t>::expression().end());#else std::copy(test_info<wchar_t>::expression().begin(), test_info<wchar_t>::expression().end(), std::back_inserter(expression));#endif boost::regex_constants::syntax_option_type syntax_options = test_info<UChar32>::syntax_options(); boost::u32regex r; try{#if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__) r.assign(expression.begin(), expression.end(), syntax_options);#else if(expression.size()) r.assign(&*expression.begin(), expression.size(), syntax_options); else r.assign(static_cast<UChar32 const*>(0), static_cast<boost::u32regex::size_type>(0), syntax_options);#endif if(r.status()) { BOOST_REGEX_TEST_ERROR("Expression did not compile when it should have done, error code = " << r.status(), UChar32); } typedef std::vector<UChar32> string_type; string_type search_text; boost::regex_constants::match_flag_type opts = test_info<UChar32>::match_options(); string_type format_string; string_type result_string;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS search_text.assign(test_info<UChar32>::search_text().begin(), test_info<UChar32>::search_text().end()); format_string.assign(test_info<UChar32>::format_string().begin(), test_info<UChar32>::format_string().end()); format_string.push_back(0); result_string.assign(test_info<UChar32>::result_string().begin(), test_info<UChar32>::result_string().end());#else std::copy(test_info<UChar32>::search_text().begin(), test_info<UChar32>::search_text().end(), std::back_inserter(search_text)); std::copy(test_info<UChar32>::format_string().begin(), test_info<UChar32>::format_string().end(), std::back_inserter(format_string)); format_string.push_back(0); std::copy(test_info<UChar32>::result_string().begin(), test_info<UChar32>::result_string().end(), std::back_inserter(result_string));#endif string_type result; boost::u32regex_replace(unnecessary_fix::back_inserter(result), search_text.begin(), search_text.end(), r, &*format_string.begin(), opts); if(result != result_string) { BOOST_REGEX_TEST_ERROR("regex_replace generated an incorrect string result", UChar32); } // // Mixed mode character encoding: // if(0 == *test_locale::c_str()) { // // Now try UTF-16 construction: // typedef boost::u32_to_u16_iterator<std::vector<UChar32>::const_iterator> u16_conv; std::vector<UChar> expression16, text16, format16, result16, found16;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS expression16.assign(u16_conv(expression.begin()), u16_conv(expression.end())); text16.assign(u16_conv(search_text.begin()), u16_conv(search_text.end())); format16.assign(u16_conv(format_string.begin()), u16_conv(format_string.end())); result16.assign(u16_conv(result_string.begin()), u16_conv(result_string.end()));#else std::copy(u16_conv(expression.begin()), u16_conv(expression.end()), std::back_inserter(expression16)); std::copy(u16_conv(search_text.begin()), u16_conv(search_text.end()), std::back_inserter(text16)); std::copy(u16_conv(format_string.begin()), u16_conv(format_string.end()), std::back_inserter(format16)); std::copy(u16_conv(result_string.begin()), u16_conv(result_string.end()), std::back_inserter(result16));#endif r = boost::make_u32regex(expression16.begin(), expression16.end(), syntax_options); boost::u32regex_replace(unnecessary_fix::back_inserter(found16), text16.begin(), text16.end(), r, &*format16.begin(), opts); if(result16 != found16) { BOOST_REGEX_TEST_ERROR("u32regex_replace with UTF-16 string returned incorrect result", UChar32); } // // Now with UnicodeString: // UnicodeString expression16u, text16u, format16u, result16u, found16u; if(expression16.size()) expression16u.setTo(&*expression16.begin(), expression16.size()); if(text16.size()) text16u.setTo(&*text16.begin(), text16.size()); format16u.setTo(&*format16.begin(), format16.size()-1); if(result16.size()) result16u.setTo(&*result16.begin(), result16.size()); r = boost::make_u32regex(expression16.begin(), expression16.end(), syntax_options); found16u = boost::u32regex_replace(text16u, r, format16u, opts); if(result16u != found16u) { BOOST_REGEX_TEST_ERROR("u32regex_replace with UTF-16 string returned incorrect result", UChar32); } // // Now try UTF-8 construction: // typedef boost::u32_to_u8_iterator<std::vector<UChar32>::const_iterator, unsigned char> u8_conv; std::vector<char> expression8, text8, format8, result8, found8;#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS expression8.assign(u8_conv(expression.begin()), u8_conv(expression.end())); text8.assign(u8_conv(search_text.begin()), u8_conv(search_text.end())); format8.assign(u8_conv(format_string.begin()), u8_conv(format_string.end())); result8.assign(u8_conv(result_string.begin()), u8_conv(result_string.end()));#else std::copy(u8_conv(expression.begin()), u8_conv(expression.end()), std::back_inserter(expression8)); std::copy(u8_conv(search_text.begin()), u8_conv(search_text.end()), std::back_inserter(text8)); std::copy(u8_conv(format_string.begin()), u8_conv(format_string.end()), std::back_inserter(format8)); std::copy(u8_conv(result_string.begin()), u8_conv(result_string.end()), std::back_inserter(result8));#endif r = boost::make_u32regex(expression8.begin(), expression8.end(), syntax_options); boost::u32regex_replace(unnecessary_fix::back_inserter(found8), text8.begin(), text8.end(), r, &*format8.begin(), opts); if(result8 != found8) { BOOST_REGEX_TEST_ERROR("u32regex_replace with UTF-8 string returned incorrect result", UChar32); } // // Now with std::string and UTF-8: // std::string expression8s, text8s, format8s, result8s, found8s; if(expression8.size()) expression8s.assign(&*expression8.begin(), expression8.size()); if(text8.size()) text8s.assign(&*text8.begin(), text8.size()); format8s.assign(&*format8.begin(), format8.size()-1); if(result8.size()) result8s.assign(&*result8.begin(), result8.size()); r = boost::make_u32regex(expression8.begin(), expression8.end(), syntax_options); found8s = boost::u32regex_replace(text8s, r, format8s, opts); if(result8s != found8s) { BOOST_REGEX_TEST_ERROR("u32regex_replace with UTF-8 string returned incorrect result", UChar32); } } } catch(const boost::bad_expression& e) { BOOST_REGEX_TEST_ERROR("Expression did not compile when it should have done: " << e.what(), UChar32); } catch(const std::runtime_error& r) { BOOST_REGEX_TEST_ERROR("Received an unexpected std::runtime_error: " << r.what(), UChar32); } catch(const std::exception& r) { BOOST_REGEX_TEST_ERROR("Received an unexpected std::exception: " << r.what(), UChar32); } catch(...) { BOOST_REGEX_TEST_ERROR("Received an unexpected exception of unknown type", UChar32); }}#else#include "test.hpp"void test_icu(const wchar_t&, const test_regex_search_tag&){}void test_icu(const wchar_t&, const test_invalid_regex_tag&){}void test_icu(const wchar_t&, const test_regex_replace_tag&){}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?