]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 1998-2003 Joel de Guzman | |
3 | http://spirit.sourceforge.net/ | |
4 | ||
5 | Use, modification and distribution is subject to the Boost Software | |
6 | License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
7 | http://www.boost.org/LICENSE_1_0.txt) | |
8 | =============================================================================*/ | |
9 | #include <iostream> | |
10 | #include <boost/detail/lightweight_test.hpp> | |
11 | ||
12 | ||
13 | //#define BOOST_SPIRIT_DEBUG | |
14 | #include <boost/spirit/include/classic_core.hpp> | |
15 | #include <boost/spirit/include/classic_loops.hpp> | |
16 | using namespace BOOST_SPIRIT_CLASSIC_NS; | |
17 | ||
18 | /////////////////////////////////////////////////////////////////////////////// | |
19 | // | |
20 | // Loops tests | |
21 | // | |
22 | /////////////////////////////////////////////////////////////////////////////// | |
23 | void | |
24 | loops_tests() | |
25 | { | |
26 | parse_info<char const*> pi; | |
27 | ||
28 | pi = parse("\"Hello World\"", "\"" >> *(anychar_p - "\"") >> "\""); | |
29 | BOOST_TEST(pi.hit); | |
30 | BOOST_TEST(pi.full); | |
31 | BOOST_TEST(pi.length == 13); | |
32 | BOOST_TEST(*pi.stop == 0); | |
33 | ||
34 | pi = parse("\"Hello World\"", "\"" >> repeat_p(0, more)[anychar_p - "\""] >> "\""); | |
35 | BOOST_TEST(pi.hit); | |
36 | BOOST_TEST(pi.full); | |
37 | BOOST_TEST(pi.length == 13); | |
38 | BOOST_TEST(*pi.stop == 0); | |
39 | ||
40 | pi = parse("xx", +ch_p('x')); | |
41 | BOOST_TEST(pi.hit); | |
42 | BOOST_TEST(pi.full); | |
43 | BOOST_TEST(pi.length == 2); | |
44 | BOOST_TEST(*pi.stop == 0); | |
45 | ||
46 | pi = parse("xx", repeat_p(1, more)[ch_p('x')]); | |
47 | BOOST_TEST(pi.hit); | |
48 | BOOST_TEST(pi.full); | |
49 | BOOST_TEST(pi.length == 2); | |
50 | BOOST_TEST(*pi.stop == 0); | |
51 | ||
52 | pi = parse("", +ch_p('x')); | |
53 | BOOST_TEST(!pi.hit); | |
54 | ||
55 | pi = parse("", repeat_p(1, more)[ch_p('x')]); | |
56 | BOOST_TEST(!pi.hit); | |
57 | ||
58 | pi = parse("", *ch_p('x')); | |
59 | BOOST_TEST(pi.hit); | |
60 | BOOST_TEST(pi.full); | |
61 | BOOST_TEST(pi.length == 0); | |
62 | BOOST_TEST(*pi.stop == 0); | |
63 | ||
64 | pi = parse("", repeat_p(0, more)[ch_p('x')]); | |
65 | BOOST_TEST(pi.hit); | |
66 | BOOST_TEST(pi.full); | |
67 | BOOST_TEST(pi.length == 0); | |
68 | BOOST_TEST(*pi.stop == 0); | |
69 | ||
70 | // repeat exact 8 | |
71 | rule<> rep8 = repeat_p(8)[alpha_p] >> 'X'; | |
72 | BOOST_TEST(!parse("abcdefgX", rep8).hit); | |
73 | BOOST_TEST(parse("abcdefghX", rep8).full); | |
74 | BOOST_TEST(!parse("abcdefghiX", rep8).hit); | |
75 | BOOST_TEST(!parse("abcdefgX", rep8).hit); | |
76 | BOOST_TEST(!parse("aX", rep8).hit); | |
77 | ||
78 | // repeat 2 to 8 | |
79 | rule<> rep28 = repeat_p(2, 8)[alpha_p] >> '*'; | |
80 | BOOST_TEST(parse("abcdefg*", rep28).full); | |
81 | BOOST_TEST(parse("abcdefgh*", rep28).full); | |
82 | BOOST_TEST(!parse("abcdefghi*", rep28).hit); | |
83 | BOOST_TEST(!parse("a*", rep28).hit); | |
84 | ||
85 | // repeat 2 or more | |
86 | rule<> rep2_ = repeat_p(2, more)[alpha_p] >> '+'; | |
87 | BOOST_TEST(parse("abcdefg+", rep2_).full); | |
88 | BOOST_TEST(parse("abcdefgh+", rep2_).full); | |
89 | BOOST_TEST(parse("abcdefghi+", rep2_).full); | |
90 | BOOST_TEST(parse("abcdefg+", rep2_).full); | |
91 | BOOST_TEST(!parse("a+", rep2_).hit); | |
92 | ||
93 | // repeat 0 | |
94 | rule<> rep0 = repeat_p(0)[alpha_p] >> '/'; | |
95 | BOOST_TEST(parse("/", rep0).full); | |
96 | BOOST_TEST(!parse("a/", rep0).hit); | |
97 | ||
98 | // repeat 0 or 1 | |
99 | rule<> rep01 = repeat_p(0, 1)[alpha_p >> digit_p] >> '?'; | |
100 | BOOST_TEST(!parse("abcdefg?", rep01).hit); | |
101 | BOOST_TEST(!parse("a?", rep01).hit); | |
102 | BOOST_TEST(!parse("1?", rep01).hit); | |
103 | BOOST_TEST(!parse("11?", rep01).hit); | |
104 | BOOST_TEST(!parse("aa?", rep01).hit); | |
105 | BOOST_TEST(parse("?", rep01).full); | |
106 | BOOST_TEST(parse("a1?", rep01).full); | |
107 | } | |
108 | ||
109 | /////////////////////////////////////////////////////////////////////////////// | |
110 | // | |
111 | // Main | |
112 | // | |
113 | /////////////////////////////////////////////////////////////////////////////// | |
114 | int | |
115 | main() | |
116 | { | |
117 | loops_tests(); | |
118 | return boost::report_errors(); | |
119 | } | |
120 |