symbols_tests.cpp

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

CPP
319
字号
/*=============================================================================    Copyright (c) 1998-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 <string>#include <boost/detail/lightweight_test.hpp>#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_symbols.hpp>#include <boost/detail/lightweight_test.hpp>///////////////////////////////////////////////////////////////////////////////using namespace std;using namespace BOOST_SPIRIT_CLASSIC_NS;///////////////////////////////////////////////////////////////////////////////template <typename IteratorT>boolequal(IteratorT p, IteratorT q){    while (*p && *p == *q)    {        ++p;        ++q;    }    return *p == *q;}template <class SymbolsT, typename CharT>voidcheck(    SymbolsT const &sym,    CharT    const *candidate,    bool           hit,    CharT    const *result,    int            length){    parse_info<CharT const*> info = parse(candidate, sym);#define correctly_matched hit == info.hit#define correct_match_length unsigned(length) == info.length#define correct_tail equal(candidate + (hit?1:0)*length, result)    BOOST_TEST(correctly_matched);    if (hit)    {        BOOST_TEST(correct_match_length);        BOOST_TEST(correct_tail);    }    else    {        BOOST_TEST(correct_tail);    }}template <typename T>struct store_action{    store_action(T const &v) : value(v) {}    void operator()(T &v) const { v = value; }private:    T const value;};template <typename T>store_action<T>store(T const &v){    return v;}template <typename T>struct check_action{    check_action(T const &v) : value(v) {}#define correct_value_stored (v==value)    void operator()(T const &v) const { BOOST_TEST(correct_value_stored); }private:    T const value;};template <typename T>check_action<T>check(T const &v){    return v;}static voiddefault_constructible(){   // this actually a compile time test    symbols<>                     ns1;    symbols<int, wchar_t>         ws1;    symbols<std::string, char>    ns2;    symbols<std::string, wchar_t> ws2;    (void)ns1; (void)ws1; (void)ns2; (void)ws2;}static voidnarrow_match_tests(){    symbols<>   sym;    sym = "pineapple", "orange", "banana", "applepie", "apple";    check(sym, "pineapple", true, "", 9);    check(sym, "orange", true, "", 6);    check(sym, "banana", true, "", 6);    check(sym, "apple", true, "", 5);    check(sym, "pizza", false, "pizza", -1);    check(sym, "steak", false, "steak", -1);    check(sym, "applepie", true, "", 8);    check(sym, "bananarama", true, "rama", 6);    check(sym, "applet", true, "t", 5);    check(sym, "applepi", true, "pi", 5);    check(sym, "appl", false, "appl", -1);    check(sym, "pineapplez", true, "z", 9);    check(sym, "orangez", true, "z", 6);    check(sym, "bananaz", true, "z", 6);    check(sym, "applez", true, "z", 5);    check(sym, "pizzaz", false, "pizzaz", -1);    check(sym, "steakz", false, "steakz", -1);    check(sym, "applepiez", true, "z", 8);    check(sym, "bananaramaz", true, "ramaz", 6);    check(sym, "appletz", true, "tz", 5);    check(sym, "applepix", true, "pix", 5);}static voidnarrow_copy_ctor_tests(){    symbols<>   sym;    sym = "pineapple", "orange", "banana", "applepie", "apple";    symbols<>   sym2(sym);    check(sym2, "pineapple", true, "", 9);    check(sym2, "pizza", false, "pizza", -1);    check(sym2, "bananarama", true, "rama", 6);}static voidnarrow_assigment_operator_tests(){    symbols<>   sym;    sym = "pineapple", "orange", "banana", "applepie", "apple";    symbols<>   sym2;    sym2 = sym;    check(sym2, "pineapple", true, "", 9);    check(sym2, "pizza", false, "pizza", -1);    check(sym2, "bananarama", true, "rama", 6);}static voidnarrow_value_tests(){   // also tests the add member functions    symbols<>   sym;    sym = "orange", "banana";    sym.add("pineapple",1234);    sym.add("lemon");    parse("orange", sym[store(12345)]);    parse("orange", sym[check(12345)]);    parse("pineapple", sym[check(1234)]);    parse("banana", sym[check(int())]);    parse("lemon", sym[check(int())]);}static voidnarrow_free_functions_tests(){    symbols<>   sym;#define add_returned_non_null_value (res!=0)#define add_returned_null (res==0)#define find_returned_non_null_value (res!=0)#define find_returned_null (res==0)    int *res = add(sym,"pineapple");    BOOST_TEST(add_returned_non_null_value);    res = add(sym,"pineapple");    BOOST_TEST(add_returned_null);    res = find(sym, "pineapple");    BOOST_TEST(find_returned_non_null_value);    res = find(sym, "banana");    BOOST_TEST(find_returned_null);}static voidwide_match_tests(){    symbols<int, wchar_t>   sym;    sym = L"pineapple", L"orange", L"banana", L"applepie", L"apple";    check(sym, L"pineapple", true, L"", 9);    check(sym, L"orange", true, L"", 6);    check(sym, L"banana", true, L"", 6);    check(sym, L"apple", true, L"", 5);    check(sym, L"pizza", false, L"pizza", -1);    check(sym, L"steak", false, L"steak", -1);    check(sym, L"applepie", true, L"", 8);    check(sym, L"bananarama", true, L"rama", 6);    check(sym, L"applet", true, L"t", 5);    check(sym, L"applepi", true, L"pi", 5);    check(sym, L"appl", false, L"appl", -1);    check(sym, L"pineapplez", true, L"z", 9);    check(sym, L"orangez", true, L"z", 6);    check(sym, L"bananaz", true, L"z", 6);    check(sym, L"applez", true, L"z", 5);    check(sym, L"pizzaz", false, L"pizzaz", -1);    check(sym, L"steakz", false, L"steakz", -1);    check(sym, L"applepiez", true, L"z", 8);    check(sym, L"bananaramaz", true, L"ramaz", 6);    check(sym, L"appletz", true, L"tz", 5);    check(sym, L"applepix", true, L"pix", 5);}static voidwide_copy_ctor_tests(){    symbols<int, wchar_t>   sym;    sym = L"pineapple", L"orange", L"banana", L"applepie", L"apple";    symbols<int, wchar_t>   sym2(sym);    check(sym2, L"pineapple", true, L"", 9);    check(sym2, L"pizza", false, L"pizza", -1);    check(sym2, L"bananarama", true, L"rama", 6);}static voidwide_assigment_operator_tests(){    symbols<int, wchar_t>   sym;    sym = L"pineapple", L"orange", L"banana", L"applepie", L"apple";    symbols<int, wchar_t>   sym2;    sym2 = sym;    check(sym2, L"pineapple", true, L"", 9);    check(sym2, L"pizza", false, L"pizza", -1);    check(sym2, L"bananarama", true, L"rama", 6);}static voidwide_value_tests(){   // also tests the add member functions    symbols<int, wchar_t>   sym;    sym = L"orange", L"banana";    sym.add(L"pineapple",1234);    sym.add(L"lemon");    parse(L"orange", sym[store(12345)]);    parse(L"orange", sym[check(12345)]);    parse(L"pineapple", sym[check(1234)]);    parse(L"banana", sym[check(int())]);    parse(L"lemon", sym[check(int())]);}static voidwide_free_functions_tests(){    symbols<int, wchar_t>   sym;    int *res = add(sym,L"pineapple");    BOOST_TEST(add_returned_non_null_value);    res = add(sym,L"pineapple");    BOOST_TEST(add_returned_null);    res = find(sym, L"pineapple");    BOOST_TEST(find_returned_non_null_value);    res = find(sym, L"banana");    BOOST_TEST(find_returned_null);}static void free_add_find_functions_tests(){    symbols<> sym;    BOOST_TEST(*add(sym, "a", 0) == 0);    BOOST_TEST(*add(sym, "a2", 1) == 1);    BOOST_TEST(find(sym, "a2"));    BOOST_TEST(find(sym, "a"));}intmain(){    default_constructible();    narrow_match_tests();    narrow_copy_ctor_tests();    narrow_assigment_operator_tests();    narrow_value_tests();    narrow_free_functions_tests();    wide_match_tests();    wide_copy_ctor_tests();    wide_assigment_operator_tests();    wide_value_tests();    wide_free_functions_tests();    free_add_find_functions_tests();    return boost::report_errors();}

⌨️ 快捷键说明

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