test_symbols.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 355 行

CPP
355
字号
///////////////////////////////////////////////////////////////////////////////// test_symbols.cpp////  Copyright 2008 David Jenkins.//  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 <string>#include <map>#include <boost/version.hpp>#include <boost/xpressive/xpressive_static.hpp>#include <boost/xpressive/regex_actions.hpp>#include <boost/test/unit_test.hpp>#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()namespace xp = boost::xpressive;///////////////////////////////////////////////////////////////////////////////// test1//  simple action which builds a *translated* stringvoid test1(){    using namespace boost::xpressive;    local<std::string> result;    std::string str("foo bar baz foo bar baz");    std::map<std::string,std::string> map1;    map1["foo"] = "1";    map1["bar"] = "2";    map1["baz"] = "3";    sregex rx = skip(_s) (+(a1=map1)        [ result += if_else(length(result) > 0, ",", "") + a1 ]    );    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_CHECK_EQUAL(result.get(), "1,2,3,1,2,3");    }}///////////////////////////////////////////////////////////////////////////////// test2//  find longest match in symbol tablevoid test2(){    using namespace boost::xpressive;    local<std::string> result;    std::string str("foobarbazfoobazbazfoobazbar");    std::map<std::string,std::string> map1;    map1["foo"] = "1";    map1["bar"] = "2";    map1["baz"] = "3";    map1["foobaz"] = "4";    map1["foobazbaz"] = "5";    sregex rx = skip(_s) (+(a1=map1)        [ result += if_else(length(result) > 0, ",", "") + a1 ]    );    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_CHECK_EQUAL(result.get(), "1,2,3,5,4,2");    }}///////////////////////////////////////////////////////////////////////////////// test3//  *map* string to int, push back into list, use alternate ->* syntaxvoid test3(){    using namespace boost::xpressive;    std::list<int> result;    std::string str("foo bar baz bop");    std::map<std::string,int> map1;    map1["foo"] = 1;    map1["bar"] = 23;    map1["baz"] = 456;    map1["bop"] = 7890;#if BOOST_VERSION >= 103500    sregex rx = skip(_s) (+(a1=map1)        [ xp::ref(result)->*push_back( a1 ) ]    );#else    sregex rx = skip(_s) (+(a1=map1)        [ push_back(xp::ref(result), a1 ) ]    );#endif    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_REQUIRE_EQUAL(result.size(), 4u);        BOOST_CHECK_EQUAL(*result.begin(), 1);        BOOST_CHECK_EQUAL(*++result.begin(), 23);        BOOST_CHECK_EQUAL(*++++result.begin(), 456);        BOOST_CHECK_EQUAL(*++++++result.begin(), 7890);    }}///////////////////////////////////////////////////////////////////////////////// test4//  use two input maps to build an output map, with a late-bound action argument.void test4(){    using namespace boost::xpressive;    placeholder< std::map<std::string, int> > const _map = {};    std::string str("aaa=>1 bbb=>2 ccc=>3");    std::map<std::string,std::string> map1;    map1["aaa"] = "foo";    map1["bbb"] = "bar";    map1["ccc"] = "baz";    std::map<std::string,int> map2;    map2["1"] = 1;    map2["2"] = 23;    map2["3"] = 456;    sregex pair = ( (a1=map1) >> "=>" >> (a2= map2) )[ _map[a1] = a2 ];    sregex rx = pair >> *(+_s >> pair);    smatch what;    std::map<std::string, int> result;    what.let(_map = result); // bind the argument!    if(!regex_match(str, what, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_REQUIRE_EQUAL(result.size(), 3u);        BOOST_CHECK_EQUAL(result["foo"], 1);        BOOST_CHECK_EQUAL(result["bar"], 23);        BOOST_CHECK_EQUAL(result["baz"], 456);    }}///////////////////////////////////////////////////////////////////////////////// test5//  test nine maps and attributesvoid test5(){    using namespace boost::xpressive;    local<int> result(0);    std::string str("abcdefghi");    std::map<std::string,int> map1;    std::map<std::string,int> map2;    std::map<std::string,int> map3;    std::map<std::string,int> map4;    std::map<std::string,int> map5;    std::map<std::string,int> map6;    std::map<std::string,int> map7;    std::map<std::string,int> map8;    std::map<std::string,int> map9;    map1["a"] = 1;    map2["b"] = 2;    map3["c"] = 3;    map4["d"] = 4;    map5["e"] = 5;    map6["f"] = 6;    map7["g"] = 7;    map8["h"] = 8;    map9["i"] = 9;    sregex rx =           (a1=map1)[ result += a1 ]        >> (a2=map2)[ result += a2 ]        >> (a3=map3)[ result += a3 ]        >> (a4=map4)[ result += a4 ]        >> (a5=map5)[ result += a5 ]        >> (a6=map6)[ result += a6 ]        >> (a7=map7)[ result += a7 ]        >> (a8=map8)[ result += a8 ]        >> (a9=map9)[ result += a9 ];    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_CHECK_EQUAL(result.get(), 45);    }}///////////////////////////////////////////////////////////////////////////////// test6//  test case-sensitivityvoid test6(){    using namespace boost::xpressive;    local<std::string> result;    std::map<std::string,std::string> map1;    map1["a"] = "1";    map1["A"] = "2";    map1["b"] = "3";    map1["B"] = "4";    std::string str("a A b B a A b B");    sregex rx = skip(_s)(        icase(a1= map1) [ result = a1 ]        >> repeat<3>( (icase(a1= map1) [ result += ',' + a1 ]) )        >> repeat<4>( ((a1= map1) [ result += ',' + a1 ]) )        );    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_CHECK_EQUAL(result.get(), "1,1,3,3,1,2,3,4");    }}///////////////////////////////////////////////////////////////////////////////// test7//  test multiple mutually-exclusive maps and default attribute valuevoid test7(){    using namespace boost::xpressive;    local<std::string> result;    std::map<std::string,std::string> map1;    map1["a"] = "1";    map1["b"] = "2";    std::map<std::string,std::string> map2;    map2["c"] = "3";    map2["d"] = "4";    std::string str("abcde");    sregex rx = *((a1= map1) | (a1= map2) | 'e') [ result += (a1 | "9") ];    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_CHECK_EQUAL(result.get(), "12349");    }}#ifndef BOOST_XPRESSIVE_NO_WREGEXstruct City{    std::wstring name;    char const* nickname;    int population;};BOOST_TYPEOF_REGISTER_TYPE(City)///////////////////////////////////////////////////////////////////////////////// test8//  test wide strings with structure resultvoid test8(){    using namespace boost::xpressive;    City cities[] = {        {L"Chicago", "The Windy City", 945000},        {L"New York", "The Big Apple", 16626000},        {L"\u041c\u043E\u0441\u043A\u0432\u0430", "Moscow", 9299000}    };    int const nbr_cities = sizeof(cities)/sizeof(*cities);    std::map<std::wstring, City> map1;    for(int i=0; i<nbr_cities; ++i)    {        map1[cities[i].name] = cities[i];    }    std::wstring str(L"Chicago \u041c\u043E\u0441\u043A\u0432\u0430");    local<City> result1, result2;    wsregex rx = (a1= map1)[ result1 = a1 ] >> +_s        >> (a1= map1)[ result2 = a1 ];    if(!regex_match(str, rx))    {        BOOST_ERROR("oops");    }    else    {        BOOST_CHECK_EQUAL(result1.get().nickname, "The Windy City");        BOOST_CHECK_EQUAL(result2.get().nickname, "Moscow");    }}#elsevoid test8(){    // This test is empty}#endif///////////////////////////////////////////////////////////////////////////////// test9//  test "not before" using a mapvoid test9(){    using namespace boost::xpressive;    std::string result;    std::string str("foobar");    std::map<std::string,int> map1;    map1["foo"] = 1;    sregex rx = ~before((a1=map1)[a1]) >>        (s1=*_w)[ xp::ref(result) = s1 ];    if(!regex_match(str, rx))    {        BOOST_CHECK_EQUAL(result, "");    }    else    {        BOOST_ERROR("oops");    }}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_symbols");    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));    test->add(BOOST_TEST_CASE(&test7));    test->add(BOOST_TEST_CASE(&test8));    test->add(BOOST_TEST_CASE(&test9));    return test;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?