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_string.hpp>
11 #include <boost/spirit/include/karma_generate.hpp>
12 #include <boost/spirit/include/karma_action.hpp>
13 #include <boost/spirit/include/support_argument.hpp>
14 #include <boost/spirit/include/phoenix_core.hpp>
15 #include <boost/spirit/include/phoenix_operator.hpp>
16 
17 #include "test.hpp"
18 
19 using namespace spirit_test;
20 
21 ///////////////////////////////////////////////////////////////////////////////
22 int
main()23 main()
24 {
25     using namespace boost::spirit;
26 
27     {
28         using namespace boost::spirit::ascii;
29 
30         BOOST_TEST(test("a", lit('a')));
31         BOOST_TEST(!test("a", lit('b')));
32 
33         BOOST_TEST(test("abc", "abc"));
34         BOOST_TEST(!test("abcd", "abc"));
35 
36         BOOST_TEST(test("abc", lit("abc")));
37         BOOST_TEST(!test("abcd", lit("abc")));
38 
39         BOOST_TEST(test("abc", string, "abc"));
40         BOOST_TEST(!test("abcd", string, "abc"));
41 
42         BOOST_TEST(test("abc", string("abc")));
43         BOOST_TEST(!test("abcd", string("abc")));
44 
45         BOOST_TEST(test("abc", string("abc"), "abc"));
46         BOOST_TEST(!test("", string("abc"), "abcd"));
47         BOOST_TEST(!test("", string("abcd"), "abc"));
48         BOOST_TEST(!test("", string("abc"), "abcd"));   // don't match prefixes only
49     }
50 
51     {
52         using namespace boost::spirit::ascii;
53 
54         std::string str("abc");
55         BOOST_TEST(test("abc", lit(str)));
56         BOOST_TEST(!test("abcd", lit(str)));
57 
58         BOOST_TEST(test("abc", string(str)));
59         BOOST_TEST(!test("abcd", string(str)));
60 
61         BOOST_TEST(test("abc", string, str));
62         BOOST_TEST(!test("abcd", string, str));
63 
64         BOOST_TEST(test("abc", str));
65         BOOST_TEST(!test("abcd", str));
66     }
67 
68     {
69         using namespace boost::spirit::standard_wide;
70 
71         std::basic_string<wchar_t> wstr(L"abc");
72         BOOST_TEST(test(L"abc", lit(wstr)));
73         BOOST_TEST(!test(L"abcd", lit(wstr)));
74 
75         BOOST_TEST(test(L"abc", string, wstr));
76         BOOST_TEST(!test(L"abcd", string, wstr));
77 
78         BOOST_TEST(test(L"abc", wstr));
79         BOOST_TEST(!test(L"abcd", wstr));
80     }
81 
82     {
83         using namespace boost::spirit::ascii;
84 
85         BOOST_TEST(test(L"a", lit(L'a')));
86         BOOST_TEST(!test(L"a", lit(L'b')));
87 
88         BOOST_TEST(test(L"abc", L"abc"));
89         BOOST_TEST(test(L"abc", "abc"));
90         BOOST_TEST(!test(L"abcd", L"abc"));
91 
92         BOOST_TEST(test(L"abc", lit(L"abc")));
93         BOOST_TEST(!test(L"abcd", lit(L"abc")));
94 
95         BOOST_TEST(test(L"abc", string(L"abc")));
96         BOOST_TEST(!test(L"abcd", string(L"abc")));
97 
98         BOOST_TEST(test(L"abc", string, L"abc"));
99         BOOST_TEST(!test(L"abcd", string, L"abc"));
100 
101         BOOST_TEST(test(L"abc", string, "abc"));
102         BOOST_TEST(!test(L"abcd", string, "abc"));
103     }
104 
105     {
106         using namespace boost::spirit::karma;
107 
108         const char test_data[] = "abc\x00s";
109         const std::string str(test_data, sizeof(test_data) - 1);
110 
111         BOOST_TEST(test(str, lit(str)));
112         BOOST_TEST(!test("abc", lit(str)));
113 
114         BOOST_TEST(test(str, string(str)));
115         BOOST_TEST(!test("abc", string(str)));
116 
117         BOOST_TEST(test(str, string, str));
118         BOOST_TEST(!test("abc", string, str));
119 
120         BOOST_TEST(test(str, str));
121         BOOST_TEST(!test("abc", str));
122     }
123 
124     {
125         using namespace boost::spirit::ascii;
126 
127         BOOST_TEST(test_delimited("a ", lit('a'), ' '));
128         BOOST_TEST(!test_delimited("a ", lit('b'), ' '));
129 
130         BOOST_TEST(test_delimited("abc ", "abc", ' '));
131         BOOST_TEST(!test_delimited("abcd ", "abc", ' '));
132 
133         BOOST_TEST(test_delimited("abc ", lit("abc"), ' '));
134         BOOST_TEST(!test_delimited("abcd ", lit("abc"), ' '));
135 
136         BOOST_TEST(test_delimited("abc ", string, "abc", ' '));
137         BOOST_TEST(!test_delimited("abcd ", string, "abc", ' '));
138 
139         BOOST_TEST(test_delimited("abc ", string("abc"), ' '));
140         BOOST_TEST(!test_delimited("abcd ", string("abc"), ' '));
141 
142         BOOST_TEST(test_delimited("abc ", string("abc"), "abc", ' '));
143         BOOST_TEST(!test_delimited("", string("abc"), "abcd", ' '));
144         BOOST_TEST(!test_delimited("", string("abcd"), "abc", ' '));
145         BOOST_TEST(!test_delimited("", string("abc"), "abcd", ' '));   // don't match prefixes only
146     }
147 
148     {
149         using namespace boost::spirit::ascii;
150 
151         BOOST_TEST(test_delimited(L"a ", lit(L'a'), ' '));
152         BOOST_TEST(!test_delimited(L"a ", lit(L'b'), ' '));
153 
154         BOOST_TEST(test_delimited(L"abc ", L"abc", ' '));
155         BOOST_TEST(!test_delimited(L"abcd ", L"abc", ' '));
156 
157         BOOST_TEST(test_delimited(L"abc ", lit(L"abc"), ' '));
158         BOOST_TEST(!test_delimited(L"abcd ", lit(L"abc"), ' '));
159 
160         BOOST_TEST(test_delimited(L"abc ", string, L"abc", ' '));
161         BOOST_TEST(!test_delimited(L"abcd ", string, L"abc", ' '));
162 
163         BOOST_TEST(test_delimited(L"abc ", string(L"abc"), ' '));
164         BOOST_TEST(!test_delimited(L"abcd ", string(L"abc"), ' '));
165     }
166 
167     {   // test action
168         namespace phx = boost::phoenix;
169         using namespace boost::spirit::ascii;
170 
171         std::string str("abc");
172         BOOST_TEST(test("abc", string[_1 = phx::ref(str)]));
173         BOOST_TEST(test_delimited("abc ", string[_1 = phx::ref(str)], space));
174     }
175 
176     {   // lazy strings
177         namespace phx = boost::phoenix;
178         using namespace boost::spirit::ascii;
179 
180         std::basic_string<char> s("abc");
181         BOOST_TEST((test("abc", lit(phx::val(s)))));
182         BOOST_TEST((test("abc", string(phx::val(s)))));
183 
184         BOOST_TEST(test("abc", string(phx::val(s)), "abc"));
185         BOOST_TEST(!test("", string(phx::val(s)), "abcd"));
186         BOOST_TEST(!test("", string(phx::val(s)), "abc"));
187 
188         std::basic_string<wchar_t> ws(L"abc");
189         BOOST_TEST((test(L"abc", lit(phx::ref(ws)))));
190         BOOST_TEST((test(L"abc", string(phx::ref(ws)))));
191     }
192 
193     return boost::report_errors();
194 }
195