]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/qi/sequential_or.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
7 #include <boost/spirit/include/qi_sequential_or.hpp>
9 #include <boost/spirit/include/qi_operator.hpp>
10 #include <boost/spirit/include/qi_char.hpp>
11 #include <boost/spirit/include/qi_string.hpp>
12 #include <boost/spirit/include/qi_numeric.hpp>
13 #include <boost/spirit/include/qi_action.hpp>
14 #include <boost/spirit/include/support_argument.hpp>
15 #include <boost/fusion/include/vector.hpp>
16 #include <boost/fusion/include/at.hpp>
17 #include <boost/phoenix/core.hpp>
18 #include <boost/phoenix/operator.hpp>
19 #include <boost/optional.hpp>
28 using spirit_test::test
;
29 using spirit_test::test_attr
;
31 using boost::spirit::qi::int_
;
32 using boost::spirit::qi::_1
;
33 using boost::spirit::qi::_2
;
34 using boost::spirit::ascii::char_
;
35 using boost::spirit::ascii::alpha
;
36 using boost::fusion::vector
;
37 using boost::fusion::at_c
;
38 using boost::optional
;
41 BOOST_TEST((test("a", char_('a') || char_('b'))));
42 BOOST_TEST((test("b", char_('a') || char_('b'))));
43 BOOST_TEST((test("ab", char_('a') || char_('b'))));
47 vector
<optional
<int>, optional
<char> > attr
;
49 BOOST_TEST((test_attr("a", int_
|| alpha
, attr
)));
50 BOOST_TEST((!at_c
<0>(attr
)));
51 BOOST_TEST((at_c
<1>(attr
).get() == 'a'));
53 at_c
<1>(attr
) = optional
<char>(); // clear the optional
54 BOOST_TEST((test_attr("123", int_
|| alpha
, attr
)));
55 BOOST_TEST((at_c
<0>(attr
).get() == 123));
56 BOOST_TEST((!at_c
<1>(attr
)));
58 at_c
<0>(attr
) = optional
<int>(); // clear the optional
59 BOOST_TEST((test_attr("123a", int_
|| alpha
, attr
)));
60 BOOST_TEST((at_c
<0>(attr
).get() == 123));
61 BOOST_TEST((at_c
<1>(attr
).get() == 'a'));
63 BOOST_TEST((!test("a123", int_
|| alpha
)));
66 { // test whether optional<optional<>> gets properly handled
67 vector
<optional
<int>, optional
<int> > attr1
;
68 BOOST_TEST((test_attr("123", int_
|| '[' >> -int_
>> ']', attr1
)));
69 BOOST_TEST((at_c
<0>(attr1
) && at_c
<0>(attr1
).get() == 123));
70 BOOST_TEST((!at_c
<1>(attr1
)));
72 vector
<optional
<int>, optional
<int> > attr2
;
73 BOOST_TEST((test_attr("[123]", int_
|| '[' >> -int_
>> ']', attr2
)));
74 BOOST_TEST((!at_c
<0>(attr2
)));
75 BOOST_TEST((at_c
<1>(attr2
) && at_c
<1>(attr2
).get() == 123));
77 vector
<optional
<int>, optional
<optional
<int> > > attr3
;
78 BOOST_TEST((test_attr("[]", int_
|| '[' >> -int_
>> ']', attr3
)));
79 BOOST_TEST((!at_c
<0>(attr3
)));
80 BOOST_TEST((at_c
<1>(attr3
) && !at_c
<1>(attr3
).get()));
83 { // test unused attribute handling
85 vector
<optional
<int>, optional
<char> > attr
;
86 BOOST_TEST((test_attr("123abc", int_
|| ("ab" >> char_
), attr
)));
87 BOOST_TEST((at_c
<0>(attr
).get() == 123));
88 BOOST_TEST((at_c
<1>(attr
).get() == 'c'));
91 { // test unused attribute handling
94 BOOST_TEST((test_attr("123ab", int_
|| "ab", attr
)));
95 BOOST_TEST((attr
== 123));
99 namespace phx
= boost::phoenix
;
104 BOOST_TEST((test("123a", (int_
|| alpha
)[(phx::ref(i
) = _1
, phx::ref(c
) = _2
)])));
105 BOOST_TEST((i
.get() == 123));
106 BOOST_TEST((c
.get() == 'a'));
109 return boost::report_errors();