95 lines
3.0 KiB
C++
95 lines
3.0 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// 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;
|
|
}
|
|
|