diff options
Diffstat (limited to 'src/boost/libs/xpressive/test/misc1.cpp')
-rw-r--r-- | src/boost/libs/xpressive/test/misc1.cpp | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/src/boost/libs/xpressive/test/misc1.cpp b/src/boost/libs/xpressive/test/misc1.cpp new file mode 100644 index 00000000..9bcd63b1 --- /dev/null +++ b/src/boost/libs/xpressive/test/misc1.cpp @@ -0,0 +1,252 @@ +/////////////////////////////////////////////////////////////////////////////// +// misc1.hpp +// +// Copyright 2008 Eric Niebler. Distributed under 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/xpressive/xpressive.hpp> +#include <boost/xpressive/traits/cpp_regex_traits.hpp> +#include <boost/test/unit_test.hpp> + +using namespace boost::unit_test; +using namespace boost::xpressive; + +void test1() +{ + // make sure the following compiles: + sregex a = _; + sregex b = _; + sregex c = a >> b; + c = 'a' >> b; + c = a >> 'b'; + c = a | b; + c = 'a' | b; + c = a | 'b'; + c = !a; + c = *a; + c = +a; +} + +/////////////////////////////////////////////////////////////////////////////// +// test for basic_regex in a keep +// +void test2() +{ + std::locale loc; + std::string str("Its a mad Mad mAd maD world"); + sregex word = +_w; + sregex sentence = imbue(loc)(*(keep(word) >> +_s) >> word); + smatch what; + + BOOST_REQUIRE(regex_match(str, what, sentence)); + BOOST_REQUIRE(7 == what.nested_results().size()); + smatch::nested_results_type::const_iterator pword = what.nested_results().begin(); + BOOST_CHECK((*pword++)[0] == "Its"); + BOOST_CHECK((*pword++)[0] == "a"); + BOOST_CHECK((*pword++)[0] == "mad"); + BOOST_CHECK((*pword++)[0] == "Mad"); + BOOST_CHECK((*pword++)[0] == "mAd"); + BOOST_CHECK((*pword++)[0] == "maD"); + BOOST_CHECK((*pword++)[0] == "world"); + BOOST_CHECK(pword == what.nested_results().end()); +} + +/////////////////////////////////////////////////////////////////////////////// +// test for a simple non-recursive grammar +// +void test3() +{ + // test for a simple regex grammar + std::string buffer = + "FROGGIE\r\n" + "Volume = 1\r\n" + "Other1= 2\r\n" + "Channel=3\r\n" + "Other =4\r\n" + "\r\n" + "FROGGIE\r\n" + "Volume = 5\r\n" + "Other1= 6\r\n" + "Channel=7\r\n" + "Other =8\r\n" + "\r\n" + "FROGGIE\r\n" + "Volume = 9\r\n" + "Other1= 0\r\n" + "Channel=10\r\n" + "\r\n"; + + mark_tag name(1), value(2); + + sregex name_value_pair_ = + (name= +alnum) >> *_s >> "=" >> *_s >> + (value= +_d) >> *_s >> _ln; + + sregex message_ = + *_s >> "FROGGIE" >> _ln >> +name_value_pair_ >> _ln; + + sregex re_ = +message_; + + smatch::nested_results_type::const_iterator msg, nvp; + smatch tmpwhat; + + BOOST_REQUIRE(regex_search(buffer, tmpwhat, re_)); + // for giggles, make a deep-copy of the tree of results + smatch what = tmpwhat; + BOOST_REQUIRE(3 == what.nested_results().size()); + + msg = what.nested_results().begin(); + BOOST_REQUIRE(4 == msg->nested_results().size()); + + nvp = msg->nested_results().begin(); + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Volume" == (*nvp)[name]); + BOOST_CHECK("1" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Other1" == (*nvp)[name]); + BOOST_CHECK("2" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Channel" == (*nvp)[name]); + BOOST_CHECK("3" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Other" == (*nvp)[name]); + BOOST_CHECK("4" == (*nvp)[value]); + + ++msg; + BOOST_REQUIRE(4 == msg->nested_results().size()); + + nvp = msg->nested_results().begin(); + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Volume" == (*nvp)[name]); + BOOST_CHECK("5" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Other1" == (*nvp)[name]); + BOOST_CHECK("6" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Channel" == (*nvp)[name]); + BOOST_CHECK("7" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Other" == (*nvp)[name]); + BOOST_CHECK("8" == (*nvp)[value]); + + ++msg; + BOOST_REQUIRE(3 == msg->nested_results().size()); + + nvp = msg->nested_results().begin(); + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Volume" == (*nvp)[name]); + BOOST_CHECK("9" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Other1" == (*nvp)[name]); + BOOST_CHECK("0" == (*nvp)[value]); + ++nvp; + BOOST_REQUIRE(3 == nvp->size()); + BOOST_CHECK("Channel" == (*nvp)[name]); + BOOST_CHECK("10" == (*nvp)[value]); +} + +/////////////////////////////////////////////////////////////////////////////// +// test for a self-recursive regex +// +void test4() +{ + sregex parentheses; + parentheses // A balanced set of parentheses ... + = '(' // is an opening parenthesis ... + >> // followed by ... + *( // zero or more ... + keep( +~(set='(',')') ) // of a bunch of things that are not parentheses ... + | // or ... + by_ref(parentheses) // a balanced set of parentheses + ) // (ooh, recursion!) ... + >> // followed by ... + ')' // a closing parenthesis + ; + + smatch what; + smatch::nested_results_type::const_iterator pwhat, pwhat2; + std::string str( "blah blah( a(b)c (c(e)f (g)h )i (j)6 )blah" ); + + BOOST_REQUIRE(regex_search(str, what, parentheses)); + BOOST_REQUIRE(1 == what.size()); + BOOST_CHECK("( a(b)c (c(e)f (g)h )i (j)6 )" == what[0]); + + BOOST_REQUIRE(3 == what.nested_results().size()); + pwhat = what.nested_results().begin(); + BOOST_REQUIRE(1 == pwhat->size()); + BOOST_CHECK("(b)" == (*pwhat)[0]); + + ++pwhat; + BOOST_REQUIRE(1 == pwhat->size()); + BOOST_CHECK("(c(e)f (g)h )" == (*pwhat)[0]); + + BOOST_REQUIRE(2 == pwhat->nested_results().size()); + pwhat2 = pwhat->nested_results().begin(); + BOOST_REQUIRE(1 == pwhat2->size()); + BOOST_CHECK("(e)" == (*pwhat2)[0]); + + ++pwhat2; + BOOST_REQUIRE(1 == pwhat2->size()); + BOOST_CHECK("(g)" == (*pwhat2)[0]); + + ++pwhat; + BOOST_REQUIRE(1 == pwhat->size()); + BOOST_CHECK("(j)" == (*pwhat)[0]); +} + +/////////////////////////////////////////////////////////////////////////////// +// test for a sub-match scoping +// +void test5() +{ + sregex inner = sregex::compile( "(.)\\1" ); + sregex outer = (s1= _) >> inner >> s1; + std::string abba("ABBA"); + + BOOST_CHECK(regex_match(abba, outer)); +} + +/////////////////////////////////////////////////////////////////////////////// +// Ye olde calculator. Test recursive grammar. +// +void test6() +{ + sregex group, factor, term, expression; + + group = '(' >> by_ref(expression) >> ')'; + factor = +_d | group; + term = factor >> *(('*' >> factor) | ('/' >> factor)); + expression = term >> *(('+' >> term) | ('-' >> term)); + + smatch what; + std::string str("foo 9*(10+3) bar"); + + BOOST_REQUIRE(regex_search(str, what, expression)); + BOOST_CHECK("9*(10+3)" == what[0]); +} + +/////////////////////////////////////////////////////////////////////////////// +// init_unit_test_suite +// +test_suite* init_unit_test_suite( int argc, char* argv[] ) +{ + test_suite *test = BOOST_TEST_SUITE("miscelaneous tests and examples from the docs"); + + test->add(BOOST_TEST_CASE(&test1)); + test->add(BOOST_TEST_CASE(&test2)); + test->add(BOOST_TEST_CASE(&test3)); + test->add(BOOST_TEST_CASE(&test4)); + test->add(BOOST_TEST_CASE(&test5)); + test->add(BOOST_TEST_CASE(&test6)); + + return test; +} |