• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/find.hpp>
11 #include <boost/algorithm/string/classification.hpp>
12 #include <boost/algorithm/string/split.hpp>
13 
14 // Include unit test framework
15 #define BOOST_TEST_MAIN
16 #include <boost/test/unit_test.hpp>
17 
18 #include <string>
19 #include <vector>
20 #include <iostream>
21 #include <iterator>
22 #include <sstream>
23 #include <boost/test/test_tools.hpp>
24 
25 using namespace std;
26 using namespace boost;
27 
find_test()28 void find_test()
29 {
30     string str1("123abcxXxabcXxXabc321");
31     string str2("abc");
32     string str3("");
33     const char* pch1="123abcxxxabcXXXabc321";
34     vector<int> vec1( str1.begin(), str1.end() );
35 
36     // find results ------------------------------------------------------------//
37     iterator_range<string::iterator> nc_result;
38     iterator_range<string::const_iterator> cv_result;
39 
40     iterator_range<vector<int>::iterator> nc_vresult;
41     iterator_range<vector<int>::const_iterator> cv_vresult;
42 
43     iterator_range<const char*> ch_result;
44 
45     // basic tests ------------------------------------------------------------//
46 
47 
48     // find_first
49     BOOST_TEST_CHECKPOINT( "find_first" );
50 
51     nc_result=find_first( str1, string("abc") );
52     BOOST_CHECK(
53         ( (nc_result.begin()-str1.begin()) == 3) &&
54         ( (nc_result.end()-str1.begin()) == 6) );
55 
56     cv_result=find_first( const_cast<const string&>(str1), str2 );
57     BOOST_CHECK(
58         ( (cv_result.begin()-str1.begin()) == 3) &&
59         ( (cv_result.end()-str1.begin()) == 6) );
60 
61     cv_result=ifind_first( const_cast<const string&>(str1), "xXX" );
62     BOOST_CHECK(
63         ( (cv_result.begin()-str1.begin()) == 6) &&
64         ( (cv_result.end()-str1.begin()) == 9) );
65 
66     ch_result=find_first( pch1, "abc" );
67     BOOST_CHECK(( (ch_result.begin() - pch1 ) == 3) && ( (ch_result.end() - pch1 ) == 6 ) );
68 
69     // find_last
70     BOOST_TEST_CHECKPOINT( "find_last" );
71 
72     nc_result=find_last( str1, string("abc") );
73     BOOST_CHECK(
74         ( (nc_result.begin()-str1.begin()) == 15) &&
75         ( (nc_result.end()-str1.begin()) == 18) );
76 
77     cv_result=find_last( const_cast<const string&>(str1), str2 );
78     BOOST_CHECK(
79         ( (cv_result.begin()-str1.begin()) == 15) &&
80         ( (cv_result.end()-str1.begin()) == 18) );
81 
82     cv_result=ifind_last( const_cast<const string&>(str1), "XXx" );
83     BOOST_CHECK(
84         ( (cv_result.begin()-str1.begin()) == 12) &&
85         ( (cv_result.end()-str1.begin()) == 15) );
86 
87     ch_result=find_last( pch1, "abc" );
88     BOOST_CHECK(( (ch_result.begin() - pch1 ) == 15) && ( (ch_result.end() - pch1 ) == 18 ) );
89 
90     // find_nth
91     BOOST_TEST_CHECKPOINT( "find_nth" );
92 
93     nc_result=find_nth( str1, string("abc"), 1 );
94     BOOST_CHECK(
95         ( (nc_result.begin()-str1.begin()) == 9) &&
96         ( (nc_result.end()-str1.begin()) == 12) );
97 
98     nc_result=find_nth( str1, string("abc"), -1 );
99     BOOST_CHECK(
100         ( (nc_result.begin()-str1.begin()) == 15) &&
101         ( (nc_result.end()-str1.begin()) == 18) );
102 
103 
104     cv_result=find_nth( const_cast<const string&>(str1), str2, 1 );
105     BOOST_CHECK(
106         ( (cv_result.begin()-str1.begin()) == 9) &&
107         ( (cv_result.end()-str1.begin()) == 12) );
108 
109     cv_result=find_nth( const_cast<const string&>(str1), str2, -1 );
110     BOOST_CHECK(
111         ( (cv_result.begin()-str1.begin()) == 15) &&
112         ( (cv_result.end()-str1.begin()) == 18) );
113 
114     cv_result=ifind_nth( const_cast<const string&>(str1), "xxx", 1 );
115     BOOST_CHECK(
116         ( (cv_result.begin()-str1.begin()) == 12) &&
117         ( (cv_result.end()-str1.begin()) == 15) );
118 
119     cv_result=ifind_nth( const_cast<const string&>(str1), "xxx", 1 );
120     BOOST_CHECK(
121         ( (cv_result.begin()-str1.begin()) == 12) &&
122         ( (cv_result.end()-str1.begin()) == 15) );
123 
124 
125     ch_result=find_nth( pch1, "abc", 1 );
126     BOOST_CHECK(( (ch_result.begin() - pch1 ) == 9) && ( (ch_result.end() - pch1 ) == 12 ) );
127 
128     // find_head
129     BOOST_TEST_CHECKPOINT( "find_head" );
130 
131     nc_result=find_head( str1, 6 );
132     BOOST_CHECK(
133         ( (nc_result.begin()-str1.begin()) == 0) &&
134         ( (nc_result.end()-str1.begin()) == 6) );
135 
136     nc_result=find_head( str1, -6 );
137     BOOST_CHECK(
138         ( (nc_result.begin()-str1.begin()) == 0) &&
139         ( (str1.end()-nc_result.end()) == 6 ) );
140 
141     cv_result=find_head( const_cast<const string&>(str1), 6 );
142     BOOST_CHECK(
143         ( (cv_result.begin()-str1.begin()) == 0) &&
144         ( (cv_result.end()-str1.begin()) == 6) );
145 
146     ch_result=find_head( pch1, 6 );
147     BOOST_CHECK( ( (ch_result.begin() - pch1 ) == 0 ) && ( (ch_result.end() - pch1 ) == 6 ) );
148 
149     // find_tail
150     BOOST_TEST_CHECKPOINT( "find_tail" );
151 
152     nc_result=find_tail( str1, 6 );
153     BOOST_CHECK(
154         ( (nc_result.begin()-str1.begin()) == 15) &&
155         ( (nc_result.end()-str1.begin()) == 21) );
156 
157     nc_result=find_tail( str1, -6 );
158     BOOST_CHECK(
159         ( (nc_result.begin()-str1.begin()) == 6) &&
160         ( (nc_result.end()-str1.begin()) == 21) );
161 
162 
163     cv_result=find_tail( const_cast<const string&>(str1), 6 );
164     BOOST_CHECK(
165         ( (cv_result.begin()-str1.begin()) == 15) &&
166         ( (cv_result.end()-str1.begin()) == 21) );
167 
168     ch_result=find_tail( pch1, 6 );
169     BOOST_CHECK( ( (ch_result.begin() - pch1 ) == 15 ) && ( (ch_result.end() - pch1 ) == 21 ) );
170 
171     // find_token
172     BOOST_TEST_CHECKPOINT( "find_token" );
173 
174     nc_result=find_token( str1, is_any_of("abc"), token_compress_on );
175     BOOST_CHECK(
176         ( (nc_result.begin()-str1.begin()) == 3) &&
177         ( (nc_result.end()-str1.begin()) == 6) );
178 
179     cv_result=find_token( const_cast<const string&>(str1), is_any_of("abc"), token_compress_on );
180     BOOST_CHECK(
181         ( (cv_result.begin()-str1.begin()) == 3) &&
182         ( (cv_result.end()-str1.begin()) == 6) );
183 
184     string s1("abc def ghi jkl");
185     find_iterator<string::iterator> fEnd;
186 
187     find_iterator<string::iterator> fxIt = make_find_iterator(s1,
188             token_finder(is_alnum(), token_compress_on));
189     BOOST_CHECK((fxIt != fEnd) && (*fxIt == string("abc")));
190     ++fxIt;
191     BOOST_CHECK((fxIt != fEnd) && (*fxIt == string("def")));
192     ++fxIt;
193     BOOST_CHECK((fxIt != fEnd) && (*fxIt == string("ghi")));
194     ++fxIt;
195     BOOST_CHECK((fxIt != fEnd) && (*fxIt == string("jkl")));
196     ++fxIt;
197     BOOST_CHECK(fxIt == fEnd);
198 
199     nc_result=find_token( str1, is_any_of("abc"), token_compress_off );
200     BOOST_CHECK(
201         ( (nc_result.begin()-str1.begin()) == 3) &&
202         ( (nc_result.end()-str1.begin()) == 4) );
203 
204     cv_result=find_token( const_cast<const string&>(str1), is_any_of("abc"), token_compress_off );
205     BOOST_CHECK(
206         ( (cv_result.begin()-str1.begin()) == 3) &&
207         ( (cv_result.end()-str1.begin()) == 4) );
208 
209     ch_result=find_token( pch1, is_any_of("abc"), token_compress_off );
210     BOOST_CHECK( ( (ch_result.begin() - pch1 ) == 3 ) && ( (ch_result.end() - pch1 ) == 4 ) );
211 
212     // generic find
213     BOOST_TEST_CHECKPOINT( "generic find" );
214 
215     nc_result=find(str1, first_finder(string("abc")));
216     BOOST_CHECK(
217         ( (nc_result.begin()-str1.begin()) == 3) &&
218         ( (nc_result.end()-str1.begin()) == 6) );
219 
220     cv_result=find(const_cast<const string&>(str1), first_finder(str2) );
221     BOOST_CHECK(
222         ( (cv_result.begin()-str1.begin()) == 3) &&
223         ( (cv_result.end()-str1.begin()) == 6) );
224 
225     // multi-type comparison test
226     BOOST_TEST_CHECKPOINT( "multi-type" );
227 
228     nc_vresult=find_first( vec1, string("abc") );
229     BOOST_CHECK(
230         ( (nc_result.begin()-str1.begin()) == 3) &&
231         ( (nc_result.end()-str1.begin()) == 6) );
232 
233     cv_vresult=find_first( const_cast<const vector<int>&>(vec1), str2 );
234     BOOST_CHECK(
235         ( (cv_result.begin()-str1.begin()) == 3) &&
236         ( (cv_result.end()-str1.begin()) == 6) );
237 
238     // overflow test
239     BOOST_TEST_CHECKPOINT( "overflow" );
240 
241     nc_result=find_first( str2, string("abcd") );
242     BOOST_CHECK( nc_result.begin()==nc_result.end() );
243     cv_result=find_first( const_cast<const string&>(str2), string("abcd") );
244     BOOST_CHECK( cv_result.begin()==cv_result.end() );
245 
246     cv_result=find_head( const_cast<const string&>(str2), 4 );
247     BOOST_CHECK( string( cv_result.begin(), cv_result.end() )== string("abc") );
248     cv_result=find_tail( const_cast<const string&>(str2), 4 );
249     BOOST_CHECK( string( cv_result.begin(), cv_result.end() )== string("abc") );
250 
251     // Empty string test
252     BOOST_TEST_CHECKPOINT( "empty" );
253 
254     nc_result=find_first( str3, string("abcd") );
255     BOOST_CHECK( nc_result.begin()==nc_result.end() );
256     nc_result=find_first( str1, string("") );
257     BOOST_CHECK( nc_result.begin()==nc_result.end() );
258 
259     cv_result=find_first( const_cast<const string&>(str3), string("abcd") );
260     BOOST_CHECK( cv_result.begin()==cv_result.end() );
261     cv_result=find_first( const_cast<const string&>(str1), string("") );
262     BOOST_CHECK( cv_result.begin()==cv_result.end() );
263 
264     // iterator_range specific tests
265     ostringstream osstr;
266     osstr << find_first( str1, "abc" );
267     BOOST_CHECK( osstr.str()=="abc" );
268 
269 }
270 
271 // test main
BOOST_AUTO_TEST_CASE(test_main)272 BOOST_AUTO_TEST_CASE( test_main )
273 {
274     find_test();
275 }
276