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