trim.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include<__vic/string_utils.h>
  2. #include<cassert>
  3. #include<iostream>
  4. #include<exception>
  5. #include<cstring>
  6. #include<cctype>
  7. namespace tests {
  8. using namespace __vic;
  9. char last(const char *st)
  10. {
  11. assert(st && *st != '\0');
  12. return *(std::strchr(st, '\0') - 1);
  13. }
  14. char last(
  15. #if __cpp_lib_string_view
  16. std::string_view
  17. #else
  18. const std::string &
  19. #endif
  20. st)
  21. {
  22. assert(!st.empty());
  23. return *(st.end() - 1);
  24. }
  25. /*char last(const string_ref &st)
  26. {
  27. assert(!st.empty());
  28. return *(st.end() - 1);
  29. }*/
  30. bool not_in_set(char ch, const char *set)
  31. {
  32. assert(set);
  33. return !std::strchr(set, ch);
  34. }
  35. // Test internal utilities
  36. void test_utils()
  37. {
  38. assert(last("123") == '3');
  39. assert(last(std::string("123")) == '3');
  40. //assert(last(string_ref("123")) == '3');
  41. assert(not_in_set('z', "abc"));
  42. assert(!not_in_set('a', "abc") && !not_in_set('b', "abc") && !not_in_set('c', "abc"));
  43. }
  44. void trim_default_test(const char *src)
  45. {
  46. assert(src);
  47. std::cout << "Default trim. Source: |" << src << "|\n";
  48. char st[32];
  49. assert(std::strlen(src) < sizeof st);
  50. std::strcpy(st, src);
  51. std::cout << trim(st) << "|\n";
  52. assert(!std::isspace(*st) && !std::isspace(last(st)));
  53. std::strcpy(st, src);
  54. std::cout << trim_front(st) << "|\n";
  55. assert(!std::isspace(*st));
  56. std::strcpy(st, src);
  57. std::cout << trim_back(st) << "|\n";
  58. assert(!std::isspace(last(st)));
  59. std::string sst;
  60. sst = src;
  61. std::cout << trim(sst) << "|\n";
  62. assert(!std::isspace(*sst.begin()) && !std::isspace(last(sst)));
  63. sst = src;
  64. std::cout << trim_front(sst) << "|\n";
  65. assert(!std::isspace(*sst.begin()));
  66. sst = src;
  67. std::cout << trim_back(sst) << "|\n";
  68. assert(!std::isspace(last(sst)));
  69. }
  70. void trim_char_test(const char *src, char ch)
  71. {
  72. assert(src);
  73. std::cout << "Trim char. Source: |" << src << "|\n";
  74. char st[32];
  75. assert(std::strlen(src) < sizeof st);
  76. std::strcpy(st, src);
  77. std::cout << trim(st, ch) << "|\n";
  78. assert(*st != ch && last(st) != ch);
  79. std::strcpy(st, src);
  80. std::cout << trim_front(st, ch) << "|\n";
  81. assert(*st != ch);
  82. std::strcpy(st, src);
  83. std::cout << trim_back(st, ch) << "|\n";
  84. assert(last(st) != ch);
  85. std::string sst;
  86. sst = src;
  87. std::cout << trim(sst, ch) << "|\n";
  88. assert(*sst.begin() != ch && last(sst) != ch);
  89. sst = src;
  90. std::cout << trim_front(sst, ch) << "|\n";
  91. assert(*sst.begin() != ch);
  92. sst = src;
  93. std::cout << trim_back(sst, ch) << "|\n";
  94. assert(last(sst) != ch);
  95. }
  96. void trim_set_test(const char *src, const char *set)
  97. {
  98. assert(src);
  99. std::cout << "Trim set. Source: |" << src << "|\n";
  100. char st[32];
  101. assert(std::strlen(src) < sizeof st);
  102. std::strcpy(st, src);
  103. std::cout << trim(st, set) << "|\n";
  104. assert(not_in_set(*st, set) && not_in_set(last(st), set));
  105. std::strcpy(st, src);
  106. std::cout << trim_front(st, set) << "|\n";
  107. assert(not_in_set(*st, set));
  108. std::strcpy(st, src);
  109. std::cout << trim_back(st, set) << "|\n";
  110. assert(not_in_set(last(st), set));
  111. std::string sst;
  112. sst = src;
  113. std::cout << trim(sst, set) << "|\n";
  114. assert(not_in_set(*sst.begin(), set) && not_in_set(last(sst), set));
  115. sst = src;
  116. std::cout << trim_front(sst, set) << "|\n";
  117. assert(not_in_set(*sst.begin(), set));
  118. sst = src;
  119. std::cout << trim_back(sst, set) << "|\n";
  120. assert(not_in_set(last(sst), set));
  121. }
  122. void trimmed_default_test(const char *src)
  123. {
  124. assert(src);
  125. std::cout << "Default trimmed. Source: |" << src << "|\n";
  126. #if __cpp_lib_string_view
  127. std::string_view
  128. #else
  129. std::string
  130. #endif
  131. st;
  132. st = trimmed(src);
  133. assert(!std::isspace(*st.begin()) && !std::isspace(last(st)));
  134. std::cout << st << "|\n";
  135. st = trimmed_front(src);
  136. assert(!std::isspace(*st.begin()));
  137. std::cout << st << "|\n";
  138. st = trimmed_back(src);
  139. assert(!std::isspace(last(st)));
  140. std::cout << st << "|\n";
  141. }
  142. void trimmed_char_test(const char *src, char ch)
  143. {
  144. assert(src);
  145. std::cout << "Trimmed char. Source: |" << src << "|\n";
  146. #if __cpp_lib_string_view
  147. std::string_view
  148. #else
  149. std::string
  150. #endif
  151. st;
  152. st = trimmed(src, ch);
  153. assert(*st.begin() != ch && last(st) != ch);
  154. std::cout << st << "|\n";
  155. st = trimmed_front(src, ch);
  156. assert(*st.begin() != ch);
  157. std::cout << st << "|\n";
  158. st = trimmed_back(src, ch);
  159. assert(last(st) != ch);
  160. std::cout << st << "|\n";
  161. }
  162. void trimmed_set_test(const char *src, const char *set)
  163. {
  164. assert(src);
  165. std::cout << "Trimmed set. Source: |" << src << "|\n";
  166. #if __cpp_lib_string_view
  167. std::string_view
  168. #else
  169. std::string
  170. #endif
  171. st;
  172. st = trimmed(src, set);
  173. assert(not_in_set(*st.begin(), set) && not_in_set(last(st), set));
  174. std::cout << st << "|\n";
  175. st = trimmed_front(src, set);
  176. assert(not_in_set(*st.begin(), set));
  177. std::cout << st << "|\n";
  178. st = trimmed_back(src, set);
  179. assert(not_in_set(last(st), set));
  180. std::cout << st << "|\n";
  181. }
  182. void run()
  183. {
  184. test_utils();
  185. trim_default_test(" \tabc \t ");
  186. std::cout << std::endl;
  187. trim_char_test(" abc ", ' ');
  188. std::cout << std::endl;
  189. trim_set_test(" \tabc \t ", " \t\r\n\f");
  190. std::cout << std::endl;
  191. trimmed_default_test(" \tabc \t ");
  192. std::cout << std::endl;
  193. trimmed_char_test(" abc ", ' ');
  194. std::cout << std::endl;
  195. trimmed_set_test(" \tabc \t ", " \t\r\n\f");
  196. }
  197. } // namespace
  198. int main()
  199. {
  200. try
  201. {
  202. tests::run();
  203. return 0;
  204. }
  205. catch(const std::exception &ex)
  206. {
  207. std::cerr << ex.what() << '\n';
  208. }
  209. return 1;
  210. }