1 | /*============================================================================= |
2 | Copyright (c) 2001-2011 Joel de Guzman |
3 | |
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> |
8 | |
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> |
20 | |
21 | #include <string> |
22 | #include <iostream> |
23 | #include "test.hpp" |
24 | |
25 | int |
26 | main() |
27 | { |
28 | using spirit_test::test; |
29 | using spirit_test::test_attr; |
30 | |
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; |
39 | |
40 | { |
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')))); |
44 | } |
45 | |
46 | { |
47 | vector<optional<int>, optional<char> > attr; |
48 | |
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')); |
52 | |
53 | at_c<1>(seq&: 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))); |
57 | |
58 | at_c<0>(seq&: 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')); |
62 | |
63 | BOOST_TEST((!test("a123" , int_ || alpha))); |
64 | } |
65 | |
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))); |
71 | |
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)); |
76 | |
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())); |
81 | } |
82 | |
83 | { // test unused attribute handling |
84 | |
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')); |
89 | } |
90 | |
91 | { // test unused attribute handling |
92 | |
93 | optional<int> attr; |
94 | BOOST_TEST((test_attr("123ab" , int_ || "ab" , attr))); |
95 | BOOST_TEST((attr == 123)); |
96 | } |
97 | |
98 | { // test action |
99 | namespace phx = boost::phoenix; |
100 | |
101 | optional<int> i; |
102 | optional<char> c; |
103 | |
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')); |
107 | } |
108 | |
109 | return boost::report_errors(); |
110 | } |
111 | |
112 | |