replace_test.cpp 13 KB

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