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