tst.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. /*=============================================================================
  2. Copyright (c) 2001-2010 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. =============================================================================*/
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/spirit/home/qi/string/tst.hpp>
  8. #include <boost/spirit/home/qi/string/tst_map.hpp>
  9. #include <string>
  10. #include <cctype>
  11. #include <iostream>
  12. namespace
  13. {
  14. template <typename TST, typename Char>
  15. void add(TST& tst, Char const* s, int data)
  16. {
  17. Char const* last = s;
  18. while (*last)
  19. last++;
  20. tst.add(s, last, data);
  21. }
  22. template <typename TST, typename Char>
  23. void remove(TST& tst, Char const* s)
  24. {
  25. Char const* last = s;
  26. while (*last)
  27. last++;
  28. tst.remove(s, last);
  29. }
  30. template <typename TST, typename Char>
  31. void docheck(TST const& tst, Char const* s, bool expected, int N = 0, int val = -1)
  32. {
  33. Char const* first = s;
  34. Char const* last = s;
  35. while (*last)
  36. last++;
  37. int* r = tst.find(s, last);
  38. BOOST_TEST((r != 0) == expected);
  39. BOOST_TEST((s-first) == N);
  40. if (r)
  41. BOOST_TEST(*r == val);
  42. }
  43. struct printer
  44. {
  45. template <typename String, typename Data>
  46. void operator()(String const& s, Data const& data)
  47. {
  48. std::cout << " " << s << ": " << data << std::endl;
  49. }
  50. };
  51. template <typename TST>
  52. void print(TST const& tst)
  53. {
  54. std::cout << '[' << std::endl;
  55. tst.for_each(printer());
  56. std::cout << ']' << std::endl;
  57. }
  58. struct no_case_filter
  59. {
  60. template <typename Char>
  61. Char operator()(Char ch) const
  62. {
  63. return static_cast<Char>(std::tolower(ch));
  64. }
  65. };
  66. template <typename TST, typename Char>
  67. void nc_check(TST const& tst, Char const* s, bool expected, int N = 0, int val = -1)
  68. {
  69. Char const* first = s;
  70. Char const* last = s;
  71. while (*last)
  72. last++;
  73. int* r = tst.find(s, last, no_case_filter());
  74. BOOST_TEST((r != 0) == expected);
  75. if (r != 0)
  76. BOOST_TEST((s-first) == N);
  77. if (r)
  78. BOOST_TEST(*r == val);
  79. }
  80. }
  81. template <typename Lookup, typename WideLookup>
  82. void tests()
  83. {
  84. { // basic tests
  85. Lookup lookup;
  86. docheck(lookup, "not-yet-there", false);
  87. docheck(lookup, "", false);
  88. add(lookup, "apple", 123);
  89. docheck(lookup, "apple", true, 5, 123); // full match
  90. docheck(lookup, "banana", false); // no-match
  91. docheck(lookup, "applexxx", true, 5, 123); // partial match
  92. add(lookup, "applepie", 456);
  93. docheck(lookup, "applepie", true, 8, 456); // full match
  94. docheck(lookup, "banana", false); // no-match
  95. docheck(lookup, "applepiexxx", true, 8, 456); // partial match
  96. docheck(lookup, "apple", true, 5, 123); // full match
  97. docheck(lookup, "applexxx", true, 5, 123); // partial match
  98. docheck(lookup, "adam", false); // no-match
  99. add(lookup, "a", 101);
  100. docheck(lookup, "applepie", true, 8, 456); // full match
  101. docheck(lookup, "banana", false); // no-match
  102. docheck(lookup, "applepiexxx", true, 8, 456); // partial match
  103. docheck(lookup, "apple", true, 5, 123); // full match
  104. docheck(lookup, "applexxx", true, 5, 123); // partial match
  105. docheck(lookup, "adam", true, 1, 101); // partial match
  106. }
  107. { // variation of above
  108. Lookup lookup;
  109. add(lookup, "applepie", 456);
  110. add(lookup, "apple", 123);
  111. docheck(lookup, "applepie", true, 8, 456); // full match
  112. docheck(lookup, "banana", false); // no-match
  113. docheck(lookup, "applepiexxx", true, 8, 456); // partial match
  114. docheck(lookup, "apple", true, 5, 123); // full match
  115. docheck(lookup, "applexxx", true, 5, 123); // partial match
  116. }
  117. { // variation of above
  118. Lookup lookup;
  119. add(lookup, "applepie", 456);
  120. add(lookup, "apple", 123);
  121. docheck(lookup, "applepie", true, 8, 456); // full match
  122. docheck(lookup, "banana", false); // no-match
  123. docheck(lookup, "applepiexxx", true, 8, 456); // partial match
  124. docheck(lookup, "apple", true, 5, 123); // full match
  125. docheck(lookup, "applexxx", true, 5, 123); // partial match
  126. }
  127. { // narrow char tests
  128. Lookup lookup;
  129. add(lookup, "pineapple", 1);
  130. add(lookup, "orange", 2);
  131. add(lookup, "banana", 3);
  132. add(lookup, "applepie", 4);
  133. add(lookup, "apple", 5);
  134. docheck(lookup, "pineapple", true, 9, 1);
  135. docheck(lookup, "orange", true, 6, 2);
  136. docheck(lookup, "banana", true, 6, 3);
  137. docheck(lookup, "apple", true, 5, 5);
  138. docheck(lookup, "pizza", false);
  139. docheck(lookup, "steak", false);
  140. docheck(lookup, "applepie", true, 8, 4);
  141. docheck(lookup, "bananarama", true, 6, 3);
  142. docheck(lookup, "applet", true, 5, 5);
  143. docheck(lookup, "applepi", true, 5, 5);
  144. docheck(lookup, "appl", false);
  145. docheck(lookup, "pineapplez", true, 9, 1);
  146. docheck(lookup, "orangez", true, 6, 2);
  147. docheck(lookup, "bananaz", true, 6, 3);
  148. docheck(lookup, "applez", true, 5, 5);
  149. docheck(lookup, "pizzaz", false);
  150. docheck(lookup, "steakz", false);
  151. docheck(lookup, "applepiez", true, 8, 4);
  152. docheck(lookup, "bananaramaz", true, 6, 3);
  153. docheck(lookup, "appletz", true, 5, 5);
  154. docheck(lookup, "applepix", true, 5, 5);
  155. }
  156. { // wide char tests
  157. WideLookup lookup;
  158. add(lookup, L"pineapple", 1);
  159. add(lookup, L"orange", 2);
  160. add(lookup, L"banana", 3);
  161. add(lookup, L"applepie", 4);
  162. add(lookup, L"apple", 5);
  163. docheck(lookup, L"pineapple", true, 9, 1);
  164. docheck(lookup, L"orange", true, 6, 2);
  165. docheck(lookup, L"banana", true, 6, 3);
  166. docheck(lookup, L"apple", true, 5, 5);
  167. docheck(lookup, L"pizza", false);
  168. docheck(lookup, L"steak", false);
  169. docheck(lookup, L"applepie", true, 8, 4);
  170. docheck(lookup, L"bananarama", true, 6, 3);
  171. docheck(lookup, L"applet", true, 5, 5);
  172. docheck(lookup, L"applepi", true, 5, 5);
  173. docheck(lookup, L"appl", false);
  174. docheck(lookup, L"pineapplez", true, 9, 1);
  175. docheck(lookup, L"orangez", true, 6, 2);
  176. docheck(lookup, L"bananaz", true, 6, 3);
  177. docheck(lookup, L"applez", true, 5, 5);
  178. docheck(lookup, L"pizzaz", false);
  179. docheck(lookup, L"steakz", false);
  180. docheck(lookup, L"applepiez", true, 8, 4);
  181. docheck(lookup, L"bananaramaz", true, 6, 3);
  182. docheck(lookup, L"appletz", true, 5, 5);
  183. docheck(lookup, L"applepix", true, 5, 5);
  184. }
  185. { // test remove
  186. Lookup lookup;
  187. add(lookup, "pineapple", 1);
  188. add(lookup, "orange", 2);
  189. add(lookup, "banana", 3);
  190. add(lookup, "applepie", 4);
  191. add(lookup, "apple", 5);
  192. docheck(lookup, "pineapple", true, 9, 1);
  193. docheck(lookup, "orange", true, 6, 2);
  194. docheck(lookup, "banana", true, 6, 3);
  195. docheck(lookup, "apple", true, 5, 5);
  196. docheck(lookup, "applepie", true, 8, 4);
  197. docheck(lookup, "bananarama", true, 6, 3);
  198. docheck(lookup, "applet", true, 5, 5);
  199. docheck(lookup, "applepi", true, 5, 5);
  200. docheck(lookup, "appl", false);
  201. remove(lookup, "banana");
  202. docheck(lookup, "pineapple", true, 9, 1);
  203. docheck(lookup, "orange", true, 6, 2);
  204. docheck(lookup, "banana", false);
  205. docheck(lookup, "apple", true, 5, 5);
  206. docheck(lookup, "applepie", true, 8, 4);
  207. docheck(lookup, "bananarama", false);
  208. docheck(lookup, "applet", true, 5, 5);
  209. docheck(lookup, "applepi", true, 5, 5);
  210. docheck(lookup, "appl", false);
  211. remove(lookup, "apple");
  212. docheck(lookup, "pineapple", true, 9, 1);
  213. docheck(lookup, "orange", true, 6, 2);
  214. docheck(lookup, "apple", false);
  215. docheck(lookup, "applepie", true, 8, 4);
  216. docheck(lookup, "applet", false);
  217. docheck(lookup, "applepi", false);
  218. docheck(lookup, "appl", false);
  219. remove(lookup, "orange");
  220. docheck(lookup, "pineapple", true, 9, 1);
  221. docheck(lookup, "orange", false);
  222. docheck(lookup, "applepie", true, 8, 4);
  223. remove(lookup, "pineapple");
  224. docheck(lookup, "pineapple", false);
  225. docheck(lookup, "orange", false);
  226. docheck(lookup, "applepie", true, 8, 4);
  227. remove(lookup, "applepie");
  228. docheck(lookup, "applepie", false);
  229. }
  230. { // copy/assign/clear test
  231. Lookup lookupa;
  232. add(lookupa, "pineapple", 1);
  233. add(lookupa, "orange", 2);
  234. add(lookupa, "banana", 3);
  235. add(lookupa, "applepie", 4);
  236. add(lookupa, "apple", 5);
  237. Lookup lookupb(lookupa); // copy ctor
  238. docheck(lookupb, "pineapple", true, 9, 1);
  239. docheck(lookupb, "orange", true, 6, 2);
  240. docheck(lookupb, "banana", true, 6, 3);
  241. docheck(lookupb, "apple", true, 5, 5);
  242. docheck(lookupb, "pizza", false);
  243. docheck(lookupb, "steak", false);
  244. docheck(lookupb, "applepie", true, 8, 4);
  245. docheck(lookupb, "bananarama", true, 6, 3);
  246. docheck(lookupb, "applet", true, 5, 5);
  247. docheck(lookupb, "applepi", true, 5, 5);
  248. docheck(lookupb, "appl", false);
  249. lookupb.clear(); // clear
  250. docheck(lookupb, "pineapple", false);
  251. docheck(lookupb, "orange", false);
  252. docheck(lookupb, "banana", false);
  253. docheck(lookupb, "apple", false);
  254. docheck(lookupb, "applepie", false);
  255. docheck(lookupb, "bananarama", false);
  256. docheck(lookupb, "applet", false);
  257. docheck(lookupb, "applepi", false);
  258. docheck(lookupb, "appl", false);
  259. lookupb = lookupa; // assign
  260. docheck(lookupb, "pineapple", true, 9, 1);
  261. docheck(lookupb, "orange", true, 6, 2);
  262. docheck(lookupb, "banana", true, 6, 3);
  263. docheck(lookupb, "apple", true, 5, 5);
  264. docheck(lookupb, "pizza", false);
  265. docheck(lookupb, "steak", false);
  266. docheck(lookupb, "applepie", true, 8, 4);
  267. docheck(lookupb, "bananarama", true, 6, 3);
  268. docheck(lookupb, "applet", true, 5, 5);
  269. docheck(lookupb, "applepi", true, 5, 5);
  270. docheck(lookupb, "appl", false);
  271. }
  272. { // test for_each
  273. Lookup lookup;
  274. add(lookup, "pineapple", 1);
  275. add(lookup, "orange", 2);
  276. add(lookup, "banana", 3);
  277. add(lookup, "applepie", 4);
  278. add(lookup, "apple", 5);
  279. print(lookup);
  280. }
  281. { // case insensitive tests
  282. Lookup lookup;
  283. // NOTE: make sure all entries are in lower-case!!!
  284. add(lookup, "pineapple", 1);
  285. add(lookup, "orange", 2);
  286. add(lookup, "banana", 3);
  287. add(lookup, "applepie", 4);
  288. add(lookup, "apple", 5);
  289. nc_check(lookup, "pineapple", true, 9, 1);
  290. nc_check(lookup, "orange", true, 6, 2);
  291. nc_check(lookup, "banana", true, 6, 3);
  292. nc_check(lookup, "apple", true, 5, 5);
  293. nc_check(lookup, "applepie", true, 8, 4);
  294. nc_check(lookup, "PINEAPPLE", true, 9, 1);
  295. nc_check(lookup, "ORANGE", true, 6, 2);
  296. nc_check(lookup, "BANANA", true, 6, 3);
  297. nc_check(lookup, "APPLE", true, 5, 5);
  298. nc_check(lookup, "APPLEPIE", true, 8, 4);
  299. nc_check(lookup, "pineApple", true, 9, 1);
  300. nc_check(lookup, "orangE", true, 6, 2);
  301. nc_check(lookup, "Banana", true, 6, 3);
  302. nc_check(lookup, "aPPLe", true, 5, 5);
  303. nc_check(lookup, "ApplePie", true, 8, 4);
  304. print(lookup);
  305. }
  306. }
  307. int main()
  308. {
  309. using boost::spirit::qi::tst;
  310. using boost::spirit::qi::tst_map;
  311. tests<tst<char, int>, tst<wchar_t, int> >();
  312. tests<tst_map<char, int>, tst_map<wchar_t, int> >();
  313. return boost::report_errors();
  314. }