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#include <boost/spirit/include/karma_char.hpp>
7
8#include <boost/spirit/include/karma_generate.hpp>
9#include <boost/spirit/include/karma_action.hpp>
10#include <boost/spirit/include/karma_phoenix_attributes.hpp>
11
12#include <boost/phoenix/core.hpp>
13#include <boost/phoenix/operator.hpp>
14#include <boost/phoenix/statement.hpp>
15
16#include "test.hpp"
17
18using namespace spirit_test;
19
20///////////////////////////////////////////////////////////////////////////////
21int
22main()
23{
24 using namespace boost::spirit;
25 using namespace boost::phoenix;
26
27 {
28 using namespace boost::spirit::ascii;
29
30 BOOST_TEST(test("x", 'x'));
31 BOOST_TEST(test(L"x", L'x'));
32 BOOST_TEST(!test("x", 'y'));
33 BOOST_TEST(!test(L"x", L'y'));
34
35 BOOST_TEST(test("x", "x"));
36 BOOST_TEST(test(L"x", L"x"));
37 BOOST_TEST(!test("x", "y"));
38 BOOST_TEST(!test(L"x", L"y"));
39
40 BOOST_TEST(test("x", char_, 'x'));
41 BOOST_TEST(test(L"x", char_, L'x'));
42 BOOST_TEST(!test("x", char_, 'y'));
43 BOOST_TEST(!test(L"x", char_, L'y'));
44
45 BOOST_TEST(test("x", char_('x')));
46 BOOST_TEST(!test("x", char_('y')));
47
48 BOOST_TEST(test("x", char_('x'), 'x'));
49 BOOST_TEST(!test("", char_('y'), 'x'));
50
51 BOOST_TEST(test("x", char_("x")));
52
53 BOOST_TEST(test("a", char_('a', 'z'), 'a'));
54 BOOST_TEST(test("b", char_('a', 'z'), 'b'));
55 BOOST_TEST(!test("", char_('a', 'z'), 'A'));
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#if defined(KARMA_FAIL_COMPILATION)
62 BOOST_TEST(test("x", char_)); // anychar without a parameter doesn't make any sense
63 BOOST_TEST(test("", char_('a', 'z'))); // char sets without attribute neither
64#endif
65
66 BOOST_TEST(!test("", ~char_('x')));
67
68 BOOST_TEST(!test("", ~char_('x'), 'x'));
69 BOOST_TEST(test("x", ~char_('y'), 'x'));
70
71 BOOST_TEST(!test("", ~char_("x")));
72
73 BOOST_TEST(!test("", ~char_('a', 'z'), 'a'));
74 BOOST_TEST(!test("", ~char_('a', 'z'), 'b'));
75 BOOST_TEST(test("A", ~char_('a', 'z'), 'A'));
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("x", ~~char_('x')));
82 BOOST_TEST(!test("x", ~~char_('y')));
83
84 BOOST_TEST(test("x", ~~char_('x'), 'x'));
85 BOOST_TEST(!test("", ~~char_('y'), 'x'));
86
87 BOOST_TEST(test("x", ~~char_("x")));
88
89 BOOST_TEST(test("a", ~~char_('a', 'z'), 'a'));
90 BOOST_TEST(test("b", ~~char_('a', 'z'), 'b'));
91 BOOST_TEST(!test("", ~~char_('a', 'z'), 'A'));
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
98 {
99 using namespace boost::spirit::standard_wide;
100
101 BOOST_TEST(test(L"x", 'x'));
102 BOOST_TEST(test(L"x", L'x'));
103 BOOST_TEST(!test(L"x", 'y'));
104 BOOST_TEST(!test(L"x", L'y'));
105
106 BOOST_TEST(test(L"x", "x"));
107 BOOST_TEST(test(L"x", L"x"));
108 BOOST_TEST(!test(L"x", "y"));
109 BOOST_TEST(!test(L"x", L"y"));
110
111 BOOST_TEST(test(L"x", char_, 'x'));
112 BOOST_TEST(test(L"x", char_, L'x'));
113 BOOST_TEST(!test(L"x", char_, 'y'));
114 BOOST_TEST(!test(L"x", char_, L'y'));
115
116 BOOST_TEST(test(L"x", char_('x')));
117 BOOST_TEST(test(L"x", char_(L'x')));
118 BOOST_TEST(!test(L"x", char_('y')));
119 BOOST_TEST(!test(L"x", char_(L'y')));
120
121 BOOST_TEST(test(L"x", char_(L'x'), L'x'));
122 BOOST_TEST(!test(L"", char_('y'), L'x'));
123
124 BOOST_TEST(test(L"x", char_(L"x")));
125
126 BOOST_TEST(test("a", char_("a", "z"), 'a'));
127 BOOST_TEST(test(L"a", char_(L"a", L"z"), L'a'));
128
129#if defined(KARMA_FAIL_COMPILATION)
130 BOOST_TEST(test("x", char_)); // anychar without a parameter doesn't make any sense
131#endif
132
133 BOOST_TEST(!test(L"", ~char_('x')));
134 BOOST_TEST(!test(L"", ~char_(L'x')));
135
136 BOOST_TEST(!test(L"", ~char_(L'x'), L'x'));
137 BOOST_TEST(test(L"x", ~char_('y'), L'x'));
138
139 BOOST_TEST(!test(L"", ~char_(L"x")));
140 }
141
142 { // lazy chars
143 namespace ascii = boost::spirit::ascii;
144 namespace wide = boost::spirit::standard_wide;
145
146 using namespace boost::phoenix;
147
148 BOOST_TEST((test("x", ascii::char_(val('x')))));
149 BOOST_TEST((test(L"x", wide::char_(val(L'x')))));
150
151 BOOST_TEST((test("x", ascii::char_(val('x')), 'x')));
152 BOOST_TEST((test(L"x", wide::char_(val(L'x')), L'x')));
153
154 BOOST_TEST((!test("", ascii::char_(val('y')), 'x')));
155 BOOST_TEST((!test(L"", wide::char_(val(L'y')), L'x')));
156 }
157
158 // we can pass optionals as attributes to any generator
159 {
160 namespace ascii = boost::spirit::ascii;
161 namespace wide = boost::spirit::standard_wide;
162
163 boost::optional<char> v;
164 boost::optional<wchar_t> w;
165
166 BOOST_TEST(!test("", ascii::char_, v));
167 BOOST_TEST(!test(L"", wide::char_, w));
168
169 BOOST_TEST(!test("", ascii::char_('x'), v));
170 BOOST_TEST(!test(L"", wide::char_(L'x'), w));
171 }
172
173 return boost::report_errors();
174}
175

source code of boost/libs/spirit/test/karma/char1.cpp