trim.cpp 5.3 KB

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