]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 | ||
1e59de90 | 8 | #include <boost/spirit/include/support_utree.hpp> |
7c673cae FG |
9 | |
10 | #include <boost/spirit/include/karma.hpp> | |
7c673cae FG |
11 | |
12 | #include <sstream> | |
13 | ||
14 | #include "test.hpp" | |
15 | ||
16 | int main() | |
17 | { | |
18 | using spirit_test::test; | |
19 | using spirit_test::test_delimited; | |
20 | using boost::spirit::utree; | |
21 | using boost::spirit::utree_type; | |
22 | using boost::spirit::utf8_string_range_type; | |
23 | using boost::spirit::utf8_string_type; | |
24 | using boost::spirit::utf8_symbol_type; | |
25 | ||
26 | using boost::spirit::karma::char_; | |
27 | using boost::spirit::karma::bool_; | |
28 | using boost::spirit::karma::int_; | |
29 | using boost::spirit::karma::double_; | |
30 | using boost::spirit::karma::string; | |
31 | using boost::spirit::karma::space; | |
32 | using boost::spirit::karma::rule; | |
33 | ||
34 | typedef spirit_test::output_iterator<char>::type output_iterator; | |
35 | ||
36 | // primitive data types | |
37 | { | |
38 | utree ut('x'); | |
39 | BOOST_TEST(test("x", char_, ut)); | |
40 | ||
41 | ut = false; | |
42 | BOOST_TEST(test("false", bool_, ut)); | |
43 | ||
44 | ut = 123; | |
45 | BOOST_TEST(test("123", int_, ut)); | |
46 | ||
47 | ut = 123.45; | |
48 | BOOST_TEST(test("123.45", double_, ut)); | |
49 | ||
50 | ut = "abc"; | |
51 | BOOST_TEST(test("abc", string, ut)); | |
52 | ||
53 | ut = utf8_symbol_type("xyz"); | |
54 | BOOST_TEST(test("xyz", string, ut)); | |
55 | } | |
56 | ||
57 | // sequences | |
58 | { | |
59 | using boost::spirit::karma::digit; | |
60 | using boost::spirit::karma::repeat; | |
61 | ||
62 | utree ut; | |
63 | ut.push_back('x'); | |
64 | ut.push_back('y'); | |
65 | BOOST_TEST(test("xy", char_ << char_, ut)); | |
66 | ||
67 | ut.clear(); | |
68 | ut.push_back(123); | |
69 | ut.push_back(456); | |
70 | BOOST_TEST(test_delimited("123 456 ", int_ << int_, ut, space)); | |
71 | ||
72 | ut.clear(); | |
73 | ut.push_back(1.23); | |
74 | ut.push_back(4.56); | |
75 | BOOST_TEST(test_delimited("1.23 4.56 ", double_ << double_, ut, space)); | |
76 | ||
77 | ut.clear(); | |
78 | ut.push_back(1.23); | |
79 | ut.push_back("ab"); | |
80 | BOOST_TEST(test("1.23ab", double_ << string, ut)); | |
81 | ||
82 | ut.clear(); | |
83 | ||
84 | rule<output_iterator, double()> r1 = double_; | |
85 | rule<output_iterator, utree()> r2 = double_; | |
86 | ||
87 | // ( 1.23 "a" "b" ) | |
88 | ut.push_back(1.23); | |
89 | ut.push_back('a'); | |
90 | ut.push_back('b'); | |
91 | BOOST_TEST(test("1.23ab", double_ << *char_, ut)); | |
92 | BOOST_TEST(test("1.23ab", r1 << *char_, ut)); | |
93 | BOOST_TEST(test("1.23ab", r2 << *char_, ut)); | |
94 | ||
95 | // ( ( 1.23 ) "a" "b" ) | |
96 | ut.clear(); | |
97 | utree ut1; | |
98 | ut1.push_back(1.23); | |
99 | ut.push_back(ut1); | |
100 | ut.push_back('a'); | |
101 | ut.push_back('b'); | |
102 | BOOST_TEST(test("1.23ab", r1 << *char_, ut)); | |
103 | BOOST_TEST(test("1.23ab", r2 << *char_, ut)); | |
104 | ||
105 | // ( "a" "b" 1.23 ) | |
106 | ut.clear(); | |
107 | ut.push_back('a'); | |
108 | ut.push_back('b'); | |
109 | ut.push_back(1.23); | |
110 | BOOST_TEST(test("ab1.23", repeat(2)[~digit] << double_, ut)); | |
111 | BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r1, ut)); | |
112 | BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut)); | |
113 | ||
114 | // ( "a" "b" ( 1.23 ) ) | |
115 | ut.clear(); | |
116 | ut.push_back('a'); | |
117 | ut.push_back('b'); | |
118 | ut.push_back(ut1); | |
119 | BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r1, ut)); | |
120 | BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut)); | |
121 | } | |
122 | ||
123 | return boost::report_errors(); | |
124 | } |