char_class.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*=============================================================================
  2. Copyright (c) 2001-2015 Joel de Guzman
  3. Copyright (c) 2001-2010 Hartmut Kaiser
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. =============================================================================*/
  7. #define BOOST_SPIRIT_X3_UNICODE
  8. #include <boost/detail/lightweight_test.hpp>
  9. #include <boost/spirit/home/x3.hpp>
  10. #include <boost/type_traits/is_same.hpp>
  11. #include <iostream>
  12. #include "test.hpp"
  13. int
  14. main()
  15. {
  16. using spirit_test::test;
  17. using spirit_test::test_failure;
  18. using spirit_test::test_attr;
  19. using boost::spirit::x3::unused_type;
  20. {
  21. using namespace boost::spirit::x3::ascii;
  22. BOOST_TEST(test("1", alnum));
  23. BOOST_TEST(!test(" ", alnum));
  24. BOOST_TEST(!test("1", alpha));
  25. BOOST_TEST(test("x", alpha));
  26. BOOST_TEST(test(" ", blank));
  27. BOOST_TEST(!test("x", blank));
  28. BOOST_TEST(test("1", digit));
  29. BOOST_TEST(!test("x", digit));
  30. BOOST_TEST(test("a", lower));
  31. BOOST_TEST(!test("A", lower));
  32. BOOST_TEST(test("!", punct));
  33. BOOST_TEST(!test("x", punct));
  34. BOOST_TEST(test(" ", space));
  35. BOOST_TEST(test("\n", space));
  36. BOOST_TEST(test("\r", space));
  37. BOOST_TEST(test("\t", space));
  38. BOOST_TEST(test("A", upper));
  39. BOOST_TEST(!test("a", upper));
  40. BOOST_TEST(test("A", xdigit));
  41. BOOST_TEST(test("0", xdigit));
  42. BOOST_TEST(test("f", xdigit));
  43. BOOST_TEST(!test("g", xdigit));
  44. }
  45. {
  46. using namespace boost::spirit::x3::ascii;
  47. BOOST_TEST(!test("1", ~alnum));
  48. BOOST_TEST(test(" ", ~alnum));
  49. BOOST_TEST(test("1", ~alpha));
  50. BOOST_TEST(!test("x", ~alpha));
  51. BOOST_TEST(!test(" ", ~blank));
  52. BOOST_TEST(test("x", ~blank));
  53. BOOST_TEST(!test("1", ~digit));
  54. BOOST_TEST(test("x", ~digit));
  55. BOOST_TEST(!test("a", ~lower));
  56. BOOST_TEST(test("A", ~lower));
  57. BOOST_TEST(!test("!", ~punct));
  58. BOOST_TEST(test("x", ~punct));
  59. BOOST_TEST(!test(" ", ~space));
  60. BOOST_TEST(!test("\n", ~space));
  61. BOOST_TEST(!test("\r", ~space));
  62. BOOST_TEST(!test("\t", ~space));
  63. BOOST_TEST(!test("A", ~upper));
  64. BOOST_TEST(test("a", ~upper));
  65. BOOST_TEST(!test("A", ~xdigit));
  66. BOOST_TEST(!test("0", ~xdigit));
  67. BOOST_TEST(!test("f", ~xdigit));
  68. BOOST_TEST(test("g", ~xdigit));
  69. }
  70. {
  71. using namespace boost::spirit::x3::iso8859_1;
  72. BOOST_TEST(test("1", alnum));
  73. BOOST_TEST(!test(" ", alnum));
  74. BOOST_TEST(!test("1", alpha));
  75. BOOST_TEST(test("x", alpha));
  76. BOOST_TEST(test(" ", blank));
  77. BOOST_TEST(!test("x", blank));
  78. BOOST_TEST(test("1", digit));
  79. BOOST_TEST(!test("x", digit));
  80. BOOST_TEST(test("a", lower));
  81. BOOST_TEST(!test("A", lower));
  82. BOOST_TEST(test("!", punct));
  83. BOOST_TEST(!test("x", punct));
  84. BOOST_TEST(test(" ", space));
  85. BOOST_TEST(test("\n", space));
  86. BOOST_TEST(test("\r", space));
  87. BOOST_TEST(test("\t", space));
  88. BOOST_TEST(test("A", upper));
  89. BOOST_TEST(!test("a", upper));
  90. BOOST_TEST(test("A", xdigit));
  91. BOOST_TEST(test("0", xdigit));
  92. BOOST_TEST(test("f", xdigit));
  93. BOOST_TEST(!test("g", xdigit));
  94. // test extended ASCII characters
  95. BOOST_TEST(test("\xE9", alpha));
  96. BOOST_TEST(test("\xE9", lower));
  97. BOOST_TEST(!test("\xE9", upper));
  98. }
  99. {
  100. using namespace boost::spirit::x3::standard;
  101. BOOST_TEST(test("1", alnum));
  102. BOOST_TEST(!test(" ", alnum));
  103. BOOST_TEST(!test("1", alpha));
  104. BOOST_TEST(test("x", alpha));
  105. BOOST_TEST(test(" ", blank));
  106. BOOST_TEST(!test("x", blank));
  107. BOOST_TEST(test("1", digit));
  108. BOOST_TEST(!test("x", digit));
  109. BOOST_TEST(test("a", lower));
  110. BOOST_TEST(!test("A", lower));
  111. BOOST_TEST(test("!", punct));
  112. BOOST_TEST(!test("x", punct));
  113. BOOST_TEST(test(" ", space));
  114. BOOST_TEST(test("\n", space));
  115. BOOST_TEST(test("\r", space));
  116. BOOST_TEST(test("\t", space));
  117. BOOST_TEST(test("A", upper));
  118. BOOST_TEST(!test("a", upper));
  119. BOOST_TEST(test("A", xdigit));
  120. BOOST_TEST(test("0", xdigit));
  121. BOOST_TEST(test("f", xdigit));
  122. BOOST_TEST(!test("g", xdigit));
  123. }
  124. {
  125. using namespace boost::spirit::x3::standard_wide;
  126. BOOST_TEST(test(L"1", alnum));
  127. BOOST_TEST(!test(L" ", alnum));
  128. BOOST_TEST(!test(L"1", alpha));
  129. BOOST_TEST(test(L"x", alpha));
  130. BOOST_TEST(test(L" ", blank));
  131. BOOST_TEST(!test(L"x", blank));
  132. BOOST_TEST(test(L"1", digit));
  133. BOOST_TEST(!test(L"x", digit));
  134. BOOST_TEST(test(L"a", lower));
  135. BOOST_TEST(!test(L"A", lower));
  136. BOOST_TEST(test(L"!", punct));
  137. BOOST_TEST(!test(L"x", punct));
  138. BOOST_TEST(test(L" ", space));
  139. BOOST_TEST(test(L"\n", space));
  140. BOOST_TEST(test(L"\r", space));
  141. BOOST_TEST(test(L"\t", space));
  142. BOOST_TEST(test(L"A", upper));
  143. BOOST_TEST(!test(L"a", upper));
  144. BOOST_TEST(test(L"A", xdigit));
  145. BOOST_TEST(test(L"0", xdigit));
  146. BOOST_TEST(test(L"f", xdigit));
  147. BOOST_TEST(!test(L"g", xdigit));
  148. }
  149. {
  150. using namespace boost::spirit::x3::unicode;
  151. BOOST_TEST(test(L"1", alnum));
  152. BOOST_TEST(!test(L" ", alnum));
  153. BOOST_TEST(!test(L"1", alpha));
  154. BOOST_TEST(test(L"x", alpha));
  155. BOOST_TEST(test(L" ", blank));
  156. BOOST_TEST(!test(L"x", blank));
  157. BOOST_TEST(test(L"1", digit));
  158. BOOST_TEST(!test(L"x", digit));
  159. BOOST_TEST(test(L"a", lower));
  160. BOOST_TEST(!test(L"A", lower));
  161. BOOST_TEST(test(L"!", punct));
  162. BOOST_TEST(!test(L"x", punct));
  163. BOOST_TEST(test(L" ", space));
  164. BOOST_TEST(test(L"\n", space));
  165. BOOST_TEST(test(L"\r", space));
  166. BOOST_TEST(test(L"\t", space));
  167. BOOST_TEST(test(L"A", upper));
  168. BOOST_TEST(!test(L"a", upper));
  169. BOOST_TEST(test(L"A", xdigit));
  170. BOOST_TEST(test(L"0", xdigit));
  171. BOOST_TEST(test(L"f", xdigit));
  172. BOOST_TEST(!test(L"g", xdigit));
  173. BOOST_TEST(test(L"A", alphabetic));
  174. BOOST_TEST(test(L"9", decimal_number));
  175. BOOST_TEST(test(L"\u2800", braille));
  176. BOOST_TEST(!test(L" ", braille));
  177. BOOST_TEST(test(L" ", ~braille));
  178. // $$$ TODO $$$ Add more unicode tests
  179. }
  180. { // test invalid unicode literals
  181. using namespace boost::spirit::x3::unicode;
  182. auto const invalid_unicode = char32_t{0x7FFFFFFF};
  183. auto const input = boost::u32string_view(&invalid_unicode, 1);
  184. BOOST_TEST(test_failure(input, char_));
  185. // force unicode category lookup
  186. // related issue: https://github.com/boostorg/spirit/issues/524
  187. BOOST_TEST(test_failure(input, alpha));
  188. BOOST_TEST(test_failure(input, upper));
  189. BOOST_TEST(test_failure(input, lower));
  190. }
  191. { // test attribute extraction
  192. using boost::spirit::x3::traits::attribute_of;
  193. using boost::spirit::x3::iso8859_1::alpha;
  194. using boost::spirit::x3::iso8859_1::alpha_type;
  195. static_assert(
  196. boost::is_same<
  197. attribute_of<alpha_type, unused_type>::type
  198. , unsigned char>::value
  199. , "Wrong attribute type!"
  200. );
  201. int attr = 0;
  202. BOOST_TEST(test_attr("a", alpha, attr));
  203. BOOST_TEST(attr == 'a');
  204. }
  205. { // test attribute extraction
  206. using boost::spirit::x3::iso8859_1::alpha;
  207. using boost::spirit::x3::iso8859_1::space;
  208. char attr = 0;
  209. BOOST_TEST(test_attr(" a", alpha, attr, space));
  210. BOOST_TEST(attr == 'a');
  211. }
  212. { // test action
  213. using namespace boost::spirit::x3::ascii;
  214. using boost::spirit::x3::_attr;
  215. char ch;
  216. auto f = [&](auto& ctx){ ch = _attr(ctx); };
  217. BOOST_TEST(test("x", alnum[f]));
  218. BOOST_TEST(ch == 'x');
  219. BOOST_TEST(test(" A", alnum[f], space));
  220. BOOST_TEST(ch == 'A');
  221. }
  222. return boost::report_errors();
  223. }