test_typeof.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // test_typeof.cpp
  3. //
  4. // Copyright 2008 David Jenkins. Distributed under the Boost
  5. // Software License, Version 1.0. (See accompanying file
  6. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. #define BOOST_TYPEOF_LIMIT_SIZE 200
  8. #define BOOST_TYPEOF_EMULATION 1
  9. #include <string>
  10. #include <boost/version.hpp>
  11. #include <boost/xpressive/xpressive_static.hpp>
  12. #include <boost/xpressive/xpressive_typeof.hpp>
  13. #include <boost/test/unit_test.hpp>
  14. // I couldn't find these registrations anywhere else, so I put them here
  15. // They are necessary for this program to compile
  16. #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
  17. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::mpl::int_, (int))
  18. BOOST_TYPEOF_REGISTER_TEMPLATE(boost::reference_wrapper, (typename))
  19. // Here's the test for typeof registration, to be used on static regular expressions
  20. #define TYPEOF_TEST(Expr) { BOOST_PROTO_AUTO(Dummy, Expr); }
  21. namespace xp = boost::xpressive;
  22. ///////////////////////////////////////////////////////////////////////////////
  23. // test_misc1
  24. // miscelaneous regular expressions
  25. static void test_misc1()
  26. {
  27. using namespace boost::xpressive;
  28. TYPEOF_TEST(epsilon);
  29. TYPEOF_TEST(nil);
  30. TYPEOF_TEST(alnum);
  31. TYPEOF_TEST(bos);
  32. TYPEOF_TEST(eos);
  33. TYPEOF_TEST(bol);
  34. TYPEOF_TEST(eol);
  35. TYPEOF_TEST(bow);
  36. TYPEOF_TEST(eow);
  37. TYPEOF_TEST(_b);
  38. TYPEOF_TEST(_w);
  39. TYPEOF_TEST(_d);
  40. TYPEOF_TEST(_s);
  41. TYPEOF_TEST(_n);
  42. TYPEOF_TEST(_ln);
  43. TYPEOF_TEST(_);
  44. TYPEOF_TEST(self);
  45. }
  46. ///////////////////////////////////////////////////////////////////////////////
  47. // test_misc2
  48. // miscelaneous regular expressions
  49. static void test_misc2()
  50. {
  51. using namespace boost::xpressive;
  52. TYPEOF_TEST(+set[_d | '-' | 'g']);
  53. TYPEOF_TEST(+set['g' | as_xpr('-') | _d]);
  54. TYPEOF_TEST(icase(+range('a','g')));
  55. TYPEOF_TEST(+range('-','/'));
  56. TYPEOF_TEST(+range('+','-'));
  57. TYPEOF_TEST(+range('b','b'));
  58. TYPEOF_TEST(icase((s1= "foo") >> *_ >> '\15'));
  59. TYPEOF_TEST(repeat<2>(repeat<3>(_d) >> '-') >> repeat<4>(_d));
  60. TYPEOF_TEST('f' >> +as_xpr('o'));
  61. TYPEOF_TEST(icase(+(s1= "foo") >> "foobar"));
  62. cregex parens = '(' >> *( keep( +~(set='(',')') ) | by_ref(parens) ) >> ')';
  63. TYPEOF_TEST(_b >> "sublist" >> parens);
  64. TYPEOF_TEST(bos >> "baz" | "bar");
  65. TYPEOF_TEST(icase(*_ >> "foo"));
  66. TYPEOF_TEST(icase(*_ >> "boo" | "bar"));
  67. TYPEOF_TEST(icase("bar"));
  68. TYPEOF_TEST(('f' >> repeat<1,repeat_max>('o')));
  69. TYPEOF_TEST("This " >> (s1= "(has)") >> ' ' >> (s2= "parens"));
  70. TYPEOF_TEST(as_xpr("This (has parens"));
  71. TYPEOF_TEST(+_d);
  72. TYPEOF_TEST(+~_d);
  73. TYPEOF_TEST(+set[_d]);
  74. TYPEOF_TEST(+set[~_d]);
  75. TYPEOF_TEST(+~set[~_d]);
  76. TYPEOF_TEST(+~set[_d]);
  77. TYPEOF_TEST(+set[~_w | ~_d]);
  78. TYPEOF_TEST(+~set[_w | _d]);
  79. TYPEOF_TEST((s1= '(' >> (s2= nil) | '[' >> (s3= nil)) >> -*_ >> (s4= ')') >> s2 | ']' >> s3);
  80. TYPEOF_TEST(after("foo") >> "bar");
  81. TYPEOF_TEST(after(s1= 'f' >> _ >> 'o') >> "bar");
  82. TYPEOF_TEST(icase(after(s1= "fo") >> 'o'));
  83. TYPEOF_TEST(icase(~after(s1= "fo") >> 'o'));
  84. TYPEOF_TEST(+alpha);
  85. TYPEOF_TEST(+set[alpha | digit]);
  86. TYPEOF_TEST(after(s1= nil) >> 'a');
  87. TYPEOF_TEST(after(s1= "abc" >> repeat<3>(_d)) >> "foo");
  88. TYPEOF_TEST(~before(bol) >> 'x');
  89. TYPEOF_TEST(~before(bos) >> 'x');
  90. }
  91. ///////////////////////////////////////////////////////////////////////////////
  92. // test_misc3
  93. // miscelaneous regular expressions
  94. static void test_misc3()
  95. {
  96. using namespace boost::xpressive;
  97. TYPEOF_TEST(as_xpr("foo"));
  98. TYPEOF_TEST('b' >> *_ >> "ar");
  99. TYPEOF_TEST('b' >> *_ >> 'r');
  100. TYPEOF_TEST('b' >> +_ >> "ar");
  101. TYPEOF_TEST('b' >> +_ >> 'r');
  102. TYPEOF_TEST('b' >> +_ >> "oo");
  103. TYPEOF_TEST(bos >> "foo");
  104. TYPEOF_TEST(bos >> 'b' >> *_ >> "ar");
  105. TYPEOF_TEST('b' >> +_ >> "ar" >> eos);
  106. TYPEOF_TEST('b' >> +_ >> 'o' >> eos);
  107. TYPEOF_TEST(bos >> (s1= !(set='-','+') >> +range('0','9')
  108. >> !(s2= '.' >> *range('0','9')))
  109. >> (s3= (set='C','F')) >> eos);
  110. TYPEOF_TEST( !(s1= as_xpr('+')|'-') >> (s2= +range('0','9') >> !as_xpr('.') >> *range('0','9') |
  111. '.' >> +range('0','9')) >> !(s3= (set='e','E') >> !(s4= as_xpr('+')|'-') >> +range('0','9')));
  112. TYPEOF_TEST('f' | icase('g'));
  113. TYPEOF_TEST(icase(+lower));
  114. TYPEOF_TEST(icase(+as_xpr('\x61')));
  115. TYPEOF_TEST(icase(+set['\x61']));
  116. TYPEOF_TEST(icase(+as_xpr('\x0061')));
  117. TYPEOF_TEST(icase(+set['\x0061']));
  118. TYPEOF_TEST('a' >> +(s1= 'b' | (s2= *(s3= 'c'))) >> 'd');
  119. TYPEOF_TEST('a' >> +(s1= 'b' | (s2= !(s3= 'c'))) >> 'd');
  120. TYPEOF_TEST(*as_xpr('a') >> *as_xpr('a') >> *as_xpr('a') >> *as_xpr('a') >> *as_xpr('a') >> 'b');
  121. TYPEOF_TEST(*set[range('a','z') | range('A','Z')]);
  122. }
  123. ///////////////////////////////////////////////////////////////////////////////
  124. // test_misc4
  125. // miscelaneous regular expressions
  126. static void test_misc4()
  127. {
  128. using namespace boost::xpressive;
  129. TYPEOF_TEST('a' >> bos >> 'b');
  130. TYPEOF_TEST(as_xpr("a^b"));
  131. TYPEOF_TEST('a' >> ~set[' '] >> 'b');
  132. TYPEOF_TEST('a' >> ~set['^'] >> 'b');
  133. TYPEOF_TEST('a' >> ~set['^'] >> 'b');
  134. TYPEOF_TEST('a' >> set['^'] >> 'b');
  135. TYPEOF_TEST(icase("foo" >> before("bar")));
  136. TYPEOF_TEST(icase("foo" >> ~before("bar")));
  137. TYPEOF_TEST(icase("foo" >> ~before("bar")));
  138. TYPEOF_TEST(icase(+(s1= keep(s2= "foo") >> "bar")));
  139. TYPEOF_TEST(+(s1= "bar" | (s2= "foo")));
  140. TYPEOF_TEST(+(s1= (s2= "bar") | "foo"));
  141. TYPEOF_TEST(+(s1= "foo" | (s2= "bar")));
  142. TYPEOF_TEST(+(s1= (s2= "foo") | "bar"));
  143. TYPEOF_TEST((s1= icase("FOO")) >> (s2= -*_) >> s1);
  144. TYPEOF_TEST((s1= icase("FOO")) >> (s2= -*_) >> icase(s1));
  145. TYPEOF_TEST(+(s1= "foo" | icase(s1 >> 'O')));
  146. TYPEOF_TEST((bos >> set[range('A','Z') | range('a','m')]));
  147. TYPEOF_TEST(('f' >> repeat<2,5>('o')));
  148. TYPEOF_TEST(('f' >> -repeat<2,5>('o')));
  149. TYPEOF_TEST(('f' >> repeat<2,5>('o') >> 'o'));
  150. TYPEOF_TEST(('f' >> -repeat<2,5>('o') >> 'o'));
  151. TYPEOF_TEST(bos >> '{' >> *_ >> '}' >> eos);
  152. TYPEOF_TEST(+(set='+','-'));
  153. TYPEOF_TEST(+(set='-','+'));
  154. }
  155. ///////////////////////////////////////////////////////////////////////////////
  156. // test_misc5
  157. // miscelaneous regular expressions
  158. static void test_misc5()
  159. {
  160. using namespace boost::xpressive;
  161. TYPEOF_TEST(bos >> ('(' >> (s1= nil) | (s2= nil)) >> +_w >> (')' >> s1 | s2) >> eos);
  162. TYPEOF_TEST(+~alpha);
  163. TYPEOF_TEST(+set[alpha | ~alpha]);
  164. TYPEOF_TEST(+~set[~alpha]);
  165. TYPEOF_TEST(as_xpr("[[:alpha:]\\y]+"));
  166. TYPEOF_TEST(+~set[~alnum | ~digit]);
  167. TYPEOF_TEST(icase(bos >> repeat<4>(s1= 'a' >> !s1) >> eos));
  168. TYPEOF_TEST(as_xpr("foo") >> /*This is a comment[*/ "bar");
  169. TYPEOF_TEST(bos >> "foobar" >> eos);
  170. TYPEOF_TEST(bos >> 'f' >> *as_xpr('o'));
  171. TYPEOF_TEST(bos >> 'f' >> *as_xpr('\157'));
  172. TYPEOF_TEST(bos >> ("foo" >> set[' '] >> "bar") >> eos /*This is a comment*/);
  173. }
  174. ///////////////////////////////////////////////////////////////////////////////
  175. // test_misc6
  176. // miscelaneous regular expressions
  177. static void test_misc6()
  178. {
  179. using namespace boost::xpressive;
  180. TYPEOF_TEST(bos >> *(s1= optional('a')) >> eos);
  181. TYPEOF_TEST(bos >> -*(s1= optional('a')) >> eos);
  182. TYPEOF_TEST(bos >> repeat<2>(s1= optional('b')) >> "bc" >> eos);
  183. TYPEOF_TEST(bos >> *(s1= optional('b')) >> 'd' >> eos);
  184. TYPEOF_TEST(bos >> -repeat<2>(s1= optional('b')) >> "bc" >> eos);
  185. TYPEOF_TEST(bos >> -*(s1= optional('b')) >> 'd' >> eos);
  186. TYPEOF_TEST(bos >> repeat<2>(s1= -optional('b')) >> "bc" >> eos);
  187. TYPEOF_TEST(bos >> *(s1= -optional('b')) >> 'd' >> eos);
  188. TYPEOF_TEST(bos >> -repeat<2>(s1= -optional('b')) >> "bc" >> eos);
  189. TYPEOF_TEST(bos >> -*(s1= -optional('b')) >> 'd' >> eos);
  190. TYPEOF_TEST(bos >> *(s1= nil | nil | nil | 'b') >> "bc" >> eos);
  191. TYPEOF_TEST(bos >> -*(s1= nil | nil | nil | 'b') >> "bc" >> eos);
  192. TYPEOF_TEST(icase(+range('Z','a')));
  193. TYPEOF_TEST(+range('Z','a'));
  194. }
  195. // These functions are defined in test_typeof2.cpp
  196. void test_actions();
  197. void test_symbols();
  198. void test_assert();
  199. using namespace boost::unit_test;
  200. ///////////////////////////////////////////////////////////////////////////////
  201. // init_unit_test_suite
  202. //
  203. test_suite* init_unit_test_suite( int argc, char* argv[] )
  204. {
  205. test_suite *test = BOOST_TEST_SUITE("test_typeof");
  206. test->add(BOOST_TEST_CASE(&test_misc1));
  207. test->add(BOOST_TEST_CASE(&test_misc2));
  208. test->add(BOOST_TEST_CASE(&test_misc3));
  209. test->add(BOOST_TEST_CASE(&test_misc4));
  210. test->add(BOOST_TEST_CASE(&test_misc5));
  211. test->add(BOOST_TEST_CASE(&test_misc6));
  212. test->add(BOOST_TEST_CASE(&test_actions));
  213. test->add(BOOST_TEST_CASE(&test_symbols));
  214. test->add(BOOST_TEST_CASE(&test_assert));
  215. return test;
  216. }