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

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