diff options
Diffstat (limited to 'src/boost/libs/regex/test/regress/test.hpp')
-rw-r--r-- | src/boost/libs/regex/test/regress/test.hpp | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/src/boost/libs/regex/test/regress/test.hpp b/src/boost/libs/regex/test/regress/test.hpp new file mode 100644 index 000000000..e9a1b8624 --- /dev/null +++ b/src/boost/libs/regex/test/regress/test.hpp @@ -0,0 +1,293 @@ +/* + * + * 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) + (void)e1.imbue(test_locale::cpp_locale()); + if(test_locale::cpp_locale_state() != test_locale::no_test) + test(e1, tag); +#endif +#if !BOOST_WORKAROUND(BOOST_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 |