1 //  Copyright (c) 2001-2011 Hartmut Kaiser
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 //#define KARMA_FAIL_COMPILATION
7 
8 #include <boost/config/warning_disable.hpp>
9 #include <boost/detail/lightweight_test.hpp>
10 
11 #include <boost/spirit/include/karma_char.hpp>
12 #include <boost/spirit/include/karma_generate.hpp>
13 #include <boost/spirit/include/karma_action.hpp>
14 #include <boost/spirit/include/karma_phoenix_attributes.hpp>
15 
16 #include <boost/spirit/include/phoenix_core.hpp>
17 #include <boost/spirit/include/phoenix_operator.hpp>
18 #include <boost/spirit/include/phoenix_statement.hpp>
19 
20 #include "test.hpp"
21 
22 using namespace spirit_test;
23 
24 ///////////////////////////////////////////////////////////////////////////////
25 int
main()26 main()
27 {
28     using namespace boost::spirit;
29     using namespace boost::phoenix;
30 
31     {
32         using namespace boost::spirit::ascii;
33 
34         BOOST_TEST(test("x", 'x'));
35         BOOST_TEST(test(L"x", L'x'));
36         BOOST_TEST(!test("x", 'y'));
37         BOOST_TEST(!test(L"x", L'y'));
38 
39         BOOST_TEST(test("x", "x"));
40         BOOST_TEST(test(L"x", L"x"));
41         BOOST_TEST(!test("x", "y"));
42         BOOST_TEST(!test(L"x", L"y"));
43 
44         BOOST_TEST(test("x", char_, 'x'));
45         BOOST_TEST(test(L"x", char_, L'x'));
46         BOOST_TEST(!test("x", char_, 'y'));
47         BOOST_TEST(!test(L"x", char_, L'y'));
48 
49         BOOST_TEST(test("x", char_('x')));
50         BOOST_TEST(!test("x", char_('y')));
51 
52         BOOST_TEST(test("x", char_('x'), 'x'));
53         BOOST_TEST(!test("", char_('y'), 'x'));
54 
55         BOOST_TEST(test("x", char_("x")));
56 
57         BOOST_TEST(test("a", char_('a', 'z'), 'a'));
58         BOOST_TEST(test("b", char_('a', 'z'), 'b'));
59         BOOST_TEST(!test("", char_('a', 'z'), 'A'));
60 
61         BOOST_TEST(test("a", char_("a-z"), 'a'));
62         BOOST_TEST(test("b", char_("a-z"), 'b'));
63         BOOST_TEST(!test("", char_("a-z"), 'A'));
64 
65 #if defined(KARMA_FAIL_COMPILATION)
66         BOOST_TEST(test("x", char_));           // anychar without a parameter doesn't make any sense
67         BOOST_TEST(test("", char_('a', 'z')));  // char sets without attribute neither
68 #endif
69 
70         BOOST_TEST(!test("", ~char_('x')));
71 
72         BOOST_TEST(!test("", ~char_('x'), 'x'));
73         BOOST_TEST(test("x", ~char_('y'), 'x'));
74 
75         BOOST_TEST(!test("", ~char_("x")));
76 
77         BOOST_TEST(!test("", ~char_('a', 'z'), 'a'));
78         BOOST_TEST(!test("", ~char_('a', 'z'), 'b'));
79         BOOST_TEST(test("A", ~char_('a', 'z'), 'A'));
80 
81         BOOST_TEST(!test("", ~char_("a-z"), 'a'));
82         BOOST_TEST(!test("", ~char_("a-z"), 'b'));
83         BOOST_TEST(test("A", ~char_("a-z"), 'A'));
84 
85         BOOST_TEST(test("x", ~~char_('x')));
86         BOOST_TEST(!test("x", ~~char_('y')));
87 
88         BOOST_TEST(test("x", ~~char_('x'), 'x'));
89         BOOST_TEST(!test("", ~~char_('y'), 'x'));
90 
91         BOOST_TEST(test("x", ~~char_("x")));
92 
93         BOOST_TEST(test("a", ~~char_('a', 'z'), 'a'));
94         BOOST_TEST(test("b", ~~char_('a', 'z'), 'b'));
95         BOOST_TEST(!test("", ~~char_('a', 'z'), 'A'));
96 
97         BOOST_TEST(test("a", ~~char_("a-z"), 'a'));
98         BOOST_TEST(test("b", ~~char_("a-z"), 'b'));
99         BOOST_TEST(!test("", ~~char_("a-z"), 'A'));
100     }
101 
102     {
103         using namespace boost::spirit::standard_wide;
104 
105         BOOST_TEST(test(L"x", 'x'));
106         BOOST_TEST(test(L"x", L'x'));
107         BOOST_TEST(!test(L"x", 'y'));
108         BOOST_TEST(!test(L"x", L'y'));
109 
110         BOOST_TEST(test(L"x", "x"));
111         BOOST_TEST(test(L"x", L"x"));
112         BOOST_TEST(!test(L"x", "y"));
113         BOOST_TEST(!test(L"x", L"y"));
114 
115         BOOST_TEST(test(L"x", char_, 'x'));
116         BOOST_TEST(test(L"x", char_, L'x'));
117         BOOST_TEST(!test(L"x", char_, 'y'));
118         BOOST_TEST(!test(L"x", char_, L'y'));
119 
120         BOOST_TEST(test(L"x", char_('x')));
121         BOOST_TEST(test(L"x", char_(L'x')));
122         BOOST_TEST(!test(L"x", char_('y')));
123         BOOST_TEST(!test(L"x", char_(L'y')));
124 
125         BOOST_TEST(test(L"x", char_(L'x'), L'x'));
126         BOOST_TEST(!test(L"", char_('y'), L'x'));
127 
128         BOOST_TEST(test(L"x", char_(L"x")));
129 
130         BOOST_TEST(test("a", char_("a", "z"), 'a'));
131         BOOST_TEST(test(L"a", char_(L"a", L"z"), L'a'));
132 
133 #if defined(KARMA_FAIL_COMPILATION)
134         BOOST_TEST(test("x", char_));           // anychar without a parameter doesn't make any sense
135 #endif
136 
137         BOOST_TEST(!test(L"", ~char_('x')));
138         BOOST_TEST(!test(L"", ~char_(L'x')));
139 
140         BOOST_TEST(!test(L"", ~char_(L'x'), L'x'));
141         BOOST_TEST(test(L"x", ~char_('y'), L'x'));
142 
143         BOOST_TEST(!test(L"", ~char_(L"x")));
144     }
145 
146     {   // lazy chars
147         namespace ascii = boost::spirit::ascii;
148         namespace wide = boost::spirit::standard_wide;
149 
150         using namespace boost::phoenix;
151 
152         BOOST_TEST((test("x", ascii::char_(val('x')))));
153         BOOST_TEST((test(L"x", wide::char_(val(L'x')))));
154 
155         BOOST_TEST((test("x", ascii::char_(val('x')), 'x')));
156         BOOST_TEST((test(L"x", wide::char_(val(L'x')), L'x')));
157 
158         BOOST_TEST((!test("", ascii::char_(val('y')), 'x')));
159         BOOST_TEST((!test(L"", wide::char_(val(L'y')), L'x')));
160     }
161 
162     // we can pass optionals as attributes to any generator
163     {
164         namespace ascii = boost::spirit::ascii;
165         namespace wide = boost::spirit::standard_wide;
166 
167         boost::optional<char> v;
168         boost::optional<wchar_t> w;
169 
170         BOOST_TEST(!test("", ascii::char_, v));
171         BOOST_TEST(!test(L"", wide::char_, w));
172 
173         BOOST_TEST(!test("", ascii::char_('x'), v));
174         BOOST_TEST(!test(L"", wide::char_(L'x'), w));
175     }
176 
177     return boost::report_errors();
178 }
179