1 /*=============================================================================
2     Copyright (c) 1998-2003 Joel de Guzman
3     Copyright (c) 2002-2003 Martin Wille
4     http://spirit.sourceforge.net/
5 
6     Use, modification and distribution is subject to the Boost Software
7     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8     http://www.boost.org/LICENSE_1_0.txt)
9 =============================================================================*/
10 #include <iostream>
11 
12 #include <boost/spirit/include/classic_core.hpp>
13 #include <boost/detail/lightweight_test.hpp>
14 #include "impl/string_length.hpp"
15 using namespace BOOST_SPIRIT_CLASSIC_NS;
16 
17 ///////////////////////////////////////////////////////////////////////////////
18 //
19 //  Primitives tests
20 //
21 ///////////////////////////////////////////////////////////////////////////////
22 void
primitives_tests()23 primitives_tests()
24 {
25     char const* cp = "xyz.Jambalaya";
26     char const* cp_first = cp;
27     char const* cp_last = cp + test_impl::string_length(cp);
28 
29     chlit<> cpx('x');
30     parse_info<char const*> pi = parse(cp_first, cp_last, cpx);
31     BOOST_TEST(pi.hit);
32     BOOST_TEST(!pi.full);
33     BOOST_TEST(pi.length == 1);
34     BOOST_TEST(pi.stop == &cp[1]);
35 
36     pi = parse(pi.stop, ch_p('y'));
37     BOOST_TEST(pi.hit);
38     BOOST_TEST(!pi.full);
39     BOOST_TEST(pi.length == 1);
40     BOOST_TEST(pi.stop == &cp[2]);
41 
42     scanner<char const*> scan(pi.stop, cp_last);
43     match<char> hit = ch_p('z').parse(scan);
44     BOOST_TEST(hit);
45     BOOST_TEST(hit.value() == 'z');
46     BOOST_TEST(pi.stop == &cp[3]);
47 
48     pi = parse(pi.stop, eps_p);
49     BOOST_TEST(pi.hit);
50     BOOST_TEST(!pi.full);
51     BOOST_TEST(pi.length == 0);
52     BOOST_TEST(pi.stop == &cp[3]);
53 
54     pi = parse(pi.stop, nothing_p);
55     BOOST_TEST(!pi.hit);
56     BOOST_TEST(!pi.full);
57     BOOST_TEST(pi.stop == &cp[3]);
58 
59     pi = parse(pi.stop, anychar_p);
60     BOOST_TEST(pi.hit);
61     BOOST_TEST(!pi.full);
62     BOOST_TEST(pi.length == 1);
63     BOOST_TEST(pi.stop == &cp[4]);
64 
65     scan.first = pi.stop;
66     hit = range_p('A','Z').parse(scan);
67     BOOST_TEST(hit);
68     BOOST_TEST(hit.value() == 'J');
69     BOOST_TEST(pi.stop == &cp[5]);
70 
71     strlit<char const*>     sp("ambalaya");
72     strlit<wchar_t const*>  wsp(L"ambalaya");
73 
74     char const* save = pi.stop;
75     pi = parse(save, sp);
76     BOOST_TEST(pi.hit);
77     BOOST_TEST(pi.full);
78     BOOST_TEST(pi.length == 8);
79     BOOST_TEST(pi.stop == cp_last);
80 
81     pi = parse(save, wsp);
82     BOOST_TEST(pi.hit);
83     BOOST_TEST(pi.full);
84     BOOST_TEST(pi.length == 8);
85     BOOST_TEST(pi.stop == cp_last);
86 
87     pi = parse("\n", eol_p);
88     BOOST_TEST(pi.hit);
89     BOOST_TEST(pi.full);
90 
91     pi = parse("\r", eol_p);
92     BOOST_TEST(pi.hit);
93     BOOST_TEST(pi.full);
94 
95     pi = parse("\r\n", eol_p);
96     BOOST_TEST(pi.hit);
97     BOOST_TEST(pi.full);
98 
99     pi = parse("\n\r", eol_p);
100     BOOST_TEST(pi.hit);
101     BOOST_TEST(!pi.full);
102 
103     pi = parse("", end_p);
104     BOOST_TEST(pi.hit);
105     BOOST_TEST(pi.full);
106 
107     pi = parse("1", ~alpha_p);
108     BOOST_TEST(pi.hit);
109     BOOST_TEST(pi.full);
110 
111     pi = parse("a", ~alpha_p);
112     BOOST_TEST(!pi.hit);
113 
114     pi = parse("a", ~~alpha_p);
115     BOOST_TEST(pi.hit);
116     BOOST_TEST(pi.full);
117 
118     pi = parse("1", ~~alpha_p);
119     BOOST_TEST(!pi.hit);
120 }
121 
122 ///////////////////////////////////////////////////////////////////////////////
123 //
124 //  Main
125 //
126 ///////////////////////////////////////////////////////////////////////////////
127 int
main()128 main()
129 {
130     primitives_tests();
131     if (boost::report_errors() == 0)
132         std::cout << "Tests concluded successfully\n";
133     return boost::report_errors();
134 }
135 
136