diff options
Diffstat (limited to 'src/boost/libs/spirit/classic/test/parametric_tests.cpp')
-rw-r--r-- | src/boost/libs/spirit/classic/test/parametric_tests.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/classic/test/parametric_tests.cpp b/src/boost/libs/spirit/classic/test/parametric_tests.cpp new file mode 100644 index 00000000..9fc7b2c9 --- /dev/null +++ b/src/boost/libs/spirit/classic/test/parametric_tests.cpp @@ -0,0 +1,185 @@ +/*============================================================================= + Copyright (c) 2001-2003 Joel de Guzman + Copyright (c) 2003 Martin Wille + http://spirit.sourceforge.net/ + + Use, modification and distribution is 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) +=============================================================================*/ +#include <iostream> +#include <boost/detail/lightweight_test.hpp> +#include <string> + + +#include <boost/spirit/include/classic_core.hpp> +#include <boost/spirit/include/classic_parametric.hpp> +#include <boost/spirit/include/phoenix1_primitives.hpp> +#include <boost/spirit/include/phoenix1_operators.hpp> +using namespace BOOST_SPIRIT_CLASSIC_NS; +using namespace phoenix; + +#include <boost/detail/lightweight_test.hpp> + +/////////////////////////////////////////////////////////////////////////////// +// +// Parametric tests +// +/////////////////////////////////////////////////////////////////////////////// + +template <typename T> +static unsigned +length(T const *p) +{ + unsigned result = 0; + while (*p++) + ++result; + return result; +} + +template <typename T> +bool +is_equal(T const* a, T const* b) +{ + while (*a && *b) + if (*a++ != *b++) + return false; + return true; +} + +typedef rule< scanner<wchar_t const *> > wrule_t; + +void +narrow_f_ch_p() +{ + char ch; + rule<> r = anychar_p[var(ch) = arg1] >> *f_ch_p(const_(ch)); + parse_info<char const*> pi; + + pi = parse("aaaaaaaaa", r); + BOOST_TEST(pi.hit); + BOOST_TEST(pi.full); + + pi = parse("aaaaabaaa", r); + BOOST_TEST(pi.hit); + BOOST_TEST(!pi.full); + BOOST_TEST(is_equal(pi.stop, "baaa")); +} + +void +wide_f_ch_p() +{ + wchar_t ch; + wrule_t r = anychar_p[var(ch) = arg1] >> *f_ch_p(const_(ch)); + parse_info<wchar_t const*> pi; + + pi = parse(L"aaaaaaaaa", r); + BOOST_TEST(pi.hit); + BOOST_TEST(pi.full); + + pi = parse(L"aaaaabaaa", r); + BOOST_TEST(pi.hit); + BOOST_TEST(!pi.full); + BOOST_TEST(is_equal(pi.stop, L"baaa")); +} + +void +narrow_f_range_p() +{ + char from = 'a'; + char to = 'z'; + + parse_info<char const*> pi; + + rule<> r2 = *f_range_p(const_(from), const_(to)); + pi = parse("abcdefghijklmnopqrstuvwxyz", r2); + BOOST_TEST(pi.hit); + BOOST_TEST(pi.full); + + pi = parse("abcdefghijklmnopqrstuvwxyz123", r2); + BOOST_TEST(pi.hit); + BOOST_TEST(!pi.full); + BOOST_TEST(is_equal(pi.stop, "123")); +} + +void +wide_f_range_p() +{ + wchar_t from = L'a'; + wchar_t to = L'z'; + + parse_info<wchar_t const*> pi; + + wrule_t r2 = *f_range_p(const_(from), const_(to)); + pi = parse(L"abcdefghijklmnopqrstuvwxyz", r2); + BOOST_TEST(pi.hit); + BOOST_TEST(pi.full); + + pi = parse(L"abcdefghijklmnopqrstuvwxyz123", r2); + BOOST_TEST(pi.hit); + BOOST_TEST(!pi.full); + BOOST_TEST(is_equal(pi.stop, L"123")); +} + +void +narrow_f_str_p() +{ + parse_info<char const*> pi; + + char const* start = "kim"; + char const* end = start + length(start); + rule<> r3 = +f_str_p(const_(start), const_(end)); + + pi = parse("kimkimkimkimkimkimkimkimkim", r3); + BOOST_TEST(pi.hit); + BOOST_TEST(pi.full); + + pi = parse("kimkimkimkimkimkimkimkimkimmama", r3); + BOOST_TEST(pi.hit); + BOOST_TEST(!pi.full); + BOOST_TEST(is_equal(pi.stop, "mama")); + + pi = parse("joel", r3); + BOOST_TEST(!pi.hit); +} + +void +wide_f_str_p() +{ + parse_info<wchar_t const*> pi; + + wchar_t const* start = L"kim"; + wchar_t const* end = start + length(start); + wrule_t r3 = +f_str_p(const_(start), const_(end)); + + pi = parse(L"kimkimkimkimkimkimkimkimkim", r3); + BOOST_TEST(pi.hit); + BOOST_TEST(pi.full); + + pi = parse(L"kimkimkimkimkimkimkimkimkimmama", r3); + BOOST_TEST(pi.hit); + BOOST_TEST(!pi.full); + BOOST_TEST(is_equal(pi.stop, L"mama")); + + pi = parse(L"joel", r3); + BOOST_TEST(!pi.hit); +} + +/////////////////////////////////////////////////////////////////////////////// +// +// test suite +// +/////////////////////////////////////////////////////////////////////////////// +int +main() +{ + narrow_f_ch_p(); + wide_f_ch_p(); + narrow_f_range_p(); + wide_f_range_p(); + narrow_f_str_p(); + wide_f_str_p(); + + return boost::report_errors(); +} + |