1// Copyright (c) 2001-2011 Hartmut Kaiser
2// Copyright (c) 2001-2011 Joel de Guzman
3// Copyright (c) 2010 Bryce Lelbach
4//
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
8#include <boost/spirit/include/qi.hpp>
9#include <boost/spirit/include/support_utree.hpp>
10
11#include <sstream>
12
13#include "test.hpp"
14
15inline bool check(boost::spirit::utree const& val, std::string expected)
16{
17 std::stringstream s;
18 s << val;
19 if (s.str() == expected + " ")
20 return true;
21
22 std::cerr << "got result: " << s.str()
23 << ", expected: " << expected << std::endl;
24 return false;
25}
26
27int main()
28{
29 using spirit_test::test_attr;
30 using boost::spirit::utree;
31 using boost::spirit::utree_type;
32 using boost::spirit::utf8_string_range_type;
33 using boost::spirit::utf8_symbol_type;
34 using boost::spirit::utf8_string_type;
35
36 using boost::spirit::qi::real_parser;
37 using boost::spirit::qi::strict_real_policies;
38 using boost::spirit::qi::digit;
39 using boost::spirit::qi::char_;
40 using boost::spirit::qi::string;
41 using boost::spirit::qi::int_;
42 using boost::spirit::qi::double_;
43 using boost::spirit::qi::space;
44 using boost::spirit::qi::space_type;
45 using boost::spirit::qi::rule;
46 using boost::spirit::qi::as;
47 using boost::spirit::qi::lexeme;
48
49 // alternatives
50 {
51 typedef real_parser<double, strict_real_policies<double> >
52 strict_double_type;
53 strict_double_type const strict_double = strict_double_type();
54
55 utree ut;
56 BOOST_TEST(test_attr("10", strict_double | int_, ut) &&
57 ut.which() == utree_type::int_type && check(ut, "10"));
58 ut.clear();
59 BOOST_TEST(test_attr("10.2", strict_double | int_, ut) &&
60 ut.which() == utree_type::double_type && check(ut, "10.2"));
61
62 rule<char const*, boost::variant<int, double>()> r1 = strict_double | int_;
63 ut.clear();
64 BOOST_TEST(test_attr("10", r1, ut) &&
65 ut.which() == utree_type::int_type && check(ut, "10"));
66 ut.clear();
67 BOOST_TEST(test_attr("10.2", r1, ut) &&
68 ut.which() == utree_type::double_type && check(ut, "10.2"));
69
70 rule<char const*, utree()> r2 = strict_double | int_;
71 ut.clear();
72 BOOST_TEST(test_attr("10", r2, ut) &&
73 ut.which() == utree_type::int_type && check(ut, "10"));
74 ut.clear();
75 BOOST_TEST(test_attr("10.2", r2, ut) &&
76 ut.which() == utree_type::double_type && check(ut, "10.2"));
77
78 rule<char const*, utree::list_type()> r3 = strict_double | int_;
79 ut.clear();
80 BOOST_TEST(test_attr("10", r3, ut) &&
81 ut.which() == utree_type::list_type && check(ut, "( 10 )"));
82 ut.clear();
83 BOOST_TEST(test_attr("10.2", r3, ut) &&
84 ut.which() == utree_type::list_type && check(ut, "( 10.2 )"));
85 }
86
87 // optionals
88 {
89 utree ut;
90
91 BOOST_TEST(test_attr("x", -char_, ut));
92 BOOST_TEST(ut.which() == utree_type::string_type);
93 BOOST_TEST(check(ut, "\"x\""));
94 ut.clear();
95
96 BOOST_TEST(test_attr("", -char_, ut));
97 BOOST_TEST(ut.which() == utree_type::invalid_type);
98 BOOST_TEST(check(ut, "<invalid>"));
99 ut.clear();
100
101 BOOST_TEST(test_attr("1x", int_ >> -char_, ut));
102 BOOST_TEST(ut.which() == utree_type::list_type);
103 BOOST_TEST(check(ut, "( 1 \"x\" )"));
104 ut.clear();
105
106 BOOST_TEST(test_attr("1", int_ >> -char_, ut));
107 BOOST_TEST(ut.which() == utree_type::list_type);
108 BOOST_TEST(check(ut, "( 1 )"));
109 ut.clear();
110
111 BOOST_TEST(test_attr("1x", -int_ >> char_, ut));
112 BOOST_TEST(ut.which() == utree_type::list_type);
113 BOOST_TEST(check(ut, "( 1 \"x\" )"));
114 ut.clear();
115
116 BOOST_TEST(test_attr("x", -int_ >> char_, ut));
117 BOOST_TEST(ut.which() == utree_type::list_type);
118 BOOST_TEST(check(ut, "( \"x\" )"));
119 ut.clear();
120
121 rule<char const*, utree::list_type()> r1 = int_ >> -char_;
122
123 BOOST_TEST(test_attr("1x", r1, ut));
124 BOOST_TEST(ut.which() == utree_type::list_type);
125 BOOST_TEST(check(ut, "( 1 \"x\" )"));
126 ut.clear();
127
128 BOOST_TEST(test_attr("1", r1, ut));
129 BOOST_TEST(ut.which() == utree_type::list_type);
130 BOOST_TEST(check(ut, "( 1 )"));
131 ut.clear();
132
133 rule<char const*, utree::list_type()> r2 = -int_ >> char_;
134
135 BOOST_TEST(test_attr("1x", r2, ut));
136 BOOST_TEST(ut.which() == utree_type::list_type);
137 BOOST_TEST(check(ut, "( 1 \"x\" )"));
138 ut.clear();
139
140 BOOST_TEST(test_attr("x", r2, ut));
141 BOOST_TEST(ut.which() == utree_type::list_type);
142 BOOST_TEST(check(ut, "( \"x\" )"));
143 ut.clear();
144
145 rule<char const*, utree()> r3 = int_;
146
147 BOOST_TEST(test_attr("1", -r3, ut));
148 BOOST_TEST(ut.which() == utree_type::int_type);
149 BOOST_TEST(check(ut, "1"));
150 ut.clear();
151
152 BOOST_TEST(test_attr("", -r3, ut));
153 BOOST_TEST(ut.which() == utree_type::invalid_type);
154 BOOST_TEST(check(ut, "<invalid>"));
155 ut.clear();
156 }
157
158 // as_string
159 {
160 using boost::spirit::qi::as_string;
161
162 utree ut;
163 BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
164 ut.which() == utree_type::string_type && check(ut, "\"xy\""));
165 ut.clear();
166
167 BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
168 ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
169 ut.clear();
170
171 BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
172 ut.which() == utree_type::string_type && check(ut, "\"xy\""));
173 ut.clear();
174
175 BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
176 ut.which() == utree_type::string_type && check(ut, "\"xy\""));
177 ut.clear();
178
179 BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
180 ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
181 ut.clear();
182
183 BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
184 ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
185 ut.clear();
186
187 BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
188 ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
189 ut.clear();
190 }
191
192 return boost::report_errors();
193}
194

source code of boost/libs/spirit/test/qi/utree3.cpp