1 /*=============================================================================
2 Copyright (c) 2001-2010 Joel de Guzman
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 #include <boost/spirit/include/qi_string.hpp>
8 #include <boost/spirit/include/qi_char.hpp>
9 #include <boost/spirit/include/qi_action.hpp>
10 #include <boost/spirit/include/qi_auxiliary.hpp>
11 #include <boost/spirit/include/qi_directive.hpp>
12 #include <boost/spirit/include/qi_operator.hpp>
13 #include <boost/spirit/include/qi_nonterminal.hpp>
14 #include <boost/spirit/include/support_argument.hpp>
15 #include <boost/spirit/include/phoenix_core.hpp>
16 #include <boost/spirit/include/phoenix_operator.hpp>
18 #include <boost/core/lightweight_test.hpp>
19 #include <boost/core/lightweight_test_trait.hpp>
24 // Custom string type with a C-style string conversion.
25 struct custom_string_c
27 custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
29 operator char*() { return str; }
30 operator char const*() const { return str; }
39 using spirit_test::test;
40 using spirit_test::test_attr;
41 using boost::spirit::qi::symbols;
42 using boost::spirit::qi::rule;
43 using boost::spirit::qi::lazy;
44 using boost::spirit::qi::_r1;
47 symbols<char, int> sym;
59 BOOST_TEST_TRAIT_TRUE((boost::spirit::traits::is_parser<symbols<char, int> >));
61 BOOST_TEST((test("Joel", sym)));
62 BOOST_TEST((test("Ruby", sym)));
63 BOOST_TEST((test("Tenji", sym)));
64 BOOST_TEST((test("Tutit", sym)));
65 BOOST_TEST((test("Kim", sym)));
66 BOOST_TEST((test("Joey", sym)));
67 BOOST_TEST((test("Joeyboy", sym)));
68 BOOST_TEST((!test("XXX", sym)));
71 symbols<char, int> sym2;
73 BOOST_TEST((test("Joel", sym2)));
74 BOOST_TEST((test("Ruby", sym2)));
75 BOOST_TEST((test("Tenji", sym2)));
76 BOOST_TEST((test("Tutit", sym2)));
77 BOOST_TEST((test("Kim", sym2)));
78 BOOST_TEST((test("Joey", sym2)));
79 BOOST_TEST((!test("XXX", sym2)));
81 // make sure it plays well with other parsers
82 BOOST_TEST((test("Joelyo", sym >> "yo")));
89 BOOST_TEST((!test("Joel", sym)));
90 BOOST_TEST((!test("Ruby", sym)));
94 symbols<char, int> sym;
95 sym += "Joel", "Ruby", "Tenji", "Tutit", "Kim", "Joey";
97 BOOST_TEST((test("Joel", sym)));
98 BOOST_TEST((test("Ruby", sym)));
99 BOOST_TEST((test("Tenji", sym)));
100 BOOST_TEST((test("Tutit", sym)));
101 BOOST_TEST((test("Kim", sym)));
102 BOOST_TEST((test("Joey", sym)));
103 BOOST_TEST((!test("XXX", sym)));
105 sym -= "Joel", "Ruby";
107 BOOST_TEST((!test("Joel", sym)));
108 BOOST_TEST((!test("Ruby", sym)));
111 { // no-case handling
112 using namespace boost::spirit::ascii;
114 symbols<char, int> sym;
115 // NOTE: make sure all entries are in lower-case!!!
116 sym = "joel", "ruby", "tenji", "tutit", "kim", "joey";
118 BOOST_TEST((test("joel", no_case[sym])));
119 BOOST_TEST((test("ruby", no_case[sym])));
120 BOOST_TEST((test("tenji", no_case[sym])));
121 BOOST_TEST((test("tutit", no_case[sym])));
122 BOOST_TEST((test("kim", no_case[sym])));
123 BOOST_TEST((test("joey", no_case[sym])));
125 BOOST_TEST((test("JOEL", no_case[sym])));
126 BOOST_TEST((test("RUBY", no_case[sym])));
127 BOOST_TEST((test("TENJI", no_case[sym])));
128 BOOST_TEST((test("TUTIT", no_case[sym])));
129 BOOST_TEST((test("KIM", no_case[sym])));
130 BOOST_TEST((test("JOEY", no_case[sym])));
132 // make sure it plays well with other parsers
133 BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
137 symbols<char, int> sym;
150 BOOST_TEST((test_attr("Joel", sym, i)));
152 BOOST_TEST((test_attr("Ruby", sym, i)));
154 BOOST_TEST((test_attr("Tenji", sym, i)));
156 BOOST_TEST((test_attr("Tutit", sym, i)));
158 BOOST_TEST((test_attr("Kim", sym, i)));
160 BOOST_TEST((test_attr("Joey", sym, i)));
162 BOOST_TEST((test_attr("Joeyboy", sym, i)));
164 BOOST_TEST((!test_attr("XXX", sym, i)));
168 sym.add("Joel", 265);
169 BOOST_TEST((test_attr("Joel", sym, i)));
174 namespace phx = boost::phoenix;
175 using boost::spirit::_1;
177 symbols<char, int> sym;
188 BOOST_TEST((test("Joel", sym[phx::ref(i) = _1])));
190 BOOST_TEST((test("Ruby", sym[phx::ref(i) = _1])));
192 BOOST_TEST((test("Tenji", sym[phx::ref(i) = _1])));
194 BOOST_TEST((test("Tutit", sym[phx::ref(i) = _1])));
196 BOOST_TEST((test("Kim", sym[phx::ref(i) = _1])));
198 BOOST_TEST((test("Joey", sym[phx::ref(i) = _1])));
200 BOOST_TEST((!test("XXX", sym[phx::ref(i) = _1])));
203 return boost::report_errors();