// Copyright (c) 2001-2011 Hartmut Kaiser // // 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 #include #include #include #include #include #include #include #include #include "test.hpp" namespace fusion = boost::fusion; template inline std::vector make_vector(T const& t1, T const& t2) { std::vector v; v.push_back(t1); v.push_back(t2); return v; } int main() { using spirit_test::test; using boost::spirit::karma::symbols; { // advanced using boost::spirit::karma::rule; using boost::spirit::karma::lit; typedef spirit_test::output_iterator::type output_iterator_type; symbols > sym; rule r1 = lit("Joel"); rule r2 = lit("Hartmut"); rule r3 = lit("Tom"); rule r4 = lit("Kim"); sym.add ('j', r1.alias()) ('h', r2.alias()) ('t', r3.alias()) ('k', r4.alias()) ; BOOST_TEST_TRAIT_TRUE(( boost::spirit::traits::is_generator< symbols > >)); BOOST_TEST((test("Joel", sym, 'j'))); BOOST_TEST((test("Hartmut", sym, 'h'))); BOOST_TEST((test("Tom", sym, 't'))); BOOST_TEST((test("Kim", sym, 'k'))); BOOST_TEST((!test("", sym, 'x'))); // test copy symbols > sym2; sym2 = sym; BOOST_TEST((test("Joel", sym2, 'j'))); BOOST_TEST((test("Hartmut", sym2, 'h'))); BOOST_TEST((test("Tom", sym2, 't'))); BOOST_TEST((test("Kim", sym2, 'k'))); BOOST_TEST((!test("", sym2, 'x'))); // make sure it plays well with other generators BOOST_TEST((test("Joelyo", sym << "yo", 'j'))); sym.remove ('j') ('h') ; BOOST_TEST((!test("", sym, 'j'))); BOOST_TEST((!test("", sym, 'h'))); } { // more advanced using boost::spirit::karma::rule; using boost::spirit::karma::lit; using boost::spirit::karma::string; typedef spirit_test::output_iterator::type output_iterator_type; symbols > sym; rule r1 = string; sym.add ('j', r1.alias()) ('h', r1.alias()) ('t', r1.alias()) ('k', r1.alias()) ; BOOST_TEST_TRAIT_TRUE(( boost::spirit::traits::is_generator< symbols >)); BOOST_TEST((test("Joel", sym, fusion::make_vector('j', "Joel")))); BOOST_TEST((test("Hartmut", sym, fusion::make_vector('h', "Hartmut")))); BOOST_TEST((test("Tom", sym, fusion::make_vector('t', "Tom")))); BOOST_TEST((test("Kim", sym, fusion::make_vector('k', "Kim")))); BOOST_TEST((!test("", sym, 'x'))); // test copy symbols > sym2; sym2 = sym; BOOST_TEST((test("Joel", sym2, fusion::make_vector('j', "Joel")))); BOOST_TEST((test("Hartmut", sym2, fusion::make_vector('h', "Hartmut")))); BOOST_TEST((test("Tom", sym2, fusion::make_vector('t', "Tom")))); BOOST_TEST((test("Kim", sym2, fusion::make_vector('k', "Kim")))); BOOST_TEST((!test("", sym2, 'x'))); // make sure it plays well with other generators BOOST_TEST((test("Joelyo", sym << "yo", fusion::make_vector('j', "Joel")))); sym.remove ('j') ('h') ; BOOST_TEST((!test("", sym, 'j'))); BOOST_TEST((!test("", sym, 'h'))); } { // test for proto problem with rvalue references (10-11-2011) symbols sym; sym += std::make_pair('j', "Joel"); sym += std::make_pair('h', "Hartmut"); BOOST_TEST((test("Joel", sym, 'j'))); BOOST_TEST((test("Hartmut", sym, 'h'))); } return boost::report_errors(); }