]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/karma/alternative2.cpp
1 // Copyright (c) 2001-2011 Hartmut Kaiser
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)
6 #include <boost/spirit/include/karma_alternative.hpp>
8 #include <boost/spirit/include/karma_auxiliary.hpp>
9 #include <boost/spirit/include/karma_char.hpp>
10 #include <boost/spirit/include/karma_string.hpp>
11 #include <boost/spirit/include/karma_numeric.hpp>
12 #include <boost/spirit/include/karma_generate.hpp>
13 #include <boost/spirit/include/karma_operator.hpp>
14 #include <boost/spirit/include/karma_directive.hpp>
15 #include <boost/spirit/include/karma_nonterminal.hpp>
16 #include <boost/spirit/include/karma_auxiliary.hpp>
20 using namespace spirit_test
;
22 ///////////////////////////////////////////////////////////////////////////////
26 using namespace boost
;
27 using namespace boost::spirit
;
28 using namespace boost::spirit::ascii
;
31 // test if alternatives with all components having unused
32 // attribute generate first alternative
33 fusion::vector
<char, char> v('a', 'b');
34 BOOST_TEST(test("axb", char_
<< (lit('x') | lit('i')) << char_
, v
));
35 BOOST_TEST(test("axib",
36 char_
<< (lit('x') << lit('i') | lit('i')) << char_
, v
));
40 BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
41 BOOST_TEST(test_delimited("x i ",
42 char_('x') << char_('i') | char_('i'), char_(' ')));
43 BOOST_TEST(test_delimited("i ",
44 char_('i') | char_('x') << char_('i'), char_(' ')));
46 variant
<int, char> v (10);
47 BOOST_TEST(test_delimited("10 ", char_
| int_
, v
, char_(' ')));
48 BOOST_TEST(test_delimited("10 ", int_
| char_
, v
, char_(' ')));
49 BOOST_TEST(test_delimited("a ", lit('a') | char_
| int_
, v
, char_(' ')));
50 BOOST_TEST(test_delimited("a ", char_
| lit('a') | int_
, v
, char_(' ')));
51 BOOST_TEST(test_delimited("10 ", int_
| lit('a') | char_
, v
, char_(' ')));
54 BOOST_TEST(test_delimited("c ", char_
| int_
, v
, char_(' ')));
55 BOOST_TEST(test_delimited("a ", lit('a') | char_
| int_
, v
, char_(' ')));
56 BOOST_TEST(test_delimited("c ", char_
| lit('a') | int_
, v
, char_(' ')));
57 BOOST_TEST(test_delimited("a ", int_
| lit('a') | char_
, v
, char_(' ')));
58 BOOST_TEST(test_delimited("c ", int_
| char_
| lit('a'), v
, char_(' ')));
61 // this leads to infinite loops
63 // variant<int, std::string> v(10);
64 // BOOST_TEST(test("10", int_ | +char_, v));
67 // BOOST_TEST(test("abc", int_ | +char_, v));
71 // if nothing matches, the first explicit alternative will be chosen
72 variant
<double, char const*> v (10.0);
73 BOOST_TEST(test("11", char_
| lit(11), v
));
74 BOOST_TEST(test("11", lit(11) | char_
, v
));
75 BOOST_TEST(test("10.0", double_
| lit(11), v
));
76 BOOST_TEST(test("11", lit(11) | double_
, v
));
77 BOOST_TEST(!test("", char_
| int_
, v
));
80 BOOST_TEST(test("11", char_
| lit(11), v
));
81 BOOST_TEST(test("11", double_
| lit(11), v
));
82 BOOST_TEST(!test("", char_
| int_
, v
));
86 // in strict mode if nothing matches, the alternative will fail
87 variant
<double, char const*> v (10.0);
88 BOOST_TEST(!test("11", strict
[char_
| lit(11)], v
));
89 BOOST_TEST(test("11", strict
[lit(11) | char_
] , v
));
92 BOOST_TEST(!test("11", strict
[char_
| lit(11)], v
));
96 // if nothing matches, the first explicit alternative will be chosen
97 variant
<double, char const*> v (10.0);
98 BOOST_TEST(test_delimited("11 ", char_
| lit(11), v
, char_(' ')));
99 BOOST_TEST(test_delimited("11 ", lit(11) | char_
, v
, char_(' ')));
100 BOOST_TEST(test_delimited("10.0 ", double_
| lit(11), v
, char_(' ')));
101 BOOST_TEST(test_delimited("11 ", lit(11) | double_
, v
, char_(' ')));
102 BOOST_TEST(!test_delimited("", char_
| int_
, v
, char_(' ')));
105 BOOST_TEST(test_delimited("11 ", char_
| lit(11), v
, char_(' ')));
106 BOOST_TEST(test_delimited("11 ", double_
| lit(11), v
, char_(' ')));
107 BOOST_TEST(!test_delimited("", char_
| int_
, v
, char_(' ')));
111 // if nothing matches, the first explicit alternative will be chosen,
112 // optionals need to be accepted
113 optional
<variant
<double, char const*> > v (10.0);
114 BOOST_TEST(test_delimited("11 ", char_
| lit(11), v
, char_(' ')));
115 BOOST_TEST(test_delimited("11 ", lit(11) | char_
, v
, char_(' ')));
116 BOOST_TEST(test_delimited("10.0 ", double_
| lit(11), v
, char_(' ')));
117 BOOST_TEST(test_delimited("11 ", lit(11) | double_
, v
, char_(' ')));
118 BOOST_TEST(!test_delimited("", char_
| int_
, v
, char_(' ')));
121 BOOST_TEST(test_delimited("11 ", char_
| lit(11), v
, char_(' ')));
122 BOOST_TEST(test_delimited("11 ", double_
| lit(11), v
, char_(' ')));
123 BOOST_TEST(!test_delimited("", char_
| int_
, v
, char_(' ')));
128 BOOST_TEST(test("[]", '[' << (int_
% ", ") << ']' | "[]", v
));
129 BOOST_TEST(test("[]", '[' << -(int_
% ", ") << ']', v
));
130 BOOST_TEST(test("[]", '[' << ((int_
% ", ") | eps
) << ']', v
));
135 BOOST_TEST(test("[5, 5, 5]", '[' << (int_
% ", ") << ']' | "[]", v
));
138 return boost::report_errors();