123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- /*
- *
- * Copyright (c) 2004
- * John Maddock
- *
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0. (See accompanying file
- * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- */
- /*
- * LOCATION: see http://www.boost.org for most recent version.
- * FILE test.hpp
- * VERSION see <boost/version.hpp>
- * DESCRIPTION: Macros for test cases.
- */
- #ifndef BOOST_REGEX_REGRESS_TEST_HPP
- #define BOOST_REGEX_REGRESS_TEST_HPP
- #include <boost/regex.hpp>
- #ifdef BOOST_INTEL
- // disable Intel's "remarks":
- #pragma warning(disable:1418 981 383 1419 7)
- #endif
- #include <typeinfo>
- #include "test_not_regex.hpp"
- #include "test_regex_search.hpp"
- #include "test_regex_replace.hpp"
- #include "test_deprecated.hpp"
- #include "test_mfc.hpp"
- #include "test_icu.hpp"
- #include "test_locale.hpp"
- #ifdef TEST_THREADS
- #include <boost/thread/once.hpp>
- #endif
- //
- // define test entry proc, this forwards on to the appropriate
- // real test:
- //
- template <class charT, class tagT>
- void do_test(const charT& c, const tagT& tag);
- template <class charT, class tagT>
- void test(const charT& c, const tagT& tag)
- {
- do_test(c, tag);
- }
- //
- // make these non-templates to speed up compilation times:
- //
- void test(const char&, const test_regex_replace_tag&);
- void test(const char&, const test_regex_search_tag&);
- void test(const char&, const test_invalid_regex_tag&);
- #ifndef BOOST_NO_WREGEX
- void test(const wchar_t&, const test_regex_replace_tag&);
- void test(const wchar_t&, const test_regex_search_tag&);
- void test(const wchar_t&, const test_invalid_regex_tag&);
- #endif
- template <class Regex>
- struct call_once_func
- {
- Regex* pregex;
- void operator()()const
- {
- return test_empty(*pregex);
- }
- };
- template <class charT, class tagT>
- void do_test(const charT& c, const tagT& tag)
- {
- #ifndef BOOST_NO_STD_LOCALE
- #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) && defined(TEST_THREADS)
- // typeid appears to fail in multithreaded environments:
- test_info<charT>::set_typename("");
- #else
- test_info<charT>::set_typename(typeid(boost::basic_regex<charT, boost::cpp_regex_traits<charT> >).name());
- #endif
- boost::basic_regex<charT, boost::cpp_regex_traits<charT> > e1;
- #ifndef TEST_THREADS
- static bool done_empty_test = false;
- if(done_empty_test == false)
- {
- test_empty(e1);
- done_empty_test = true;
- }
- #else
- boost::once_flag f = BOOST_ONCE_INIT;
- call_once_func<boost::basic_regex<charT, boost::cpp_regex_traits<charT> > > proc = { &e1 };
- boost::call_once(f, proc);
- #endif
- if(test_locale::cpp_locale_state() == test_locale::test_with_locale)
- e1.imbue(test_locale::cpp_locale());
- if(test_locale::cpp_locale_state() != test_locale::no_test)
- test(e1, tag);
- #endif
- #if !BOOST_WORKAROUND(__BORLANDC__, < 0x560)
- #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) && defined(TEST_THREADS)
- // typeid appears to fail in multithreaded environments:
- test_info<charT>::set_typename("");
- #else
- test_info<charT>::set_typename(typeid(boost::basic_regex<charT, boost::c_regex_traits<charT> >).name());
- #endif
- boost::basic_regex<charT, boost::c_regex_traits<charT> > e2;
- if(test_locale::c_locale_state() != test_locale::no_test)
- test(e2, tag);
- #endif
- #if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
- #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) && defined(TEST_THREADS)
- // typeid appears to fail in multithreaded environments:
- test_info<charT>::set_typename("");
- #else
- test_info<charT>::set_typename(typeid(boost::basic_regex<charT, boost::w32_regex_traits<charT> >).name());
- #endif
- boost::basic_regex<charT, boost::w32_regex_traits<charT> > e3;
- if(test_locale::win_locale_state() == test_locale::test_with_locale)
- e3.imbue(test_locale::win_locale());
- if(test_locale::win_locale_state() != test_locale::no_test)
- test(e3, tag);
- #endif
- // test old depecated code:
- test_info<charT>::set_typename("Deprecated interfaces");
- if((test_locale::win_locale_state() == test_locale::test_no_locale)
- && (test_locale::c_locale_state() == test_locale::test_no_locale)
- &&(test_locale::cpp_locale_state() == test_locale::test_no_locale))
- test_deprecated(c, tag);
- // test MFC/ATL wrappers:
- test_info<charT>::set_typename("MFC/ATL interfaces");
- if((test_locale::win_locale_state() == test_locale::test_no_locale)
- && (test_locale::c_locale_state() == test_locale::test_no_locale)
- &&(test_locale::cpp_locale_state() == test_locale::test_no_locale))
- test_mfc(c, tag);
- // test ICU code:
- test_info<charT>::set_typename("ICU interfaces");
- test_icu(c, tag);
- }
- //
- // define function to pack args into an array:
- //
- const int* make_array(int first, ...);
- //
- // define macros for testing invalid regexes:
- //
- #define TEST_INVALID_REGEX_N(s, f)\
- do{\
- const char e[] = { s };\
- std::string se(e, sizeof(e) - 1);\
- test_info<char>::set_info(__FILE__, __LINE__, se, f);\
- test(char(0), test_invalid_regex_tag());\
- }while(0)
- #ifndef BOOST_NO_WREGEX
- #define TEST_INVALID_REGEX_W(s, f)\
- do{\
- const wchar_t e[] = { s };\
- std::wstring se(e, (sizeof(e) / sizeof(wchar_t)) - 1);\
- test_info<wchar_t>::set_info(__FILE__, __LINE__, se, f);\
- test(wchar_t(0), test_invalid_regex_tag());\
- }while(0)
- #else
- #define TEST_INVALID_REGEX_W(s, f)
- #endif
- #define TEST_INVALID_REGEX(s, f)\
- TEST_INVALID_REGEX_N(s, f);\
- TEST_INVALID_REGEX_W(BOOST_JOIN(L, s), f)
- //
- // define macros for testing regex searches:
- //
- #define TEST_REGEX_SEARCH_N(s, f, t, m, a)\
- do{\
- const char e[] = { s };\
- std::string se(e, sizeof(e) - 1);\
- const char st[] = { t };\
- std::string sst(st, sizeof(st) - 1);\
- test_info<char>::set_info(__FILE__, __LINE__, se, f, sst, m, a);\
- test(char(0), test_regex_search_tag());\
- }while(0)
- #ifndef BOOST_NO_WREGEX
- #define TEST_REGEX_SEARCH_W(s, f, t, m, a)\
- do{\
- const wchar_t e[] = { s };\
- std::wstring se(e, (sizeof(e) / sizeof(wchar_t)) - 1);\
- const wchar_t st[] = { t };\
- std::wstring sst(st, (sizeof(st) / sizeof(wchar_t)) - 1);\
- test_info<wchar_t>::set_info(__FILE__, __LINE__, se, f, sst, m, a);\
- test(wchar_t(0), test_regex_search_tag());\
- }while(0)
- #else
- #define TEST_REGEX_SEARCH_W(s, f, t, m, a)
- #endif
- #define TEST_REGEX_SEARCH(s, f, t, m, a)\
- TEST_REGEX_SEARCH_N(s, f, t, m, a);\
- TEST_REGEX_SEARCH_W(BOOST_JOIN(L, s), f, BOOST_JOIN(L, t), m, a)
- #if (defined(__GNUC__) && (__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
- #define TEST_REGEX_SEARCH_L(s, f, t, m, a) TEST_REGEX_SEARCH_W(BOOST_JOIN(L, s), f, BOOST_JOIN(L, t), m, a)
- #else
- #define TEST_REGEX_SEARCH_L(s, f, t, m, a) TEST_REGEX_SEARCH(s, f, t, m, a)
- #endif
- //
- // define macros for testing regex replaces:
- //
- #define TEST_REGEX_REPLACE_N(s, f, t, m, fs, r)\
- do{\
- const char e[] = { s };\
- std::string se(e, sizeof(e) - 1);\
- const char st[] = { t };\
- std::string sst(st, sizeof(st) - 1);\
- const char ft[] = { fs };\
- std::string sft(ft, sizeof(ft) - 1);\
- const char rt[] = { r };\
- std::string srt(rt, sizeof(rt) - 1);\
- test_info<char>::set_info(__FILE__, __LINE__, se, f, sst, m, 0, sft, srt);\
- test(char(0), test_regex_replace_tag());\
- }while(0)
- #ifndef BOOST_NO_WREGEX
- #define TEST_REGEX_REPLACE_W(s, f, t, m, fs, r)\
- do{\
- const wchar_t e[] = { s };\
- std::wstring se(e, (sizeof(e) / sizeof(wchar_t)) - 1);\
- const wchar_t st[] = { t };\
- std::wstring sst(st, (sizeof(st) / sizeof(wchar_t)) - 1);\
- const wchar_t ft[] = { fs };\
- std::wstring sft(ft, (sizeof(ft) / sizeof(wchar_t)) - 1);\
- const wchar_t rt[] = { r };\
- std::wstring srt(rt, (sizeof(rt) / sizeof(wchar_t)) - 1);\
- test_info<wchar_t>::set_info(__FILE__, __LINE__, se, f, sst, m, 0, sft, srt);\
- test(wchar_t(0), test_regex_replace_tag());\
- }while(0)
- #else
- #define TEST_REGEX_REPLACE_W(s, f, t, m, fs, r)
- #endif
- #define TEST_REGEX_REPLACE(s, f, t, m, fs, r)\
- TEST_REGEX_REPLACE_N(s, f, t, m, fs, r);\
- TEST_REGEX_REPLACE_W(BOOST_JOIN(L, s), f, BOOST_JOIN(L, t), m, BOOST_JOIN(L, fs), BOOST_JOIN(L, r))
- //
- // define the test group proceedures:
- //
- void basic_tests();
- void test_simple_repeats();
- void test_alt();
- void test_sets();
- void test_sets2();
- void test_anchors();
- void test_backrefs();
- void test_character_escapes();
- void test_assertion_escapes();
- void test_tricky_cases();
- void test_grep();
- void test_replace();
- void test_non_greedy_repeats();
- void test_non_marking_paren();
- void test_partial_match();
- void test_forward_lookahead_asserts();
- void test_fast_repeats();
- void test_fast_repeats2();
- void test_tricky_cases2();
- void test_independent_subs();
- void test_nosubs();
- void test_conditionals();
- void test_options();
- void test_options2();
- void test_en_locale();
- void test_emacs();
- void test_operators();
- void test_overloads();
- void test_unicode();
- void test_pocessive_repeats();
- void test_mark_resets();
- void test_recursion();
- void test_verbs();
- #endif
|