]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/plus.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2015 Joel de Guzman
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
10 #include <boost/detail/lightweight_test.hpp>
11 #include <boost/spirit/home/x3.hpp>
12 #include <boost/fusion/include/vector.hpp>
23 namespace boost
{ namespace spirit
{ namespace x3
{ namespace traits
26 struct container_value
<x_attr
>
28 typedef char type
; // value type of container
32 struct push_back_container
<x_attr
>
34 static bool call(x_attr
& /*c*/, char /*val*/)
36 // push back value type into container
45 using spirit_test::test
;
46 using spirit_test::test_attr
;
47 using boost::spirit::x3::char_
;
48 using boost::spirit::x3::alpha
;
49 using boost::spirit::x3::upper
;
50 using boost::spirit::x3::space
;
51 using boost::spirit::x3::digit
;
52 //~ using boost::spirit::x3::no_case;
53 using boost::spirit::x3::int_
;
54 using boost::spirit::x3::omit
;
55 using boost::spirit::x3::lit
;
56 //~ using boost::spirit::x3::_1;
57 using boost::spirit::x3::lexeme
;
60 BOOST_TEST(test("aaaaaaaa", +char_
));
61 BOOST_TEST(test("a", +char_
));
62 BOOST_TEST(!test("", +char_
));
63 BOOST_TEST(test("aaaaaaaa", +alpha
));
64 BOOST_TEST(!test("aaaaaaaa", +upper
));
68 BOOST_TEST(test(" a a aaa aa", +char_
, space
));
69 BOOST_TEST(test("12345 678 9 ", +digit
, space
));
73 //~ BOOST_TEST(test("aBcdeFGH", no_case[+char_]));
74 //~ BOOST_TEST(test("a B cde FGH ", no_case[+char_], space));
79 BOOST_TEST(test_attr("123 456 789 10", +int_
, v
, space
) && 4 == v
.size() &&
80 v
[0] == 123 && v
[1] == 456 && v
[2] == 789 && v
[3] == 10);
84 std::vector
<std::string
> v
;
85 BOOST_TEST(test_attr("a b c d", +lexeme
[+alpha
], v
, space
) && 4 == v
.size() &&
86 v
[0] == "a" && v
[1] == "b" && v
[2] == "c" && v
[3] == "d");
90 BOOST_TEST(test("Kim Kim Kim", +lit("Kim"), space
));
95 // The following 2 tests show that omit does not inhibit explicit attributes
98 BOOST_TEST(test_attr("bbbb", omit[+char_('b')], s) && s == "bbbb");
101 BOOST_TEST(test_attr("b b b b ", omit[+char_('b')], s, space) && s == "bbbb");
106 auto f
= [&](auto& ctx
){ v
= _attr(ctx
); };
108 BOOST_TEST(test("bbbb", (+char_
)[f
]) && 4 == v
.size() &&
109 v
[0] == 'b' && v
[1] == 'b' && v
[2] == 'b' && v
[3] == 'b');
114 auto f
= [&](auto& ctx
){ v
= _attr(ctx
); };
116 BOOST_TEST(test("1 2 3", (+int_
)[f
], space
) && 3 == v
.size() &&
117 v
[0] == 1 && v
[1] == 2 && v
[2] == 3);
120 { // attribute customization
123 test_attr("abcde", +char_
, x
);
126 // single-element fusion vector tests
128 boost::fusion::vector
<std::string
> fs
;
129 BOOST_TEST((test_attr("12345", +char_
, fs
))); // ok
130 BOOST_TEST(boost::fusion::at_c
<0>(fs
) == "12345");
133 { // test move only types
134 std::vector
<move_only
> v
;
135 BOOST_TEST(test_attr("sss", +synth_move_only
, v
));
136 BOOST_TEST_EQ(v
.size(), 3);
139 return boost::report_errors();