]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/repository/test/qi/keywords.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3 Copyright (c) 2011 Thomas Bernard
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
11 #include <boost/detail/lightweight_test.hpp>
12 #include <boost/utility/enable_if.hpp>
14 #include <boost/spirit/include/qi_operator.hpp>
15 #include <boost/spirit/include/qi_char.hpp>
16 #include <boost/spirit/include/qi_string.hpp>
17 #include <boost/spirit/include/qi_numeric.hpp>
18 #include <boost/spirit/include/qi_directive.hpp>
19 #include <boost/spirit/include/qi_action.hpp>
20 #include <boost/spirit/include/qi_nonterminal.hpp>
21 #include <boost/spirit/include/support_argument.hpp>
22 #include <boost/spirit/include/phoenix_core.hpp>
23 #include <boost/spirit/include/phoenix_operator.hpp>
24 #include <boost/spirit/include/phoenix_container.hpp>
25 #include <boost/spirit/repository/include/qi_kwd.hpp>
26 #include <boost/spirit/repository/include/qi_keywords.hpp>
37 namespace boost
{ namespace spirit
{ namespace traits
42 struct container_value
<x_attr
>
44 typedef char type
; // value type of container
49 struct push_back_container
<x_attr
, char>
51 static bool call(x_attr
& /*c*/, char /*val*/)
53 // push back value type into container
62 using spirit_test::test_attr
;
63 using spirit_test::test
;
64 using namespace boost::spirit
;
65 using namespace boost::spirit::ascii
;
66 using boost::spirit::repository::kwd
;
67 using boost::spirit::repository::ikwd
;
68 using boost::spirit::repository::dkwd
;
69 using boost::spirit::qi::inf
;
70 using boost::spirit::qi::omit
;
71 using boost::spirit::qi::int_
;
72 using boost::spirit::qi::lit
;
73 using boost::spirit::qi::_1
;
74 using boost::spirit::qi::lexeme
;
80 boost::fusion::vector
<char,char,int> data
;
81 BOOST_TEST( test_attr("c=1 a=a", kwd("a")[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], data
, space
));
82 BOOST_TEST( boost::fusion::at_c
<0>(data
) == 'a' );
83 BOOST_TEST( boost::fusion::at_c
<1>(data
) == 0 );
84 BOOST_TEST( boost::fusion::at_c
<2>(data
) == 1 );
86 BOOST_TEST( test("a=a c=1", kwd("a")[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
88 BOOST_TEST( test("", kwd("a")[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
91 BOOST_TEST(test("a=a b=b c=1", kwd("a",1)[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
92 BOOST_TEST(test("a=a b=c b=e c=1", kwd("a",1)[ '=' > char_
] / kwd("b",2)[ '=' > char_
] / kwd("c")['=' > int_
], space
));
93 BOOST_TEST(!test("b=c b=e c=1", kwd("a",1)[ '=' > char_
] / kwd("b",2)[ '=' > char_
] / kwd("c")['=' > int_
], space
));
96 BOOST_TEST(test("a=f b=c b=e c=1", kwd("a",1,2)[ '=' > char_
] / kwd("b",0,2)[ '=' > char_
] / kwd("c",1,2)['=' > int_
], space
));
97 BOOST_TEST(!test("b=c b=e c=1", kwd("a",1,2)[ '=' > char_
] / kwd("b",0,1)[ '=' > char_
] / kwd("c",1,2)['=' > int_
], space
));
98 BOOST_TEST(test("a=g a=f b=c b=e c=1", kwd("a",1,2)[ '=' > char_
] / kwd("b",0,2)[ '=' > char_
] / kwd("c",1,2)['=' > int_
], space
));
99 BOOST_TEST(!test("a=f a=e b=c b=e a=p c=1", kwd("a",1,2)[ '=' > char_
] / kwd("b",0,1)[ '=' > char_
] / kwd("c",1,2)['=' > int_
], space
));
102 BOOST_TEST(test("a=f b=c b=e c=1", kwd("a",1,inf
)[ '=' > char_
] / kwd("b",0,inf
)[ '=' > char_
] / kwd("c",1,inf
)['=' > int_
], space
));
103 BOOST_TEST(!test("b=c b=e c=1", kwd("a",1,inf
)[ '=' > char_
] / kwd("b",0,inf
)[ '=' > char_
] / kwd("c",1,inf
)['=' > int_
], space
));
104 BOOST_TEST(test("a=f a=f a=g b=c b=e c=1 a=e", kwd("a",1,inf
)[ '=' > char_
] / kwd("b",0,inf
)[ '=' > char_
] / kwd("c",1,inf
)['=' > int_
], space
));
107 { // Single keyword, empty string
108 BOOST_TEST(test(" ", kwd("aad")[char_
],space
));
110 BOOST_TEST(test("aad E ", kwd("aad")[char_
],space
));
111 // Single no case keyword
112 BOOST_TEST(test("AaD E ", ikwd("aad")[char_
],space
));
118 boost::fusion::vector
<std::vector
<int>,std::vector
<int>,std::vector
<int> > data
;
119 BOOST_TEST(test_attr(" a=1 b=2 b=5 c=3",kwd("a")[ '=' > int_
] / kwd("b")[ '=' > int_
] / kwd("c")['=' > int_
] , data
, space
)
120 && (boost::fusion::at_c
<0>(data
).size()==1)
121 && (boost::fusion::at_c
<0>(data
)[0]==1)
123 &&(boost::fusion::at_c
<1>(data
).size()==2)
124 &&(boost::fusion::at_c
<1>(data
)[0]==2)
125 &&(boost::fusion::at_c
<1>(data
)[1]==5)
127 &&(boost::fusion::at_c
<2>(data
).size()==1)
128 &&(boost::fusion::at_c
<2>(data
)[0]==3)
134 BOOST_TEST( test("B=a c=1 a=E", no_case
[kwd("a")[ "=E" ] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
]], space
));
135 BOOST_TEST( test("B=a c=1 a=e", no_case
[kwd("a")[ "=E" ] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
]], space
));
136 BOOST_TEST( !test("B=a c=1 A=E", no_case
[kwd("a")[ '=' > char_
]] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
137 BOOST_TEST( test("b=a c=1 A=E", no_case
[kwd("a")[ '=' > char_
]] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
138 BOOST_TEST( !test("A=a c=1 a=E", kwd("a")[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
139 BOOST_TEST( test("A=a c=1 a=E", ikwd("a")[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
140 BOOST_TEST( !test("A=a C=1 a=E", ikwd("a")[ '=' > char_
] / kwd("b")[ '=' > char_
] / kwd("c")['=' > int_
], space
));
144 // iterator restoration
145 BOOST_TEST( test("a=a c=1 ba=d", (kwd("a")[ '=' > char_
] / kwd("b")[ '=' > int_
] / kwd("c")['=' > int_
] ) > lit("ba=") > char_
, space
));
146 BOOST_TEST( test("A=a c=1 ba=d", (ikwd("a")[ '=' > char_
] / kwd("b")[ '=' > int_
] / kwd("c")['=' > int_
] ) > lit("ba=") > char_
, space
));
150 namespace phx
= boost::phoenix
;
153 BOOST_TEST(test("b=2 c=4", kwd("b")['=' > int_
][phx::ref(v
)=_1
] / kwd("c")[ '=' > int_
],space
) &&
160 boost::fusion::vector
<char,char,int> data
;
161 BOOST_TEST( test_attr("c,1,2=1 2,b=a", kwd( char_
>> lit(',') >> int_
)[ '=' >> char_
] / kwd(int_
>> lit(',') >> char_
)[ '=' >> char_
] / kwd(char_
>> lit(',') >> int_
>> lit(',') >> int_
)['=' >> int_
], data
, space
));
162 BOOST_TEST( boost::fusion::at_c
<0>(data
) == 0 );
163 BOOST_TEST( boost::fusion::at_c
<1>(data
) == 'a');
164 BOOST_TEST( boost::fusion::at_c
<2>(data
) == 1 );
166 BOOST_TEST( test("2,b=a c,1,2=1", kwd( char_
>> ',' >> int_
)[ '=' >> char_
] / kwd(int_
>> ',' >> char_
)[ '=' >> char_
] / kwd(char_
>> ',' >> int_
>> ',' >> int_
)['=' >> int_
], space
));
168 BOOST_TEST( test("", kwd( char_
>> ',' >> int_
)[ '=' >> char_
] / kwd(int_
>> ',' >> char_
)[ '=' >> char_
] / kwd(char_
>> ',' >> int_
>> ',' >> int_
)['=' >> int_
], space
));
171 BOOST_TEST(test("7a=a 5b=b 2c=1", kwd(int_
>> lit('a'),1)[ '=' >> char_
] / kwd(int_
>> lit('b'))[ '=' >> char_
] / kwd(int_
>> lit('c'))['=' >> int_
], space
));
172 BOOST_TEST(test("7a=a 3b=d 5b=b 2c=1", kwd(int_
>> lit('a'),1)[ '=' >> char_
] / kwd(int_
>> lit('b'),2)[ '=' >> char_
] / kwd(int_
>>'c')['=' >> int_
], space
));
173 BOOST_TEST(!test("7a=a 5b=b 2c=1", kwd(int_
>> lit('a'),1)[ '=' >> char_
] / kwd(int_
>> lit('b'),2)[ '=' >> char_
] / kwd(int_
>>'c')['=' >> int_
], space
));
176 BOOST_TEST(test("6a=f 2b=c 3b=e 1c=1", kwd(int_
>> "a",1,2)[ '=' >> char_
] / kwd(int_
>> "b",0,2)[ '=' >> char_
] / kwd(int_
>> "c",1,2)['=' >> int_
], space
));
177 BOOST_TEST(!test("1b=c 6b=e 2c=1", kwd(int_
>> "a",1,2)[ '=' >> char_
] / kwd(int_
>> "b",0,1)[ '=' >> char_
] / kwd(int_
>> "c",1,2)['=' >> int_
], space
));
178 BOOST_TEST(test("4a=g 7a=f 2b=c 1b=e 4c=1", kwd(int_
>> "a",1,2)[ '=' >> char_
] / kwd(int_
>> "b",0,2)[ '=' >> char_
] / kwd(int_
>> "c",1,2)['=' >> int_
], space
));
179 BOOST_TEST(!test("1a=f a=e 2b=c 5b=e 6a=p 67c=1", kwd(int_
>> "a",1,2)[ '=' >> char_
] / kwd(int_
>> "b",0,1)[ '=' >> char_
] / kwd(int_
>> "c",1,2)['=' >> int_
], space
));
182 BOOST_TEST(test("41a=f 44b=c 12b=e 45c=1", kwd(int_
>> "a",1,inf
)[ '=' >> char_
] / kwd(int_
>> "b",0,inf
)[ '=' >> char_
] / kwd(int_
>> "c",1,inf
)['=' >> int_
], space
));
183 BOOST_TEST(!test("31b=c 55b=e 2c=1", kwd("a",1,inf
)[ '=' >> char_
] / kwd("b",0,inf
)[ '=' >> char_
] / kwd("c",1,inf
)['=' >> int_
], space
));
184 BOOST_TEST(test("12a=f 45a=f 12a=g 1b=c 7b=e 12c=1 6a=e", kwd(int_
>> "a",1,inf
)[ '=' >> char_
] / kwd(int_
>> "b",0,inf
)[ '=' >> char_
] / kwd(int_
>> "c",1,inf
)['=' >> int_
], space
));
191 boost::fusion::vector
<std::vector
<int>,std::vector
<int>,std::vector
<int> > data
;
192 BOOST_TEST(test_attr(" 41a=1 4b=2 12b=5 5c=3",kwd(int_
>> "a")[ '=' >> int_
] / kwd(int_
>> "b")[ '=' >> int_
] / kwd(int_
>> "c")['=' >> int_
] , data
, space
)
193 && (boost::fusion::at_c
<0>(data
).size()==1)
194 && (boost::fusion::at_c
<0>(data
)[0]==1)
196 &&(boost::fusion::at_c
<1>(data
).size()==2)
197 &&(boost::fusion::at_c
<1>(data
)[0]==2)
198 &&(boost::fusion::at_c
<1>(data
)[1]==5)
200 &&(boost::fusion::at_c
<2>(data
).size()==1)
201 &&(boost::fusion::at_c
<2>(data
)[0]==3)
210 BOOST_TEST( test("12B=a 5c=1 1a=E", no_case
[kwd(int_
>> "a")[ "=E" ] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
]], space
));
211 BOOST_TEST( test("5B=a 2c=1 5a=e", no_case
[kwd(int_
>> "a")[ "=E" ] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
]], space
));
212 BOOST_TEST( !test("1B=a 8c=1 1A=E", no_case
[kwd(int_
>> "a")[ '=' >> char_
]] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
], space
));
213 BOOST_TEST( test("2b=a 6c=1 5A=E", no_case
[kwd(int_
>> "a")[ '=' >> char_
]] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
], space
));
214 BOOST_TEST( !test("1A=a 5c=1 1a=E", kwd(int_
>> "a")[ '=' >> char_
] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
], space
));
215 BOOST_TEST( test("A=a 23c=1 a=E", ikwd("a")[ '=' >> char_
] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
], space
));
216 BOOST_TEST( !test("A=a 21C=1 a=E", ikwd("a")[ '=' >> char_
] / kwd(int_
>> "b")[ '=' >> char_
] / kwd(int_
>> "c")['=' >> int_
], space
));
220 // iterator restoration
221 BOOST_TEST( test("4a=a c4=1 ba=d", (kwd(int_
>> "a")[ '=' >> char_
] / kwd("b" >> int_
)[ '=' >> int_
] / kwd("c" >> int_
)['=' >> int_
] ) >> lit("ba=") >> char_
, space
));
225 namespace phx
= boost::phoenix
;
228 BOOST_TEST(test("b4=2 c1=4", kwd("b" >> int_
)['=' >> int_
][phx::ref(v
)=_1
] / kwd("c" >> int_
)[ '=' >> int_
],space
) &&
233 // complex keyword single test
236 BOOST_TEST( test_attr("(a,1) = 3214", kwd( '(' >> char_
>> ',' >> int_
>> ')' )['=' >> int_
], result
, space
) );
237 BOOST_TEST(result
==3214);
240 // Mixed complex keyword loop
241 boost::fusion::vector
<int,int,int> data
;
243 BOOST_TEST( test_attr("(a,1) = 3214 b += 2 hello 10 (a,2)=31", kwd( '(' >> char_
>> ',' >> int_
>> ')' )['=' >> int_
] / kwd("hello")[int_
] / kwd("b")["+=" >> int_
], data
, space
) );
244 BOOST_TEST( boost::fusion::at_c
<0>(data
) == 31);
245 BOOST_TEST( boost::fusion::at_c
<1>(data
) == 10);
246 BOOST_TEST( boost::fusion::at_c
<2>(data
) == 2);
251 BOOST_TEST( test("a =a", dkwd("a")[ '=' > char_
] , space
));
252 BOOST_TEST( !test("a=a", dkwd("a")[ '=' > char_
] , space
));
253 BOOST_TEST(test("a =a b =b c=1", dkwd("a",1)[ '=' > char_
] / dkwd("b",1,2)[ '=' > char_
] / kwd("c")['=' > int_
], space
));
254 BOOST_TEST(!test("a=a b=b c =1", dkwd("a",1)[ '=' > char_
] / dkwd("b",1,2)[ '=' > char_
] / kwd("c")['=' > int_
], space
));
256 BOOST_TEST(test("a =a b =b b =d c=1", dkwd("a",1,inf
)[ '=' > char_
] / dkwd("b",2,inf
)[ '=' > char_
] / kwd("c")['=' > int_
], space
));
260 { // attribute customization
263 // test_attr("a = b c = d", kwd("a")['=' > char_] / kwd("c")['=' > char_], x);
267 return boost::report_errors();