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 | |
32 | using namespace std; |
33 | using namespace boost; |
34 | |
35 | void 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 | |
90 | void 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 | |
107 | void 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 | |
123 | void 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 | |
140 | void 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 | |
169 | void 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 | |
188 | void 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 | |
206 | void 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 | |
257 | void 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 | |
292 | void 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 | |
309 | BOOST_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 | |