]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/qi/utree3.cpp
1 // Copyright (c) 2001-2011 Hartmut Kaiser
2 // Copyright (c) 2001-2011 Joel de Guzman
3 // Copyright (c) 2010 Bryce Lelbach
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)
8 #include <boost/config/warning_disable.hpp>
9 #include <boost/detail/lightweight_test.hpp>
11 #include <boost/spirit/include/qi.hpp>
12 #include <boost/spirit/include/support_utree.hpp>
13 #include <boost/mpl/print.hpp>
19 inline bool check(boost::spirit::utree
const& val
, std::string expected
)
23 if (s
.str() == expected
+ " ")
26 std::cerr
<< "got result: " << s
.str()
27 << ", expected: " << expected
<< std::endl
;
33 using spirit_test::test_attr
;
34 using boost::spirit::utree
;
35 using boost::spirit::utree_type
;
36 using boost::spirit::utf8_string_range_type
;
37 using boost::spirit::utf8_symbol_type
;
38 using boost::spirit::utf8_string_type
;
40 using boost::spirit::qi::real_parser
;
41 using boost::spirit::qi::strict_real_policies
;
42 using boost::spirit::qi::digit
;
43 using boost::spirit::qi::char_
;
44 using boost::spirit::qi::string
;
45 using boost::spirit::qi::int_
;
46 using boost::spirit::qi::double_
;
47 using boost::spirit::qi::space
;
48 using boost::spirit::qi::space_type
;
49 using boost::spirit::qi::rule
;
50 using boost::spirit::qi::as
;
51 using boost::spirit::qi::lexeme
;
55 typedef real_parser
<double, strict_real_policies
<double> >
57 strict_double_type
const strict_double
= strict_double_type();
60 BOOST_TEST(test_attr("10", strict_double
| int_
, ut
) &&
61 ut
.which() == utree_type::int_type
&& check(ut
, "10"));
63 BOOST_TEST(test_attr("10.2", strict_double
| int_
, ut
) &&
64 ut
.which() == utree_type::double_type
&& check(ut
, "10.2"));
66 rule
<char const*, boost::variant
<int, double>()> r1
= strict_double
| int_
;
68 BOOST_TEST(test_attr("10", r1
, ut
) &&
69 ut
.which() == utree_type::int_type
&& check(ut
, "10"));
71 BOOST_TEST(test_attr("10.2", r1
, ut
) &&
72 ut
.which() == utree_type::double_type
&& check(ut
, "10.2"));
74 rule
<char const*, utree()> r2
= strict_double
| int_
;
76 BOOST_TEST(test_attr("10", r2
, ut
) &&
77 ut
.which() == utree_type::int_type
&& check(ut
, "10"));
79 BOOST_TEST(test_attr("10.2", r2
, ut
) &&
80 ut
.which() == utree_type::double_type
&& check(ut
, "10.2"));
82 rule
<char const*, utree::list_type()> r3
= strict_double
| int_
;
84 BOOST_TEST(test_attr("10", r3
, ut
) &&
85 ut
.which() == utree_type::list_type
&& check(ut
, "( 10 )"));
87 BOOST_TEST(test_attr("10.2", r3
, ut
) &&
88 ut
.which() == utree_type::list_type
&& check(ut
, "( 10.2 )"));
95 BOOST_TEST(test_attr("x", -char_
, ut
));
96 BOOST_TEST(ut
.which() == utree_type::string_type
);
97 BOOST_TEST(check(ut
, "\"x\""));
100 BOOST_TEST(test_attr("", -char_
, ut
));
101 BOOST_TEST(ut
.which() == utree_type::invalid_type
);
102 BOOST_TEST(check(ut
, "<invalid>"));
105 BOOST_TEST(test_attr("1x", int_
>> -char_
, ut
));
106 BOOST_TEST(ut
.which() == utree_type::list_type
);
107 BOOST_TEST(check(ut
, "( 1 \"x\" )"));
110 BOOST_TEST(test_attr("1", int_
>> -char_
, ut
));
111 BOOST_TEST(ut
.which() == utree_type::list_type
);
112 BOOST_TEST(check(ut
, "( 1 )"));
115 BOOST_TEST(test_attr("1x", -int_
>> char_
, ut
));
116 BOOST_TEST(ut
.which() == utree_type::list_type
);
117 BOOST_TEST(check(ut
, "( 1 \"x\" )"));
120 BOOST_TEST(test_attr("x", -int_
>> char_
, ut
));
121 BOOST_TEST(ut
.which() == utree_type::list_type
);
122 BOOST_TEST(check(ut
, "( \"x\" )"));
125 rule
<char const*, utree::list_type()> r1
= int_
>> -char_
;
127 BOOST_TEST(test_attr("1x", r1
, ut
));
128 BOOST_TEST(ut
.which() == utree_type::list_type
);
129 BOOST_TEST(check(ut
, "( 1 \"x\" )"));
132 BOOST_TEST(test_attr("1", r1
, ut
));
133 BOOST_TEST(ut
.which() == utree_type::list_type
);
134 BOOST_TEST(check(ut
, "( 1 )"));
137 rule
<char const*, utree::list_type()> r2
= -int_
>> char_
;
139 BOOST_TEST(test_attr("1x", r2
, ut
));
140 BOOST_TEST(ut
.which() == utree_type::list_type
);
141 BOOST_TEST(check(ut
, "( 1 \"x\" )"));
144 BOOST_TEST(test_attr("x", r2
, ut
));
145 BOOST_TEST(ut
.which() == utree_type::list_type
);
146 BOOST_TEST(check(ut
, "( \"x\" )"));
149 rule
<char const*, utree()> r3
= int_
;
151 BOOST_TEST(test_attr("1", -r3
, ut
));
152 BOOST_TEST(ut
.which() == utree_type::int_type
);
153 BOOST_TEST(check(ut
, "1"));
156 BOOST_TEST(test_attr("", -r3
, ut
));
157 BOOST_TEST(ut
.which() == utree_type::invalid_type
);
158 BOOST_TEST(check(ut
, "<invalid>"));
164 using boost::spirit::qi::as_string
;
167 BOOST_TEST(test_attr("xy", as_string
[char_
>> char_
], ut
) &&
168 ut
.which() == utree_type::string_type
&& check(ut
, "\"xy\""));
171 BOOST_TEST(test_attr("ab1.2", as_string
[*~digit
] >> double_
, ut
) &&
172 ut
.which() == utree_type::list_type
&& check(ut
, "( \"ab\" 1.2 )"));
175 BOOST_TEST(test_attr("xy", as_string
[*char_
], ut
) &&
176 ut
.which() == utree_type::string_type
&& check(ut
, "\"xy\""));
179 BOOST_TEST(test_attr("x,y", as_string
[char_
>> ',' >> char_
], ut
) &&
180 ut
.which() == utree_type::string_type
&& check(ut
, "\"xy\""));
183 BOOST_TEST(test_attr("x,y", char_
>> ',' >> char_
, ut
) &&
184 ut
.which() == utree_type::list_type
&& check(ut
, "( \"x\" \"y\" )"));
187 BOOST_TEST(test_attr("a,b1.2", as_string
[~digit
% ','] >> double_
, ut
) &&
188 ut
.which() == utree_type::list_type
&& check(ut
, "( \"ab\" 1.2 )"));
191 BOOST_TEST(test_attr("a,b1.2", ~digit
% ',' >> double_
, ut
) &&
192 ut
.which() == utree_type::list_type
&& check(ut
, "( \"a\" \"b\" 1.2 )"));
196 return boost::report_errors();