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