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 // this file intentionally contains non-ascii characters
7 // boostinspect:noascii
8 
9 #include <boost/config/warning_disable.hpp>
10 #include <boost/detail/lightweight_test.hpp>
11 
12 #include <boost/spirit/include/karma_char.hpp>
13 #include <boost/spirit/include/karma_generate.hpp>
14 #include <boost/spirit/include/karma_directive.hpp>
15 
16 #include <string>
17 #include <iterator>
18 
19 #include "test.hpp"
20 
21 ///////////////////////////////////////////////////////////////////////////////
main()22 int main()
23 {
24     using namespace spirit_test;
25     using namespace boost::spirit;
26 
27     {
28         using namespace boost::spirit::ascii;
29         BOOST_TEST(test("a", alpha, 'a'));
30         BOOST_TEST(!test("", alpha, '1'));
31         BOOST_TEST(test(" ", blank, ' '));
32         BOOST_TEST(!test("", blank, 'x'));
33         BOOST_TEST(test("1", digit, '1'));
34         BOOST_TEST(!test("", digit, 'x'));
35         BOOST_TEST(test("a", lower, 'a'));
36         BOOST_TEST(!test("", lower, 'A'));
37         BOOST_TEST(test("!", punct, '!'));
38         BOOST_TEST(!test("", punct, 'x'));
39         BOOST_TEST(test(" ", space));
40         BOOST_TEST(test(" ", space, ' '));
41         BOOST_TEST(!test("", space, '\n'));
42         BOOST_TEST(test("\r", space, '\r'));
43         BOOST_TEST(test("\t", space, '\t'));
44         BOOST_TEST(test("A", upper, 'A'));
45         BOOST_TEST(!test("", upper, 'a'));
46         BOOST_TEST(test("A", xdigit, 'A'));
47         BOOST_TEST(test("0", xdigit, '0'));
48         BOOST_TEST(test("f", xdigit, 'f'));
49         BOOST_TEST(!test("", xdigit, 'g'));
50     }
51 
52     {
53         using namespace boost::spirit::ascii;
54         BOOST_TEST(!test("", ~alpha, 'a'));
55         BOOST_TEST(test("1", ~alpha, '1'));
56         BOOST_TEST(!test("", ~blank, ' '));
57         BOOST_TEST(test("x", ~blank, 'x'));
58         BOOST_TEST(!test("", ~digit, '1'));
59         BOOST_TEST(test("x", ~digit, 'x'));
60         BOOST_TEST(!test("", ~lower, 'a'));
61         BOOST_TEST(test("A", ~lower, 'A'));
62         BOOST_TEST(!test("", ~punct, '!'));
63         BOOST_TEST(test("x", ~punct, 'x'));
64         BOOST_TEST(!test("", ~space));
65         BOOST_TEST(!test("", ~space, ' '));
66         BOOST_TEST(!test("", ~space, '\r'));
67         BOOST_TEST(!test("", ~space, '\t'));
68         BOOST_TEST(!test("", ~upper, 'A'));
69         BOOST_TEST(test("a", ~upper, 'a'));
70         BOOST_TEST(!test("", ~xdigit, 'A'));
71         BOOST_TEST(!test("", ~xdigit, '0'));
72         BOOST_TEST(!test("", ~xdigit, 'f'));
73         BOOST_TEST(test("g", ~xdigit, 'g'));
74     }
75 
76     {
77         using namespace boost::spirit::ascii;
78         BOOST_TEST(test("a", ~~alpha, 'a'));
79         BOOST_TEST(!test("", ~~alpha, '1'));
80         BOOST_TEST(test(" ", ~~blank, ' '));
81         BOOST_TEST(!test("", ~~blank, 'x'));
82         BOOST_TEST(test("1", ~~digit, '1'));
83         BOOST_TEST(!test("", ~~digit, 'x'));
84         BOOST_TEST(test("a", ~~lower, 'a'));
85         BOOST_TEST(!test("", ~~lower, 'A'));
86         BOOST_TEST(test("!", ~~punct, '!'));
87         BOOST_TEST(!test("", ~~punct, 'x'));
88         BOOST_TEST(test(" ", ~~space));
89         BOOST_TEST(test(" ", ~~space, ' '));
90         BOOST_TEST(!test("", ~~space, '\n'));
91         BOOST_TEST(test("\r", ~~space, '\r'));
92         BOOST_TEST(test("\t", ~~space, '\t'));
93         BOOST_TEST(test("A", ~~upper, 'A'));
94         BOOST_TEST(!test("", ~~upper, 'a'));
95         BOOST_TEST(test("A", ~~xdigit, 'A'));
96         BOOST_TEST(test("0", ~~xdigit, '0'));
97         BOOST_TEST(test("f", ~~xdigit, 'f'));
98         BOOST_TEST(!test("", ~~xdigit, 'g'));
99     }
100 
101     {
102         using namespace boost::spirit::ascii;
103         BOOST_TEST(test("a", lower[alpha], 'a'));
104         BOOST_TEST(!test("", lower[alpha], 'A'));
105         BOOST_TEST(!test("", lower[alpha], '1'));
106         BOOST_TEST(test("a", lower[alnum], 'a'));
107         BOOST_TEST(!test("", lower[alnum], 'A'));
108         BOOST_TEST(test("1", lower[alnum], '1'));
109 
110         BOOST_TEST(!test("", upper[alpha], 'a'));
111         BOOST_TEST(test("A", upper[alpha], 'A'));
112         BOOST_TEST(!test("", upper[alpha], '1'));
113         BOOST_TEST(!test("", upper[alnum], 'a'));
114         BOOST_TEST(test("A", upper[alnum], 'A'));
115         BOOST_TEST(test("1", upper[alnum], '1'));
116     }
117 
118     {
119         using namespace boost::spirit::iso8859_1;
120         BOOST_TEST(test("a", alpha, 'a'));
121         BOOST_TEST(!test("", alpha, '1'));
122         BOOST_TEST(test(" ", blank, ' '));
123         BOOST_TEST(!test("", blank, 'x'));
124         BOOST_TEST(test("1", digit, '1'));
125         BOOST_TEST(!test("", digit, 'x'));
126         BOOST_TEST(test("a", lower, 'a'));
127         BOOST_TEST(!test("", lower, 'A'));
128         BOOST_TEST(test("!", punct, '!'));
129         BOOST_TEST(!test("", punct, 'x'));
130         BOOST_TEST(test(" ", space));
131         BOOST_TEST(test(" ", space, ' '));
132         BOOST_TEST(!test("", space, '\n'));
133         BOOST_TEST(test("\r", space, '\r'));
134         BOOST_TEST(test("\t", space, '\t'));
135         BOOST_TEST(test("A", upper, 'A'));
136         BOOST_TEST(!test("", upper, 'a'));
137         BOOST_TEST(test("A", xdigit, 'A'));
138         BOOST_TEST(test("0", xdigit, '0'));
139         BOOST_TEST(test("f", xdigit, 'f'));
140         BOOST_TEST(!test("", xdigit, 'g'));
141 
142 
143 // needed for VC7.1 only
144 #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
145 #pragma setlocale("german")
146 #endif
147         BOOST_TEST(test("�", alpha, '�'));
148         BOOST_TEST(test("�", lower, '�'));
149         BOOST_TEST(!test("", upper, '�'));
150 #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
151 #pragma setlocale("")
152 #endif
153     }
154 
155     {
156         using namespace boost::spirit::standard;
157         BOOST_TEST(test("a", alpha, 'a'));
158         BOOST_TEST(!test("", alpha, '1'));
159         BOOST_TEST(test(" ", blank, ' '));
160         BOOST_TEST(!test("", blank, 'x'));
161         BOOST_TEST(test("1", digit, '1'));
162         BOOST_TEST(!test("", digit, 'x'));
163         BOOST_TEST(test("a", lower, 'a'));
164         BOOST_TEST(!test("", lower, 'A'));
165         BOOST_TEST(test("!", punct, '!'));
166         BOOST_TEST(!test("", punct, 'x'));
167         BOOST_TEST(test(" ", space));
168         BOOST_TEST(test(" ", space, ' '));
169         BOOST_TEST(!test("", space, '\n'));
170         BOOST_TEST(test("\r", space, '\r'));
171         BOOST_TEST(test("\t", space, '\t'));
172         BOOST_TEST(test("A", upper, 'A'));
173         BOOST_TEST(!test("", upper, 'a'));
174         BOOST_TEST(test("A", xdigit, 'A'));
175         BOOST_TEST(test("0", xdigit, '0'));
176         BOOST_TEST(test("f", xdigit, 'f'));
177         BOOST_TEST(!test("", xdigit, 'g'));
178     }
179 
180     {
181         using namespace boost::spirit::standard_wide;
182         BOOST_TEST(test(L"a", alpha, L'a'));
183         BOOST_TEST(!test(L"", alpha, L'1'));
184         BOOST_TEST(test(L" ", blank, L' '));
185         BOOST_TEST(!test(L"", blank, L'x'));
186         BOOST_TEST(test(L"1", digit, L'1'));
187         BOOST_TEST(!test(L"", digit, L'x'));
188         BOOST_TEST(test(L"a", lower, L'a'));
189         BOOST_TEST(!test(L"", lower, L'A'));
190         BOOST_TEST(test(L"!", punct, L'!'));
191         BOOST_TEST(!test(L"", punct, L'x'));
192         BOOST_TEST(test(L" ", space));
193         BOOST_TEST(test(L" ", space, L' '));
194         BOOST_TEST(!test(L"", space, L'\n'));
195         BOOST_TEST(test(L"\r", space, L'\r'));
196         BOOST_TEST(test(L"\t", space, L'\t'));
197         BOOST_TEST(test(L"A", upper, L'A'));
198         BOOST_TEST(!test(L"", upper, L'a'));
199         BOOST_TEST(test(L"A", xdigit, L'A'));
200         BOOST_TEST(test(L"0", xdigit, L'0'));
201         BOOST_TEST(test(L"f", xdigit, L'f'));
202         BOOST_TEST(!test(L"", xdigit, L'g'));
203     }
204 
205     return boost::report_errors();
206 }
207