12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- ///////////////////////////////////////////////////////////////////////////////
- // test_assert.cpp
- //
- // 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_static.hpp>
- #include <boost/xpressive/regex_actions.hpp>
- #include <boost/test/unit_test.hpp>
- using namespace boost::xpressive;
- bool three_or_six(ssub_match const &sub)
- {
- return sub.length() == 3 || sub.length() == 6;
- }
- ///////////////////////////////////////////////////////////////////////////////
- // test1
- // simple custom assert that checks the length of a matched sub-expression
- void test1()
- {
- std::string str("foo barbaz fink");
- // match words of 3 characters or 6 characters.
- sregex rx = (bow >> +_w >> eow)[ check(&three_or_six) ] ;
- sregex_iterator first(str.begin(), str.end(), rx), last;
- BOOST_CHECK_EQUAL(std::distance(first, last), 2);
- }
- ///////////////////////////////////////////////////////////////////////////////
- // test2
- // same as above, but using a lambda
- void test2()
- {
- std::string str("foo barbaz fink");
- // match words of 3 characters or 6 characters.
- sregex rx = (bow >> +_w >> eow)[ check(length(_)==3 || length(_)==6) ] ;
- sregex_iterator first(str.begin(), str.end(), rx), last;
- BOOST_CHECK_EQUAL(std::distance(first, last), 2);
- }
- ///////////////////////////////////////////////////////////////////////////////
- // test3
- // more complicated use of custom assertions to validate a date
- void test3()
- {
- int const days_per_month[] =
- {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 31, 31};
- mark_tag month(1), day(2);
- // find a valid date of the form month/day/year.
- sregex date =
- (
- // Month must be between 1 and 12 inclusive
- (month= _d >> !_d) [ check(as<int>(_) >= 1
- && as<int>(_) <= 12) ]
- >> '/'
- // Day must be between 1 and 31 inclusive
- >> (day= _d >> !_d) [ check(as<int>(_) >= 1
- && as<int>(_) <= 31) ]
- >> '/'
- // Only consider years between 1970 and 2038
- >> (_d >> _d >> _d >> _d) [ check(as<int>(_) >= 1970
- && as<int>(_) <= 2038) ]
- )
- // Ensure the month actually has that many days.
- [ check( ref(days_per_month)[as<int>(month)-1] >= as<int>(day) ) ]
- ;
- smatch what;
- std::string str("99/99/9999 2/30/2006 2/28/2006");
- BOOST_REQUIRE(regex_search(str, what, date));
- BOOST_CHECK_EQUAL(what[0], "2/28/2006");
- }
- using namespace boost::unit_test;
- ///////////////////////////////////////////////////////////////////////////////
- // init_unit_test_suite
- //
- test_suite* init_unit_test_suite( int argc, char* argv[] )
- {
- test_suite *test = BOOST_TEST_SUITE("test_assert");
- test->add(BOOST_TEST_CASE(&test1));
- test->add(BOOST_TEST_CASE(&test2));
- test->add(BOOST_TEST_CASE(&test3));
- return test;
- }
|