]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/spirit/test/karma/alternative2.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / spirit / test / karma / alternative2.cpp
CommitLineData
7c673cae
FG
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
1e59de90 6#include <boost/spirit/include/karma_alternative.hpp>
7c673cae
FG
7
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>
17
18#include "test.hpp"
19
20using namespace spirit_test;
21
22///////////////////////////////////////////////////////////////////////////////
23int
24main()
25{
26 using namespace boost;
27 using namespace boost::spirit;
28 using namespace boost::spirit::ascii;
29
30 {
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));
37 }
38
39 {
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_(' ')));
45
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_(' ')));
52
53 v = 'c';
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_(' ')));
59 }
60
61// this leads to infinite loops
62// {
63// variant<int, std::string> v(10);
64// BOOST_TEST(test("10", int_ | +char_, v));
65//
66// v = "abc";
67// BOOST_TEST(test("abc", int_ | +char_, v));
68// }
69
70 {
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));
78
79 v = "c";
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));
83 }
84
85 {
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));
90
91 v = "c";
92 BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
93 }
94
95 {
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_(' ')));
103
104 v = "c";
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_(' ')));
108 }
109
110 {
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_(' ')));
119
120 v = "c";
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_(' ')));
124 }
125
126 {
127 std::vector<int> v;
128 BOOST_TEST(test("[]", '[' << (int_ % ", ") << ']' | "[]", v));
129 BOOST_TEST(test("[]", '[' << -(int_ % ", ") << ']', v));
130 BOOST_TEST(test("[]", '[' << ((int_ % ", ") | eps) << ']', v));
131
132 v.push_back(5);
133 v.push_back(5);
134 v.push_back(5);
135 BOOST_TEST(test("[5, 5, 5]", '[' << (int_ % ", ") << ']' | "[]", v));
136 }
137
138 return boost::report_errors();
139}
140