1 /*=============================================================================
2 Copyright (c) 2001-2013 Joel de Guzman
3
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/detail/lightweight_test.hpp>
8 #include <boost/spirit/home/x3.hpp>
9 #include <boost/fusion/include/vector.hpp>
10 #include <boost/fusion/include/at.hpp>
11
12 #include <string>
13 #include <iostream>
14 #include "test.hpp"
15
16 int
main()17 main()
18 {
19 using namespace boost::spirit;
20 using namespace boost::spirit::x3::ascii;
21 using boost::spirit::x3::lit;
22 using boost::spirit::x3::expect;
23 using spirit_test::test;
24 using spirit_test::test_attr;
25 using boost::spirit::x3::expectation_failure;
26
27 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(expect['x']);
28 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(char_ > char_);
29
30 {
31 try
32 {
33 BOOST_TEST((test("aa", char_ >> expect[char_])));
34 BOOST_TEST((test("aaa", char_ >> expect[char_ >> char_('a')])));
35 BOOST_TEST((test("xi", char_('x') >> expect[char_('i')])));
36 BOOST_TEST((!test("xi", char_('y') >> expect[char_('o')]))); // should not throw!
37 BOOST_TEST((test("xin", char_('x') >> expect[char_('i') >> char_('n')])));
38 BOOST_TEST((!test("xi", char_('x') >> expect[char_('o')])));
39 }
40 catch (expectation_failure<char const*> const& x)
41 {
42 std::cout << "expected: " << x.which();
43 std::cout << " got: \"" << x.where() << '"' << std::endl;
44 }
45 }
46
47 {
48 try
49 {
50 BOOST_TEST((test("aa", char_ > char_)));
51 BOOST_TEST((test("aaa", char_ > char_ > char_('a'))));
52 BOOST_TEST((test("xi", char_('x') > char_('i'))));
53 BOOST_TEST((!test("xi", char_('y') > char_('o')))); // should not throw!
54 BOOST_TEST((test("xin", char_('x') > char_('i') > char_('n'))));
55 BOOST_TEST((!test("xi", char_('x') > char_('o'))));
56 }
57 catch (expectation_failure<char const*> const& x)
58 {
59 std::cout << "expected: " << x.which();
60 std::cout << " got: \"" << x.where() << '"' << std::endl;
61 }
62 }
63
64 {
65 try
66 {
67 BOOST_TEST((!test("ay:a", char_ > char_('x') >> ':' > 'a')));
68 }
69 catch (expectation_failure<char const*> const& x)
70 {
71 std::cout << "expected: " << x.which();
72 std::cout << " got: \"" << x.where() << '"' << std::endl;
73 }
74 }
75
76 #if defined(BOOST_CLANG)
77 #pragma clang diagnostic push
78 #pragma clang diagnostic ignored "-Woverloaded-shift-op-parentheses"
79 #endif
80 { // Test that attributes with > (sequences) work just like >> (sequences)
81
82 using boost::fusion::vector;
83 using boost::fusion::at_c;
84
85 {
86 vector<char, char, char> attr;
87 BOOST_TEST((test_attr(" a\n b\n c",
88 char_ > char_ > char_, attr, space)));
89 BOOST_TEST((at_c<0>(attr) == 'a'));
90 BOOST_TEST((at_c<1>(attr) == 'b'));
91 BOOST_TEST((at_c<2>(attr) == 'c'));
92 }
93
94 {
95 vector<char, char, char> attr;
96 BOOST_TEST((test_attr(" a\n b\n c",
97 char_ > char_ >> char_, attr, space)));
98 BOOST_TEST((at_c<0>(attr) == 'a'));
99 BOOST_TEST((at_c<1>(attr) == 'b'));
100 BOOST_TEST((at_c<2>(attr) == 'c'));
101 }
102
103 {
104 vector<char, char, char> attr;
105 BOOST_TEST((test_attr(" a, b, c",
106 char_ >> ',' > char_ >> ',' > char_, attr, space)));
107 BOOST_TEST((at_c<0>(attr) == 'a'));
108 BOOST_TEST((at_c<1>(attr) == 'b'));
109 BOOST_TEST((at_c<2>(attr) == 'c'));
110 }
111
112 {
113 std::string attr;
114 BOOST_TEST((test_attr("'azaaz'",
115 "'" > *(char_("a") | char_("z")) > "'", attr, space)));
116 BOOST_TEST(attr == "azaaz");
117 }
118 }
119 #if defined(BOOST_CLANG)
120 #pragma clang diagnostic pop
121 #endif
122
123 {
124 try
125 {
126 BOOST_TEST((test(" a a", char_ > char_, space)));
127 BOOST_TEST((test(" x i", char_('x') > char_('i'), space)));
128 BOOST_TEST((!test(" x i", char_('x') > char_('o'), space)));
129 }
130 catch (expectation_failure<char const*> const& x)
131 {
132 std::cout << "expected: " << x.which();
133 std::cout << " got: \"" << x.where() << '"' << std::endl;
134 }
135 }
136
137 {
138 try
139 {
140 BOOST_TEST((test("bar", expect[lit("foo")])));
141 }
142 catch (expectation_failure<char const*> const& x)
143 {
144 std::cout << "expected: " << x.which();
145 std::cout << " got: \"" << x.where() << '"' << std::endl;
146 }
147 }
148
149 return boost::report_errors();
150 }
151