• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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