symbols1.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*=============================================================================
  2. Copyright (c) 2001-2015 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/x3.hpp>
  8. #include <iostream>
  9. #include "test.hpp"
  10. // Custom string type with a C-style string conversion.
  11. struct custom_string_c
  12. {
  13. custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
  14. operator char*() { return str; }
  15. operator char const*() const { return str; }
  16. private:
  17. char str[2];
  18. };
  19. int
  20. main()
  21. {
  22. using spirit_test::test;
  23. using spirit_test::test_attr;
  24. using boost::spirit::x3::symbols;
  25. using boost::spirit::x3::no_case;
  26. { // basics
  27. symbols<int> sym;
  28. sym.add
  29. ("Joel")
  30. ("Ruby")
  31. ("Tenji")
  32. ("Tutit")
  33. ("Kim")
  34. ("Joey")
  35. ("Joeyboy")
  36. ;
  37. BOOST_TEST((test("Joel", sym)));
  38. BOOST_TEST((test("Ruby", sym)));
  39. BOOST_TEST((test("Tenji", sym)));
  40. BOOST_TEST((test("Tutit", sym)));
  41. BOOST_TEST((test("Kim", sym)));
  42. BOOST_TEST((test("Joey", sym)));
  43. BOOST_TEST((test("Joeyboy", sym)));
  44. BOOST_TEST((!test("XXX", sym)));
  45. // test copy
  46. symbols<int> sym2;
  47. sym2 = sym;
  48. BOOST_TEST((test("Joel", sym2)));
  49. BOOST_TEST((test("Ruby", sym2)));
  50. BOOST_TEST((test("Tenji", sym2)));
  51. BOOST_TEST((test("Tutit", sym2)));
  52. BOOST_TEST((test("Kim", sym2)));
  53. BOOST_TEST((test("Joey", sym2)));
  54. BOOST_TEST((!test("XXX", sym2)));
  55. // make sure it plays well with other parsers
  56. BOOST_TEST((test("Joelyo", sym >> "yo")));
  57. sym.remove
  58. ("Joel")
  59. ("Ruby")
  60. ;
  61. BOOST_TEST((!test("Joel", sym)));
  62. BOOST_TEST((!test("Ruby", sym)));
  63. }
  64. { // comma syntax
  65. symbols<int> sym;
  66. sym += "Joel", "Ruby", "Tenji", "Tutit", "Kim", "Joey";
  67. BOOST_TEST((test("Joel", sym)));
  68. BOOST_TEST((test("Ruby", sym)));
  69. BOOST_TEST((test("Tenji", sym)));
  70. BOOST_TEST((test("Tutit", sym)));
  71. BOOST_TEST((test("Kim", sym)));
  72. BOOST_TEST((test("Joey", sym)));
  73. BOOST_TEST((!test("XXX", sym)));
  74. sym -= "Joel", "Ruby";
  75. BOOST_TEST((!test("Joel", sym)));
  76. BOOST_TEST((!test("Ruby", sym)));
  77. }
  78. { // no-case handling
  79. using namespace boost::spirit::x3::ascii;
  80. symbols<int> sym;
  81. // NOTE: make sure all entries are in lower-case!!!
  82. sym = "joel", "ruby", "tenji", "tutit", "kim", "joey";
  83. BOOST_TEST((test("joel", no_case[sym])));
  84. BOOST_TEST((test("ruby", no_case[sym])));
  85. BOOST_TEST((test("tenji", no_case[sym])));
  86. BOOST_TEST((test("tutit", no_case[sym])));
  87. BOOST_TEST((test("kim", no_case[sym])));
  88. BOOST_TEST((test("joey", no_case[sym])));
  89. BOOST_TEST((test("JOEL", no_case[sym])));
  90. BOOST_TEST((test("RUBY", no_case[sym])));
  91. BOOST_TEST((test("TENJI", no_case[sym])));
  92. BOOST_TEST((test("TUTIT", no_case[sym])));
  93. BOOST_TEST((test("KIM", no_case[sym])));
  94. BOOST_TEST((test("JOEY", no_case[sym])));
  95. // make sure it plays well with other parsers
  96. BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
  97. }
  98. { // attributes
  99. symbols<int> sym;
  100. sym.add
  101. ("Joel", 1)
  102. ("Ruby", 2)
  103. ("Tenji", 3)
  104. ("Tutit", 4)
  105. ("Kim", 5)
  106. ("Joey", 6)
  107. ;
  108. int i;
  109. BOOST_TEST((test_attr("Joel", sym, i)));
  110. BOOST_TEST(i == 1);
  111. BOOST_TEST((test_attr("Ruby", sym, i)));
  112. BOOST_TEST(i == 2);
  113. BOOST_TEST((test_attr("Tenji", sym, i)));
  114. BOOST_TEST(i == 3);
  115. BOOST_TEST((test_attr("Tutit", sym, i)));
  116. BOOST_TEST(i == 4);
  117. BOOST_TEST((test_attr("Kim", sym, i)));
  118. BOOST_TEST(i == 5);
  119. BOOST_TEST((test_attr("Joey", sym, i)));
  120. BOOST_TEST(i == 6);
  121. BOOST_TEST((!test_attr("XXX", sym, i)));
  122. // double add:
  123. sym.add("Joel", 265);
  124. BOOST_TEST((test_attr("Joel", sym, i)));
  125. BOOST_TEST(i == 1);
  126. }
  127. { // actions
  128. using boost::spirit::x3::_attr;
  129. symbols<int> sym;
  130. sym.add
  131. ("Joel", 1)
  132. ("Ruby", 2)
  133. ("Tenji", 3)
  134. ("Tutit", 4)
  135. ("Kim", 5)
  136. ("Joey", 6)
  137. ;
  138. int i;
  139. auto f = [&](auto& ctx){ i = _attr(ctx); };
  140. BOOST_TEST((test("Joel", sym[f])));
  141. BOOST_TEST(i == 1);
  142. BOOST_TEST((test("Ruby", sym[f])));
  143. BOOST_TEST(i == 2);
  144. BOOST_TEST((test("Tenji", sym[f])));
  145. BOOST_TEST(i == 3);
  146. BOOST_TEST((test("Tutit", sym[f])));
  147. BOOST_TEST(i == 4);
  148. BOOST_TEST((test("Kim", sym[f])));
  149. BOOST_TEST(i == 5);
  150. BOOST_TEST((test("Joey", sym[f])));
  151. BOOST_TEST(i == 6);
  152. BOOST_TEST((!test("XXX", sym[f])));
  153. }
  154. return boost::report_errors();
  155. }