1 // Copyright (c) 2001-2011 Hartmut Kaiser
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #include <boost/config/warning_disable.hpp>
7 #include <boost/detail/lightweight_test.hpp>
8
9 #include <boost/spirit/include/karma_auxiliary.hpp>
10 #include <boost/spirit/include/karma_char.hpp>
11 #include <boost/spirit/include/karma_string.hpp>
12 #include <boost/spirit/include/karma_numeric.hpp>
13 #include <boost/spirit/include/karma_generate.hpp>
14 #include <boost/spirit/include/karma_operator.hpp>
15 #include <boost/spirit/include/karma_directive.hpp>
16 #include <boost/spirit/include/karma_nonterminal.hpp>
17 #include <boost/spirit/include/karma_auxiliary.hpp>
18
19 #include "test.hpp"
20
21 using namespace spirit_test;
22
23 ///////////////////////////////////////////////////////////////////////////////
24 int
main()25 main()
26 {
27 using namespace boost;
28 using namespace boost::spirit;
29 using namespace boost::spirit::ascii;
30
31 {
32 // test if alternatives with all components having unused
33 // attribute generate first alternative
34 fusion::vector<char, char> v('a', 'b');
35 BOOST_TEST(test("axb", char_ << (lit('x') | lit('i')) << char_, v));
36 BOOST_TEST(test("axib",
37 char_ << (lit('x') << lit('i') | lit('i')) << char_, v));
38 }
39
40 {
41 BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
42 BOOST_TEST(test_delimited("x i ",
43 char_('x') << char_('i') | char_('i'), char_(' ')));
44 BOOST_TEST(test_delimited("i ",
45 char_('i') | char_('x') << char_('i'), char_(' ')));
46
47 variant<int, char> v (10);
48 BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
49 BOOST_TEST(test_delimited("10 ", int_ | char_, v, char_(' ')));
50 BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
51 BOOST_TEST(test_delimited("a ", char_ | lit('a') | int_, v, char_(' ')));
52 BOOST_TEST(test_delimited("10 ", int_ | lit('a') | char_, v, char_(' ')));
53
54 v = 'c';
55 BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
56 BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
57 BOOST_TEST(test_delimited("c ", char_ | lit('a') | int_, v, char_(' ')));
58 BOOST_TEST(test_delimited("a ", int_ | lit('a') | char_, v, char_(' ')));
59 BOOST_TEST(test_delimited("c ", int_ | char_ | lit('a'), v, char_(' ')));
60 }
61
62 // this leads to infinite loops
63 // {
64 // variant<int, std::string> v(10);
65 // BOOST_TEST(test("10", int_ | +char_, v));
66 //
67 // v = "abc";
68 // BOOST_TEST(test("abc", int_ | +char_, v));
69 // }
70
71 {
72 // if nothing matches, the first explicit alternative will be chosen
73 variant<double, char const*> v (10.0);
74 BOOST_TEST(test("11", char_ | lit(11), v));
75 BOOST_TEST(test("11", lit(11) | char_ , v));
76 BOOST_TEST(test("10.0", double_ | lit(11), v));
77 BOOST_TEST(test("11", lit(11) | double_, v));
78 BOOST_TEST(!test("", char_ | int_, v));
79
80 v = "c";
81 BOOST_TEST(test("11", char_ | lit(11), v));
82 BOOST_TEST(test("11", double_ | lit(11), v));
83 BOOST_TEST(!test("", char_ | int_, v));
84 }
85
86 {
87 // in strict mode if nothing matches, the alternative will fail
88 variant<double, char const*> v (10.0);
89 BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
90 BOOST_TEST(test("11", strict[lit(11) | char_] , v));
91
92 v = "c";
93 BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
94 }
95
96 {
97 // if nothing matches, the first explicit alternative will be chosen
98 variant<double, char const*> v (10.0);
99 BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
100 BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
101 BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
102 BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
103 BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
104
105 v = "c";
106 BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
107 BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
108 BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
109 }
110
111 {
112 // if nothing matches, the first explicit alternative will be chosen,
113 // optionals need to be accepted
114 optional<variant<double, char const*> > v (10.0);
115 BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
116 BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
117 BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
118 BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
119 BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
120
121 v = "c";
122 BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
123 BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
124 BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
125 }
126
127 {
128 std::vector<int> v;
129 BOOST_TEST(test("[]", '[' << (int_ % ", ") << ']' | "[]", v));
130 BOOST_TEST(test("[]", '[' << -(int_ % ", ") << ']', v));
131 BOOST_TEST(test("[]", '[' << ((int_ % ", ") | eps) << ']', v));
132
133 v.push_back(5);
134 v.push_back(5);
135 v.push_back(5);
136 BOOST_TEST(test("[5, 5, 5]", '[' << (int_ % ", ") << ']' | "[]", v));
137 }
138
139 return boost::report_errors();
140 }
141
142