]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/repeat.cpp
99c080fe8d2e71ec3db64b6f3475ee42da0622b1
1 /*=============================================================================
2 Copyright (c) 2001-2011 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/utility/enable_if.hpp>
13 #include <boost/spirit/home/x3.hpp>
22 using spirit_test::test_attr
;
23 using spirit_test::test
;
25 using namespace boost::spirit::x3::ascii
;
26 using boost::spirit::x3::repeat
;
27 using boost::spirit::x3::inf
;
28 using boost::spirit::x3::omit
;
29 using boost::spirit::x3::int_
;
30 using boost::spirit::x3::lexeme
;
31 using boost::spirit::x3::char_
;
33 BOOST_TEST(test("aaaaaaaa", repeat
[char_
])); // kleene synonym
34 BOOST_TEST(test("aaaaaaaa", repeat(8)[char_
]));
35 BOOST_TEST(!test("aa", repeat(3)[char_
]));
36 BOOST_TEST(test("aaa", repeat(3, 5)[char_
]));
37 BOOST_TEST(test("aaaaa", repeat(3, 5)[char_
]));
38 BOOST_TEST(!test("aaaaaa", repeat(3, 5)[char_
]));
39 BOOST_TEST(!test("aa", repeat(3, 5)[char_
]));
41 BOOST_TEST(test("aaa", repeat(3, inf
)[char_
]));
42 BOOST_TEST(test("aaaaa", repeat(3, inf
)[char_
]));
43 BOOST_TEST(test("aaaaaa", repeat(3, inf
)[char_
]));
44 BOOST_TEST(!test("aa", repeat(3, inf
)[char_
]));
48 BOOST_TEST(test_attr("aaaaaaaa", repeat
[char_
>> char_
], s
)); // kleene synonym
49 BOOST_TEST(s
== "aaaaaaaa");
52 BOOST_TEST(test_attr("aaaaaaaa", repeat(4)[char_
>> char_
], s
));
53 BOOST_TEST(s
== "aaaaaaaa");
55 BOOST_TEST(!test("aa", repeat(3)[char_
>> char_
]));
56 BOOST_TEST(!test("a", repeat(1)[char_
>> char_
]));
59 BOOST_TEST(test_attr("aa", repeat(1, 3)[char_
>> char_
], s
));
60 BOOST_TEST(s
== "aa");
63 BOOST_TEST(test_attr("aaaaaa", repeat(1, 3)[char_
>> char_
], s
));
64 BOOST_TEST(s
== "aaaaaa");
66 BOOST_TEST(!test("aaaaaaa", repeat(1, 3)[char_
>> char_
]));
67 BOOST_TEST(!test("a", repeat(1, 3)[char_
>> char_
]));
70 BOOST_TEST(test_attr("aaaa", repeat(2, inf
)[char_
>> char_
], s
));
71 BOOST_TEST(s
== "aaaa");
74 BOOST_TEST(test_attr("aaaaaa", repeat(2, inf
)[char_
>> char_
], s
));
75 BOOST_TEST(s
== "aaaaaa");
77 BOOST_TEST(!test("aa", repeat(2, inf
)[char_
>> char_
]));
80 { // from classic spirit tests
81 BOOST_TEST(test("", repeat(0, inf
)['x']));
84 #define rep8 repeat(8)[alpha] >> 'X'
85 BOOST_TEST(!test("abcdefgX", rep8
, false));
86 BOOST_TEST(test("abcdefghX", rep8
));
87 BOOST_TEST(!test("abcdefghiX", rep8
, false));
88 BOOST_TEST(!test("abcdefgX", rep8
, false));
89 BOOST_TEST(!test("aX", rep8
, false));
92 #define rep28 repeat(2, 8)[alpha] >> '*'
93 BOOST_TEST(test("abcdefg*", rep28
));
94 BOOST_TEST(test("abcdefgh*", rep28
));
95 BOOST_TEST(!test("abcdefghi*", rep28
, false));
96 BOOST_TEST(!test("a*", rep28
, false));
99 #define rep2_ repeat(2, inf)[alpha] >> '+'
100 BOOST_TEST(test("abcdefg+", rep2_
));
101 BOOST_TEST(test("abcdefgh+", rep2_
));
102 BOOST_TEST(test("abcdefghi+", rep2_
));
103 BOOST_TEST(test("abcdefg+", rep2_
));
104 BOOST_TEST(!test("a+", rep2_
, false));
107 #define rep0 repeat(0)[alpha] >> '/'
108 BOOST_TEST(test("/", rep0
));
109 BOOST_TEST(!test("a/", rep0
, false));
112 #define rep01 repeat(0, 1)[alpha >> digit] >> '?'
113 BOOST_TEST(!test("abcdefg?", rep01
, false));
114 BOOST_TEST(!test("a?", rep01
, false));
115 BOOST_TEST(!test("1?", rep01
, false));
116 BOOST_TEST(!test("11?", rep01
, false));
117 BOOST_TEST(!test("aa?", rep01
, false));
118 BOOST_TEST(test("?", rep01
));
119 BOOST_TEST(test("a1?", rep01
));
123 BOOST_TEST(test(" a a aaa aa", repeat(7)[char_
], space
));
124 BOOST_TEST(test("12345 678 9", repeat(9)[digit
], space
));
128 std::vector
<std::string
> v
;
129 BOOST_TEST(test_attr("a b c d", repeat(4)[lexeme
[+alpha
]], v
, space
) && 4 == v
.size() &&
130 v
[0] == "a" && v
[1] == "b" && v
[2] == "c" && v
[3] == "d");
133 BOOST_TEST(test("1 2 3", int_
>> repeat(2)[int_
], space
));
134 BOOST_TEST(!test("1 2", int_
>> repeat(2)[int_
], space
));
139 BOOST_TEST(test_attr("1 2 3", int_
>> repeat(2)[int_
], v
, space
));
140 BOOST_TEST(v
.size() == 3 && v
[0] == 1 && v
[1] == 2 && v
[2] == 3);
142 BOOST_TEST(!test("1 2", int_
>> repeat(2)[int_
], space
));
145 { // test move only types
146 std::vector
<move_only
> v
;
147 BOOST_TEST(test_attr("sss", repeat(3)[synth_move_only
], v
));
148 BOOST_TEST_EQ(v
.size(), 3);
151 return boost::report_errors();