• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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