/*============================================================================= Copyright (c) 2001-2011 Joel de Guzman 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 #include #include "test.hpp" struct adata { int a; boost::optional b; }; BOOST_FUSION_ADAPT_STRUCT( adata, (int, a) (boost::optional, b) ) struct test_attribute_type { template void operator()(Attribute&, Context&, bool&) const { BOOST_TEST(typeid(Attribute).name() == typeid(boost::optional).name()); } }; int main() { using spirit_test::test; using spirit_test::test_attr; using boost::spirit::qi::_1; using boost::spirit::qi::int_; using boost::spirit::qi::omit; using boost::spirit::ascii::char_; { BOOST_TEST((test("1234", -int_))); BOOST_TEST((test("abcd", -int_, false))); boost::optional n; BOOST_TEST(test_attr("", -int_, n)) && BOOST_TEST(!n); BOOST_TEST(test_attr("123", -int_, n)) && BOOST_TEST(n) && BOOST_TEST_EQ(*n, 123); boost::optional s; BOOST_TEST(test_attr("", -+char_, s)) && BOOST_TEST(!s); BOOST_TEST(test_attr("abc", -+char_, s)) && BOOST_TEST(s) && BOOST_TEST_EQ(*s, "abc"); } { // test propagation of unused using boost::fusion::at_c; using boost::fusion::vector; vector v; BOOST_TEST((test_attr("a1234c", char_ >> -omit[int_] >> char_, v))); BOOST_TEST((at_c<0>(v) == 'a')); BOOST_TEST((at_c<1>(v) == 'c')); v = boost::fusion::vector(); BOOST_TEST((test_attr("a1234c", char_ >> omit[-int_] >> char_, v))); BOOST_TEST((at_c<0>(v) == 'a')); BOOST_TEST((at_c<1>(v) == 'c')); char ch; BOOST_TEST((test_attr(",c", -(',' >> char_), ch))); BOOST_TEST((ch == 'c')); } { // test action boost::optional n = 0; BOOST_TEST((test_attr("1234", (-int_)[test_attribute_type()], n))); BOOST_TEST((n.get() == 1234)); } { std::string s; BOOST_TEST((test_attr("abc", char_ >> -(char_ >> char_), s))); BOOST_TEST(s == "abc"); } { namespace phx = boost::phoenix; boost::optional n = 0; BOOST_TEST((test("1234", (-int_)[phx::ref(n) = _1]))); BOOST_TEST(n.get() == 1234); n = boost::optional(); BOOST_TEST((test("abcd", (-int_)[phx::ref(n) = _1], false))); BOOST_TEST(!n); } { std::vector v; BOOST_TEST((test_attr("a 1 2 a 2", *("a" >> int_ >> -int_), v , char_(' ')))); BOOST_TEST(2 == v.size() && 1 == v[0].a && v[0].b && 2 == *(v[0].b) && 2 == v[1].a && !v[1].b); } return boost::report_errors(); }