1// Boost string_algo library substr_test.cpp file ------------------//
2
3// Copyright Pavol Droba 2002-2003. Use, modification and
4// distribution is subject to the Boost Software License, Version
5// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7
8// See http://www.boost.org for updates, documentation, and revision history.
9
10#include <boost/algorithm/string/replace.hpp>
11#include <boost/algorithm/string/erase.hpp>
12#include <boost/algorithm/string/std/list_traits.hpp>
13#include <boost/algorithm/string/std/string_traits.hpp>
14#include <boost/algorithm/string/finder.hpp>
15#include <boost/algorithm/string/formatter.hpp>
16#include <boost/algorithm/string/classification.hpp>
17
18// Include unit test framework
19#define BOOST_TEST_MAIN
20#include <boost/test/unit_test.hpp>
21
22#include <string>
23#include <vector>
24#include <list>
25#include <iostream>
26
27// equals predicate is used for result comparison
28#include <boost/algorithm/string/predicate.hpp>
29
30#include <boost/test/test_tools.hpp>
31
32using namespace std;
33using namespace boost;
34
35void sequence_traits_test()
36{
37 // basic_string traits
38 BOOST_CHECK( boost::algorithm::has_native_replace<string>::value );
39 BOOST_CHECK( !boost::algorithm::has_stable_iterators<string>::value );
40 BOOST_CHECK( !boost::algorithm::has_const_time_insert<string>::value );
41 BOOST_CHECK( !boost::algorithm::has_const_time_erase<string>::value );
42
43 // vector traits
44 BOOST_CHECK( !boost::algorithm::has_native_replace< vector<char> >::value );
45 BOOST_CHECK( !boost::algorithm::has_stable_iterators< vector<char> >::value );
46 BOOST_CHECK( !boost::algorithm::has_const_time_insert< vector<char> >::value );
47 BOOST_CHECK( !boost::algorithm::has_const_time_erase< vector<char> >::value );
48
49 // list traits
50 BOOST_CHECK( !boost::algorithm::has_native_replace< list<char> >::value );
51 BOOST_CHECK( boost::algorithm::has_stable_iterators< list<char> >::value );
52 BOOST_CHECK( boost::algorithm::has_const_time_insert< list<char> >::value );
53 BOOST_CHECK( boost::algorithm::has_const_time_erase< list<char> >::value );
54}
55
56// Combine tests for all variants of the algorithm
57#define C_ ,
58#define TEST_ALGO( Algo, Input, Params, Output ) \
59{\
60 BOOST_TEST_CHECKPOINT( #Algo " - Copy" );\
61\
62 string str1(Input);\
63\
64 /* Copy test */ \
65 BOOST_CHECK( Algo##_copy( str1, Params )==Output );\
66\
67 BOOST_TEST_CHECKPOINT( #Algo " - Iterator" );\
68 /* Iterator test */\
69 string strout;\
70 Algo##_copy( back_inserter(strout), str1, Params );\
71 BOOST_CHECK( strout==Output ); \
72\
73 /* In-place test */\
74 vector<char> vec1( str1.begin(), str1.end() );\
75 list<char> list1( str1.begin(), str1.end() );\
76\
77 BOOST_TEST_CHECKPOINT( #Algo " - Inplace(string)" );\
78 Algo( str1, Params ); \
79 BOOST_CHECK( equals( str1, Output ) ); \
80\
81 BOOST_TEST_CHECKPOINT( #Algo " - Inplace(vector)" );\
82 Algo( vec1, Params ); \
83 BOOST_CHECK( equals( vec1, Output ) );\
84\
85 BOOST_TEST_CHECKPOINT( #Algo " - Inplace(list)" );\
86 Algo( list1, Params ); \
87 BOOST_CHECK( equals( list1, Output ) );\
88}
89
90void replace_first_test()
91{
92 // replace first
93 TEST_ALGO( replace_first, "1abc3abc2", string("abc") C_ string("YYY"), string("1YYY3abc2") );
94 TEST_ALGO( ireplace_first, "1AbC3abc2", "aBc" C_ "YYY", string("1YYY3abc2") );
95 TEST_ALGO( replace_first, "1abc3abc2", string("abc") C_ string("Z"), string("1Z3abc2") );
96 TEST_ALGO( replace_first, "1abc3abc2", string("abc") C_ string("XXXX"), string("1XXXX3abc2") );
97 TEST_ALGO( replace_first, "1abc3abc2", string("") C_ string("XXXX"), string("1abc3abc2") );
98 TEST_ALGO( replace_first, "1abc3abc2", "" C_ "XXXX", string("1abc3abc2") );
99 TEST_ALGO( replace_first, "", string("") C_ string("XXXX"), string("") );
100 TEST_ALGO( erase_first, "1abc3abc2", string("abc"), string("13abc2") );
101 TEST_ALGO( ierase_first, "1aBc3abc2", "abC", "13abc2" );
102 TEST_ALGO( erase_first, "1abc3abc2", "abc", "13abc2" );
103 TEST_ALGO( erase_first, "1abc3abc2", string(""), string("1abc3abc2") );
104 TEST_ALGO( erase_first, "", string("abc"), string("") );
105}
106
107void replace_last_test()
108{
109 // replace last
110 TEST_ALGO( replace_last, "1abc3abc2", string("abc") C_ string("YYY"), string("1abc3YYY2") );
111 TEST_ALGO( ireplace_last, "1abc3AbC2", "aBc" C_ "YYY", string("1abc3YYY2") );
112 TEST_ALGO( replace_last, "1abc3abc2", string("abc") C_ string("Z"), string("1abc3Z2") );
113 TEST_ALGO( replace_last, "1abc3abc2", string("abc") C_ string("XXXX"), string("1abc3XXXX2") );
114 TEST_ALGO( replace_last, "1abc3abc2", "abc" C_ "XXXX", string("1abc3XXXX2") );
115 TEST_ALGO( replace_last, "", string("") C_ string("XXXX"), string("") );
116 TEST_ALGO( erase_last, "1abc3abc2", string("abc"), string("1abc32") );
117 TEST_ALGO( ierase_last, "1aBc3aBc2", "ABC", string("1aBc32") );
118 TEST_ALGO( erase_last, "1abc3abc2", "abc", string("1abc32") );
119 TEST_ALGO( erase_last, "1abc3abc2", string(""), string("1abc3abc2") );
120 TEST_ALGO( erase_last, "", string("abc"), string("") );
121}
122
123void replace_all_test()
124{
125 // replace all
126 TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("YYY"), string("1YYY3YYY2") );
127 TEST_ALGO( replace_all, string("1abc3abc2"), "/" C_ "\\", string("1abc3abc2") );
128 TEST_ALGO( ireplace_all, "1aBc3AbC2", "abC" C_ "YYY", string("1YYY3YYY2") );
129 TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("Z"), string("1Z3Z2") );
130 TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("XXXX"), string("1XXXX3XXXX2") );
131 TEST_ALGO( replace_all, "1abc3abc2", "abc" C_ "XXXX", string("1XXXX3XXXX2") );
132 TEST_ALGO( replace_all, "", string("") C_ string("XXXX"), string("") );
133 TEST_ALGO( erase_all, "1abc3abc2", string("abc"), string("132") );
134 TEST_ALGO( ierase_all, "1aBc3aBc2", "aBC", string("132") );
135 TEST_ALGO( erase_all, "1abc3abc2", "abc", string("132") );
136 TEST_ALGO( erase_all, "1abc3abc2", string(""), string("1abc3abc2") );
137 TEST_ALGO( erase_all, "", string("abc"), string("") );
138}
139
140void replace_nth_test()
141{
142 // replace nth
143 TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("YYY"), string("1YYY3abc2") );
144 TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ -1 C_ string("YYY"), string("1abc3YYY2") );
145 TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ 0 C_ "YYY", string("1YYY3abc2") );
146 TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ -1 C_ "YYY", string("1AbC3YYY2") );
147 TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("Z"), string("1Z3abc2") );
148 TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("XXXX"), string("1XXXX3abc2") );
149 TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 0 C_ "XXXX", string("1XXXX3abc2") );
150 TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 3 C_ "XXXX", string("1abc3abc2") );
151 TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ -3 C_ "XXXX", string("1abc3abc2") );
152 TEST_ALGO( replace_nth, "1abc3abc2", string("") C_ 0 C_ string("XXXX"), string("1abc3abc2") );
153 TEST_ALGO( replace_nth, "", string("") C_ 0 C_ string("XXXX"), string("") );
154 TEST_ALGO( replace_nth, "", string("") C_ -1 C_ string("XXXX"), string("") );
155 TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ 0, string("13abc2") );
156 TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ -1, string("1abc32") );
157 TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ -3, string("1abc3abc2") );
158 TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ 0, string("13aBc2") );
159 TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ -1, string("1aBc32") );
160 TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ -3, string("1aBc3aBc2") );
161 TEST_ALGO( erase_nth, "1abc3abc2", "abc" C_ 0, string("13abc2") );
162 TEST_ALGO( erase_nth, "1abc3abc2", string("") C_ 0, string("1abc3abc2") );
163 TEST_ALGO( erase_nth, "", string("abc") C_ 0, string("") );
164 TEST_ALGO( erase_nth, "", string("abc") C_ -1, string("") );
165 TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 1 C_ string("YYY"), string("1abc3YYY2") );
166 TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 2 C_ string("YYY"), string("1abc3abc2") );
167}
168
169void replace_head_test()
170{
171 // replace head
172 TEST_ALGO( replace_head, "abc3abc2", 3 C_ string("YYY"), string("YYY3abc2") );
173 TEST_ALGO( replace_head, "abc3abc2", -3 C_ string("YYY"), string("YYYbc2") );
174 TEST_ALGO( replace_head, "abc3abc2", 3 C_ "YYY", string("YYY3abc2") );
175 TEST_ALGO( replace_head, "abc", 3 C_ string("Z"), string("Z") );
176 TEST_ALGO( replace_head, "abc", 6 C_ string("XXXX"), string("XXXX") );
177 TEST_ALGO( replace_head, "abc", -6 C_ string("XXXX"), string("abc") );
178 TEST_ALGO( replace_head, "abc3abc2", 0 C_ string("XXXX"), string("abc3abc2") );
179 TEST_ALGO( replace_head, "", 4 C_ string("XXXX"), string("") );
180 TEST_ALGO( replace_head, "", -4 C_ string("XXXX"), string("") );
181 TEST_ALGO( erase_head, "abc3abc2", 3, string("3abc2") );
182 TEST_ALGO( erase_head, "abc3abc2", -3, string("bc2") );
183 TEST_ALGO( erase_head, "abc3abc2", 0, string("abc3abc2") );
184 TEST_ALGO( erase_head, "", 4, string("") );
185 TEST_ALGO( erase_head, "", -4, string("") );
186}
187
188void replace_tail_test()
189{
190 // replace tail
191 TEST_ALGO( replace_tail, "abc3abc", 3 C_ string("YYY"), string("abc3YYY") );
192 TEST_ALGO( replace_tail, "abc3abc", -3 C_ "YYY", string("abcYYY") );
193 TEST_ALGO( replace_tail, "abc", 3 C_ string("Z"), string("Z") );
194 TEST_ALGO( replace_tail, "abc", 6 C_ string("XXXX"), string("XXXX") );
195 TEST_ALGO( replace_tail, "abc", -6 C_ string("XXXX"), string("abc") );
196 TEST_ALGO( replace_tail, "abc3abc", 0 C_ string("XXXX"), string("abc3abc") );
197 TEST_ALGO( replace_tail, "", 4 C_ string("XXXX"), string("") );
198 TEST_ALGO( replace_tail, "", -4 C_ string("XXXX"), string("") );
199 TEST_ALGO( erase_tail, "abc3abc", 3, string("abc3") );
200 TEST_ALGO( erase_tail, "abc3abc", -3, string("abc") );
201 TEST_ALGO( erase_tail, "abc3abc", 0, string("abc3abc") );
202 TEST_ALGO( erase_tail, "", 4, string("") );
203 TEST_ALGO( erase_tail, "", -4, string("") );
204}
205
206void replace_range_test()
207{
208 // replace_range
209 {
210 BOOST_TEST_CHECKPOINT( "replace_range" );
211
212 string str1("1abc3abc2");
213 BOOST_CHECK(
214 replace_range_copy(
215 str1,
216 make_iterator_range(str1.begin()+1, str1.begin()+4),
217 string("XXX") )==string("1XXX3abc2") );
218
219 string strout;
220 replace_range_copy(
221 Output: back_inserter( x&: strout ),
222 Input: str1,
223 SearchRange: make_iterator_range(Begin: str1.begin()+1, End: str1.begin()+4),
224 Format: string("XXX") );
225 BOOST_CHECK( strout==string("1XXX3abc2") );
226
227 replace_range(
228 Input&: str1,
229 SearchRange: make_iterator_range(Begin: str1.begin()+1, End: str1.begin()+4),
230 Format: string("XXX") );
231 BOOST_CHECK( str1==string("1XXX3abc2") );
232 }
233 // erase_range
234 {
235 BOOST_TEST_CHECKPOINT( "erase_range" );
236
237 string str1("1abc3abc2");
238 BOOST_CHECK(
239 erase_range_copy(
240 str1,
241 make_iterator_range(str1.begin()+1, str1.begin()+4))==string("13abc2") );
242
243 string strout;
244 erase_range_copy(
245 Output: back_inserter( x&: strout ),
246 Input: str1,
247 SearchRange: make_iterator_range(Begin: str1.begin()+1, End: str1.begin()+4));
248 BOOST_CHECK( strout==string("13abc2") );
249
250 erase_range(
251 Input&: str1,
252 SearchRange: make_iterator_range(Begin: str1.begin()+1, End: str1.begin()+4));
253 BOOST_CHECK( str1==string("13abc2") );
254 }
255}
256
257void collection_comp_test()
258{
259 // container traits compatibility tests
260 {
261 string strout;
262 replace_first_copy( Output: back_inserter(x&: strout), Input: "1abc3abc2", Search: "abc", Format: "YYY" );
263 BOOST_CHECK( strout==string("1YYY3abc2") );
264 }
265 {
266 string strout;
267 replace_last_copy( Output: back_inserter(x&: strout), Input: "1abc3abc2", Search: "abc", Format: "YYY" );
268 BOOST_CHECK( strout==string("1abc3YYY2") );
269 }
270 {
271 string strout;
272 replace_all_copy( Output: back_inserter(x&: strout), Input: "1abc3abc2", Search: "abc", Format: "YYY" );
273 BOOST_CHECK( strout==string("1YYY3YYY2") );
274 }
275 {
276 string strout;
277 replace_nth_copy( Output: back_inserter(x&: strout), Input: "1abc3abc2", Search: "abc", Nth: 1, Format: "YYY" );
278 BOOST_CHECK( strout==string("1abc3YYY2") );
279 }
280 {
281 string strout;
282 replace_head_copy( Output: back_inserter(x&: strout), Input: "abc3abc2", N: 3 , Format: "YYY" );
283 BOOST_CHECK( strout==string("YYY3abc2") );
284 }
285 {
286 string strout;
287 replace_tail_copy( Output: back_inserter(x&: strout), Input: "abc3abc", N: 3 , Format: "YYY" );
288 BOOST_CHECK( strout==string("abc3YYY") );
289 }
290}
291
292void dissect_format_test()
293{
294 BOOST_CHECK(
295 find_format_all_copy(
296 string("aBc123Abc"),
297 first_finder("abc", is_iequal()),
298 dissect_formatter(token_finder(is_upper())))=="B123A");
299
300
301 BOOST_CHECK(
302 find_format_all_copy(
303 string("abc 123 abc"),
304 token_finder(is_space(), token_compress_on),
305 dissect_formatter(head_finder(1)))=="abc 123 abc");
306
307}
308
309BOOST_AUTO_TEST_CASE( test_main )
310{
311 sequence_traits_test();
312 replace_first_test();
313 replace_last_test();
314 replace_all_test();
315 replace_nth_test();
316 replace_head_test();
317 replace_tail_test();
318 replace_range_test();
319 collection_comp_test();
320 dissect_format_test();
321}
322

source code of boost/libs/algorithm/string/test/replace_test.cpp