1 /*=============================================================================
2 Copyright (c) 2001-2003 Daniel Nuffer
3 http://spirit.sourceforge.net/
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 <boost/spirit/include/classic_multi_pass.hpp>
10 #include <boost/scoped_ptr.hpp>
13 #include <boost/detail/lightweight_test.hpp>
14 #include "impl/sstream.hpp"
17 using namespace BOOST_SPIRIT_CLASSIC_NS
;
21 typedef multi_pass
<istream_iterator
<char> > default_multi_pass_t
;
23 typedef look_ahead
<istream_iterator
<char>, 6> fixed_multi_pass_t
;
26 istream_iterator
<char>,
27 multi_pass_policies::input_iterator
,
28 multi_pass_policies::first_owner
,
29 multi_pass_policies::buf_id_check
,
30 multi_pass_policies::std_deque
31 > first_owner_multi_pass_t
;
34 // a functor to test out the functor_multi_pass
38 typedef char result_type
;
51 static result_type eof
;
56 my_functor::result_type
my_functor::eof
= '\0';
60 multi_pass_policies::functor_input
,
61 multi_pass_policies::first_owner
,
62 multi_pass_policies::no_check
,
63 multi_pass_policies::std_deque
64 > functor_multi_pass_t
;
66 void test_default_multi_pass()
68 res
<< "-*= test_default_multi_pass =*-\n";
69 istream_iterator
<char> end
;
70 boost::scoped_ptr
<default_multi_pass_t
> mpend(new default_multi_pass_t(end
));
76 istream_iterator
<char> a(ss
);
77 boost::scoped_ptr
<default_multi_pass_t
> mp1(new default_multi_pass_t(a
));
79 while (*mp1
!= *mpend
)
90 istream_iterator
<char> b(ss
);
91 boost::scoped_ptr
<default_multi_pass_t
> mp2(new default_multi_pass_t(b
));
92 boost::scoped_ptr
<default_multi_pass_t
> mp3(new default_multi_pass_t(b
));
95 for (int i
= 0; i
< 4; ++i
)
103 while (*mp2
!= *mpend
)
115 istream_iterator
<char> a(ss
);
116 boost::scoped_ptr
<default_multi_pass_t
> mp1(new default_multi_pass_t(a
));
117 boost::scoped_ptr
<default_multi_pass_t
> mp2(new default_multi_pass_t(*mp1
));
119 for (int i
= 0; i
< 4; ++i
)
125 while (*mp2
!= *mpend
)
131 while (*mp1
!= *mpend
)
143 istream_iterator
<char> b(ss
);
144 boost::scoped_ptr
<default_multi_pass_t
> mp2(new default_multi_pass_t(b
));
145 boost::scoped_ptr
<default_multi_pass_t
> mp3(new default_multi_pass_t(b
));
148 for (int i
= 0; i
< 4; ++i
)
157 while (*mp2
!= *mpend
)
169 istream_iterator
<char> a(ss
);
170 boost::scoped_ptr
<default_multi_pass_t
> mp1(new default_multi_pass_t(a
));
171 boost::scoped_ptr
<default_multi_pass_t
> mp2(new default_multi_pass_t(*mp1
));
173 BOOST_TEST(*mp1
== *mp2
);
174 BOOST_TEST(*mp1
>= *mp2
);
175 BOOST_TEST(*mp1
<= *mp2
);
176 for (int i
= 0; i
< 4; ++i
)
182 BOOST_TEST(*mp1
!= *mp2
);
183 BOOST_TEST(*mp1
> *mp2
);
184 BOOST_TEST(*mp1
>= *mp2
);
185 BOOST_TEST(*mp2
< *mp1
);
186 BOOST_TEST(*mp2
<= *mp1
);
193 BOOST_TEST(*mp1
== *mp2
);
194 BOOST_TEST(*mp1
>= *mp2
);
195 BOOST_TEST(*mp1
<= *mp2
);
196 while (*mp1
!= *mpend
)
202 BOOST_TEST(*mp1
!= *mp2
);
203 BOOST_TEST(*mp1
> *mp2
);
204 BOOST_TEST(*mp1
>= *mp2
);
205 BOOST_TEST(*mp2
< *mp1
);
206 BOOST_TEST(*mp2
<= *mp1
);
207 while (*mp2
!= *mpend
)
213 BOOST_TEST(*mp1
== *mp2
);
214 BOOST_TEST(*mp1
>= *mp2
);
215 BOOST_TEST(*mp1
<= *mp2
);
222 istream_iterator
<char> a(ss
);
223 boost::scoped_ptr
<default_multi_pass_t
> mp1(new default_multi_pass_t(a
));
224 boost::scoped_ptr
<default_multi_pass_t
> mp2(new default_multi_pass_t(a
));
225 BOOST_TEST(*mp1
!= *mp2
);
227 BOOST_TEST(*mp1
!= *mp2
);
234 istream_iterator
<char> b(ss
);
235 boost::scoped_ptr
<default_multi_pass_t
> mp2(new default_multi_pass_t(b
));
236 boost::scoped_ptr
<default_multi_pass_t
> mp3(new default_multi_pass_t(b
));
239 for (int i
= 0; i
< 4; ++i
)
247 while (*mp2
!= *mpend
)
255 res
<< **mp3
; // this should throw illegal_backtracking
258 catch (const BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::illegal_backtracking
& /*e*/)
267 void test_fixed_multi_pass()
269 res
<< "-*= test_fixed_multi_pass =*-\n";
270 istream_iterator
<char> end
;
271 boost::scoped_ptr
<fixed_multi_pass_t
> mpend(new fixed_multi_pass_t(end
));
277 istream_iterator
<char> a(ss
);
278 boost::scoped_ptr
<fixed_multi_pass_t
> mp1(new fixed_multi_pass_t(a
));
280 while (*mp1
!= *mpend
)
291 istream_iterator
<char> b(ss
);
292 boost::scoped_ptr
<fixed_multi_pass_t
> mp2(new fixed_multi_pass_t(b
));
293 boost::scoped_ptr
<fixed_multi_pass_t
> mp3(new fixed_multi_pass_t(*mp2
));
295 for (int i
= 0; i
< 4; ++i
)
303 while (*mp2
!= *mpend
)
315 istream_iterator
<char> a(ss
);
316 boost::scoped_ptr
<fixed_multi_pass_t
> mp1(new fixed_multi_pass_t(a
));
317 boost::scoped_ptr
<fixed_multi_pass_t
> mp2(new fixed_multi_pass_t(*mp1
));
319 for (int i
= 0; i
< 4; ++i
)
325 while (*mp2
!= *mpend
)
331 while (*mp1
!= *mpend
)
343 istream_iterator
<char> b(ss
);
344 boost::scoped_ptr
<fixed_multi_pass_t
> mp2(new fixed_multi_pass_t(b
));
345 boost::scoped_ptr
<fixed_multi_pass_t
> mp3(new fixed_multi_pass_t(*mp2
));
347 for (int i
= 0; i
< 4; ++i
)
356 while (*mp2
!= *mpend
)
368 istream_iterator
<char> a(ss
);
369 boost::scoped_ptr
<fixed_multi_pass_t
> mp1(new fixed_multi_pass_t(a
));
370 boost::scoped_ptr
<fixed_multi_pass_t
> mp2(new fixed_multi_pass_t(*mp1
));
372 BOOST_TEST(*mp1
== *mp2
);
373 BOOST_TEST(*mp1
>= *mp2
);
374 BOOST_TEST(*mp1
<= *mp2
);
375 for (int i
= 0; i
< 4; ++i
)
381 BOOST_TEST(*mp1
!= *mp2
);
382 BOOST_TEST(*mp1
> *mp2
);
383 BOOST_TEST(*mp1
>= *mp2
);
384 BOOST_TEST(*mp2
< *mp1
);
385 BOOST_TEST(*mp2
<= *mp1
);
392 BOOST_TEST(*mp1
== *mp2
);
393 BOOST_TEST(*mp1
>= *mp2
);
394 BOOST_TEST(*mp1
<= *mp2
);
395 while (*mp1
!= *mpend
)
401 BOOST_TEST(*mp1
!= *mp2
);
402 BOOST_TEST(*mp1
> *mp2
);
403 BOOST_TEST(*mp1
>= *mp2
);
404 BOOST_TEST(*mp2
< *mp1
);
405 BOOST_TEST(*mp2
<= *mp1
);
406 while (*mp2
!= *mpend
)
412 BOOST_TEST(*mp1
== *mp2
);
413 BOOST_TEST(*mp1
>= *mp2
);
414 BOOST_TEST(*mp1
<= *mp2
);
421 istream_iterator
<char> a(ss
);
422 boost::scoped_ptr
<fixed_multi_pass_t
> mp1(new fixed_multi_pass_t(a
));
423 boost::scoped_ptr
<fixed_multi_pass_t
> mp2(new fixed_multi_pass_t(a
));
424 BOOST_TEST(*mp1
!= *mp2
);
426 BOOST_TEST(*mp1
!= *mp2
);
432 void test_first_owner_multi_pass()
434 res
<< "-*= test_first_owner_multi_pass =*-\n";
435 istream_iterator
<char> end
;
436 boost::scoped_ptr
<first_owner_multi_pass_t
> mpend(new first_owner_multi_pass_t(end
));
442 istream_iterator
<char> a(ss
);
443 boost::scoped_ptr
<first_owner_multi_pass_t
> mp1(new first_owner_multi_pass_t(a
));
445 while (*mp1
!= *mpend
)
456 istream_iterator
<char> b(ss
);
457 boost::scoped_ptr
<first_owner_multi_pass_t
> mp2(new first_owner_multi_pass_t(b
));
458 boost::scoped_ptr
<first_owner_multi_pass_t
> mp3(new first_owner_multi_pass_t(*mp2
));
460 for (int i
= 0; i
< 4; ++i
)
468 while (*mp2
!= *mpend
)
480 istream_iterator
<char> a(ss
);
481 boost::scoped_ptr
<first_owner_multi_pass_t
> mp1(new first_owner_multi_pass_t(a
));
482 boost::scoped_ptr
<first_owner_multi_pass_t
> mp2(new first_owner_multi_pass_t(*mp1
));
484 for (int i
= 0; i
< 4; ++i
)
490 while (*mp2
!= *mpend
)
496 while (*mp1
!= *mpend
)
508 istream_iterator
<char> b(ss
);
509 boost::scoped_ptr
<first_owner_multi_pass_t
> mp2(new first_owner_multi_pass_t(b
));
510 boost::scoped_ptr
<first_owner_multi_pass_t
> mp3(new first_owner_multi_pass_t(*mp2
));
512 for (int i
= 0; i
< 4; ++i
)
521 while (*mp2
!= *mpend
)
533 istream_iterator
<char> a(ss
);
534 boost::scoped_ptr
<first_owner_multi_pass_t
> mp1(new first_owner_multi_pass_t(a
));
535 boost::scoped_ptr
<first_owner_multi_pass_t
> mp2(new first_owner_multi_pass_t(*mp1
));
537 BOOST_TEST(*mp1
== *mp2
);
538 BOOST_TEST(*mp1
>= *mp2
);
539 BOOST_TEST(*mp1
<= *mp2
);
540 for (int i
= 0; i
< 4; ++i
)
546 BOOST_TEST(*mp1
!= *mp2
);
547 BOOST_TEST(*mp1
> *mp2
);
548 BOOST_TEST(*mp1
>= *mp2
);
549 BOOST_TEST(*mp2
< *mp1
);
550 BOOST_TEST(*mp2
<= *mp1
);
557 BOOST_TEST(*mp1
== *mp2
);
558 BOOST_TEST(*mp1
>= *mp2
);
559 BOOST_TEST(*mp1
<= *mp2
);
560 while (*mp1
!= *mpend
)
566 BOOST_TEST(*mp1
!= *mp2
);
567 BOOST_TEST(*mp1
> *mp2
);
568 BOOST_TEST(*mp1
>= *mp2
);
569 BOOST_TEST(*mp2
< *mp1
);
570 BOOST_TEST(*mp2
<= *mp1
);
571 while (*mp2
!= *mpend
)
577 BOOST_TEST(*mp1
== *mp2
);
578 BOOST_TEST(*mp1
>= *mp2
);
579 BOOST_TEST(*mp1
<= *mp2
);
586 istream_iterator
<char> a(ss
);
587 boost::scoped_ptr
<first_owner_multi_pass_t
> mp1(new first_owner_multi_pass_t(a
));
588 boost::scoped_ptr
<first_owner_multi_pass_t
> mp2(new first_owner_multi_pass_t(a
));
589 BOOST_TEST(*mp1
!= *mp2
);
591 BOOST_TEST(*mp1
!= *mp2
);
598 istream_iterator
<char> b(ss
);
599 boost::scoped_ptr
<first_owner_multi_pass_t
> mp2(new first_owner_multi_pass_t(b
));
600 boost::scoped_ptr
<first_owner_multi_pass_t
> mp3(new first_owner_multi_pass_t(*mp2
));
602 for (int i
= 0; i
< 4; ++i
)
610 while (*mp2
!= *mpend
)
618 res
<< **mp3
; // this should throw illegal_backtracking
621 catch (const BOOST_SPIRIT_CLASSIC_NS::multi_pass_policies::illegal_backtracking
& /*e*/)
630 void test_functor_multi_pass()
632 res
<< "-*= test_functor_multi_pass =*-\n";
633 functor_multi_pass_t mpend
;
636 functor_multi_pass_t mp1
= functor_multi_pass_t(my_functor());
647 functor_multi_pass_t mp1
= functor_multi_pass_t(my_functor());
648 functor_multi_pass_t mp2
= functor_multi_pass_t(mp1
);
650 for (int i
= 0; i
< 4; ++i
)
672 functor_multi_pass_t mp1
= functor_multi_pass_t(my_functor());
673 functor_multi_pass_t mp2
= functor_multi_pass_t(mp1
);
675 BOOST_TEST(mp1
== mp2
);
676 BOOST_TEST(mp1
>= mp2
);
677 BOOST_TEST(mp1
<= mp2
);
678 for (int i
= 0; i
< 4; ++i
)
684 BOOST_TEST(mp1
!= mp2
);
685 BOOST_TEST(mp1
> mp2
);
686 BOOST_TEST(mp1
>= mp2
);
687 BOOST_TEST(mp2
< mp1
);
688 BOOST_TEST(mp2
<= mp1
);
695 BOOST_TEST(mp1
== mp2
);
696 BOOST_TEST(mp1
>= mp2
);
697 BOOST_TEST(mp1
<= mp2
);
704 BOOST_TEST(mp1
!= mp2
);
705 BOOST_TEST(mp1
> mp2
);
706 BOOST_TEST(mp1
>= mp2
);
707 BOOST_TEST(mp2
< mp1
);
708 BOOST_TEST(mp2
<= mp1
);
715 BOOST_TEST(mp1
== mp2
);
716 BOOST_TEST(mp1
>= mp2
);
717 BOOST_TEST(mp1
<= mp2
);
722 functor_multi_pass_t mp1
= functor_multi_pass_t(my_functor());
723 functor_multi_pass_t mp2
= functor_multi_pass_t(my_functor());
724 BOOST_TEST(mp1
!= mp2
);
726 BOOST_TEST(mp1
!= mp2
);
731 int main(int, char**)
734 test_default_multi_pass();
735 test_fixed_multi_pass();
736 test_first_owner_multi_pass();
737 test_functor_multi_pass();
739 BOOST_TEST(getstring(res
) == "-*= test_default_multi_pass =*-\n"
742 "testteststringstring\n"
744 "testteststringstring\n"
746 "-*= test_fixed_multi_pass =*-\n"
749 "testteststringstring\n"
751 "testteststringstring\n"
752 "-*= test_first_owner_multi_pass =*-\n"
755 "testteststringstring\n"
757 "testteststringstring\n"
759 "-*= test_functor_multi_pass =*-\n"
761 "ABCDABCDEFGHIJKLEFGHIJKL\n"
762 "ABCDABCDEFGHIJKLEFGHIJKL\n");
764 return boost::report_errors();