]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/repeat.cpp
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>
21 using spirit_test::test_attr
;
22 using spirit_test::test
;
24 using namespace boost::spirit::x3::ascii
;
25 using boost::spirit::x3::repeat
;
26 using boost::spirit::x3::inf
;
27 using boost::spirit::x3::omit
;
28 using boost::spirit::x3::int_
;
29 using boost::spirit::x3::lexeme
;
30 using boost::spirit::x3::char_
;
32 BOOST_TEST(test("aaaaaaaa", repeat
[char_
])); // kleene synonym
33 BOOST_TEST(test("aaaaaaaa", repeat(8)[char_
]));
34 BOOST_TEST(!test("aa", repeat(3)[char_
]));
35 BOOST_TEST(test("aaa", repeat(3, 5)[char_
]));
36 BOOST_TEST(test("aaaaa", repeat(3, 5)[char_
]));
37 BOOST_TEST(!test("aaaaaa", repeat(3, 5)[char_
]));
38 BOOST_TEST(!test("aa", repeat(3, 5)[char_
]));
40 BOOST_TEST(test("aaa", repeat(3, inf
)[char_
]));
41 BOOST_TEST(test("aaaaa", repeat(3, inf
)[char_
]));
42 BOOST_TEST(test("aaaaaa", repeat(3, inf
)[char_
]));
43 BOOST_TEST(!test("aa", repeat(3, inf
)[char_
]));
47 BOOST_TEST(test_attr("aaaaaaaa", repeat
[char_
>> char_
], s
)); // kleene synonym
48 BOOST_TEST(s
== "aaaaaaaa");
51 BOOST_TEST(test_attr("aaaaaaaa", repeat(4)[char_
>> char_
], s
));
52 BOOST_TEST(s
== "aaaaaaaa");
54 BOOST_TEST(!test("aa", repeat(3)[char_
>> char_
]));
55 BOOST_TEST(!test("a", repeat(1)[char_
>> char_
]));
58 BOOST_TEST(test_attr("aa", repeat(1, 3)[char_
>> char_
], s
));
59 BOOST_TEST(s
== "aa");
62 BOOST_TEST(test_attr("aaaaaa", repeat(1, 3)[char_
>> char_
], s
));
63 BOOST_TEST(s
== "aaaaaa");
65 BOOST_TEST(!test("aaaaaaa", repeat(1, 3)[char_
>> char_
]));
66 BOOST_TEST(!test("a", repeat(1, 3)[char_
>> char_
]));
69 BOOST_TEST(test_attr("aaaa", repeat(2, inf
)[char_
>> char_
], s
));
70 BOOST_TEST(s
== "aaaa");
73 BOOST_TEST(test_attr("aaaaaa", repeat(2, inf
)[char_
>> char_
], s
));
74 BOOST_TEST(s
== "aaaaaa");
76 BOOST_TEST(!test("aa", repeat(2, inf
)[char_
>> char_
]));
79 { // from classic spirit tests
80 BOOST_TEST(test("", repeat(0, inf
)['x']));
83 #define rep8 repeat(8)[alpha] >> 'X'
84 BOOST_TEST(!test("abcdefgX", rep8
, false));
85 BOOST_TEST(test("abcdefghX", rep8
));
86 BOOST_TEST(!test("abcdefghiX", rep8
, false));
87 BOOST_TEST(!test("abcdefgX", rep8
, false));
88 BOOST_TEST(!test("aX", rep8
, false));
91 #define rep28 repeat(2, 8)[alpha] >> '*'
92 BOOST_TEST(test("abcdefg*", rep28
));
93 BOOST_TEST(test("abcdefgh*", rep28
));
94 BOOST_TEST(!test("abcdefghi*", rep28
, false));
95 BOOST_TEST(!test("a*", rep28
, false));
98 #define rep2_ repeat(2, inf)[alpha] >> '+'
99 BOOST_TEST(test("abcdefg+", rep2_
));
100 BOOST_TEST(test("abcdefgh+", rep2_
));
101 BOOST_TEST(test("abcdefghi+", rep2_
));
102 BOOST_TEST(test("abcdefg+", rep2_
));
103 BOOST_TEST(!test("a+", rep2_
, false));
106 #define rep0 repeat(0)[alpha] >> '/'
107 BOOST_TEST(test("/", rep0
));
108 BOOST_TEST(!test("a/", rep0
, false));
111 #define rep01 repeat(0, 1)[alpha >> digit] >> '?'
112 BOOST_TEST(!test("abcdefg?", rep01
, false));
113 BOOST_TEST(!test("a?", rep01
, false));
114 BOOST_TEST(!test("1?", rep01
, false));
115 BOOST_TEST(!test("11?", rep01
, false));
116 BOOST_TEST(!test("aa?", rep01
, false));
117 BOOST_TEST(test("?", rep01
));
118 BOOST_TEST(test("a1?", rep01
));
122 BOOST_TEST(test(" a a aaa aa", repeat(7)[char_
], space
));
123 BOOST_TEST(test("12345 678 9", repeat(9)[digit
], space
));
127 std::vector
<std::string
> v
;
128 BOOST_TEST(test_attr("a b c d", repeat(4)[lexeme
[+alpha
]], v
, space
) && 4 == v
.size() &&
129 v
[0] == "a" && v
[1] == "b" && v
[2] == "c" && v
[3] == "d");
132 BOOST_TEST(test("1 2 3", int_
>> repeat(2)[int_
], space
));
133 BOOST_TEST(!test("1 2", int_
>> repeat(2)[int_
], space
));
138 BOOST_TEST(test_attr("1 2 3", int_
>> repeat(2)[int_
], v
, space
));
139 BOOST_TEST(v
.size() == 3 && v
[0] == 1 && v
[1] == 2 && v
[2] == 3);
141 BOOST_TEST(!test("1 2", int_
>> repeat(2)[int_
], space
));
143 return boost::report_errors();