// Copyright (c) 2001-2011 Hartmut Kaiser // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #include #include #include #include #include #include "test.hpp" namespace qi = boost::spirit::qi; namespace traits = boost::spirit::traits; /////////////////////////////////////////////////////////////////////////////// template bool test_create_parser(Char const *in, T& t) { Char const* last = in; while (*last) last++; BOOST_TEST((traits::meta_create_exists::value)); return qi::phrase_parse(in, last, qi::create_parser(), qi::space, t); } template bool test_create_parser_auto(Char const *in, T& t) { Char const* last = in; while (*last) last++; BOOST_TEST((traits::meta_create_exists::value)); return qi::phrase_parse(in, last, t, qi::space); } template bool test_rule(Char const* in, Attribute const& expected) { BOOST_TEST((traits::meta_create_exists::value)); Attribute attr = Attribute(); qi::rule r = qi::create_parser(); return spirit_test::test_attr(in, r, attr) && attr == expected; } template bool test_rule(Char const* in, Attribute const& expected, Skipper const& skipper) { BOOST_TEST((traits::meta_create_exists::value)); Attribute attr = Attribute(); qi::rule r = qi::create_parser(); return spirit_test::test_attr(in, r, attr, skipper) && attr == expected; } struct my_type {}; /////////////////////////////////////////////////////////////////////////////// int main() { { BOOST_TEST((!traits::meta_create_exists::value)); } { // test primitive types bool b = false; BOOST_TEST(test_create_parser("true", b) && b == true); int i = 0; BOOST_TEST(test_create_parser("1", i) && i == 1); double d = 0; BOOST_TEST(test_create_parser("1.1", d) && d == 1.1); char c = '\0'; BOOST_TEST(test_create_parser("a", c) && c == 'a'); wchar_t wc = L'\0'; BOOST_TEST(test_create_parser(L"a", wc) && wc == L'a'); // test containers std::vector v; BOOST_TEST(test_create_parser("0 1 2", v) && v.size() == 3 && v[0] == 0 && v[1] == 1 && v[2] == 2); std::list l; BOOST_TEST(test_create_parser("0 1 2", l) && l.size() == 3 && *l.begin() == 0 && *(++l.begin()) == 1 && *(++ ++l.begin()) == 2); // test optional boost::optional o; BOOST_TEST(test_create_parser("", o) && !o); BOOST_TEST(test_create_parser("1", o) && !!o && boost::get(o) == 1); // test alternative boost::variant > vv; BOOST_TEST(test_create_parser("true", vv) && vv.which() == 1 && boost::get(vv) == true); BOOST_TEST(test_create_parser("1.0", vv) && vv.which() == 0 && boost::get(vv) == 1.0); BOOST_TEST(test_create_parser("some_string", vv) && vv.which() == 2 && boost::equals(boost::get >(vv), "some_string")); // test fusion sequence std::pair p; BOOST_TEST(test_create_parser("1 2.0", p) && p.first == 1 && p.second == 2.0); } { // test containers std::vector v; BOOST_TEST(test_create_parser_auto("0 1 2", v) && v.size() == 3 && v[0] == 0 && v[1] == 1 && v[2] == 2); std::list l; BOOST_TEST(test_create_parser_auto("0 1 2", l) && l.size() == 3 && *l.begin() == 0 && *(++l.begin()) == 1 && *(++ ++l.begin()) == 2); // test optional boost::optional o; BOOST_TEST(test_create_parser_auto("", o) && !o); BOOST_TEST(test_create_parser_auto("1", o) && !!o && boost::get(o) == 1); // test alternative boost::variant > vv; BOOST_TEST(test_create_parser_auto("true", vv) && vv.which() == 1 && boost::get(vv) == true); BOOST_TEST(test_create_parser_auto("1.0", vv) && vv.which() == 0 && boost::get(vv) == 1.0); BOOST_TEST(test_create_parser_auto("some_string", vv) && vv.which() == 2 && boost::equals(boost::get >(vv), "some_string")); // test fusion sequence std::pair p; BOOST_TEST(test_create_parser_auto("1 2.0", p) && p.first == 1 && p.second == 2.0); } { using qi::auto_; using qi::no_case; using spirit_test::test_attr; // test primitive types bool b = false; BOOST_TEST(test_attr("true", auto_, b) && b == true); int i = 0; BOOST_TEST(test_attr("1", auto_, i) && i == 1); double d = 0; BOOST_TEST(test_attr("1.1", auto_, d) && d == 1.1); char c = '\0'; BOOST_TEST(test_attr("a", auto_, c) && c == 'a'); wchar_t wc = L'\0'; BOOST_TEST(test_attr(L"a", auto_, wc) && wc == L'a'); b = false; BOOST_TEST(test_attr("TRUE", no_case[auto_], b) && b == true); // test containers std::vector v; BOOST_TEST(test_attr("0 1 2", auto_, v, qi::space) && v.size() == 3 && v[0] == 0 && v[1] == 1 && v[2] == 2); v.clear(); BOOST_TEST(test_attr("0,1,2", auto_ % ',', v) && v.size() == 3 && v[0] == 0 && v[1] == 1 && v[2] == 2); std::list l; BOOST_TEST(test_attr("0 1 2", auto_, l, qi::space) && l.size() == 3 && *l.begin() == 0 && *(++l.begin()) == 1 && *(++ ++l.begin()) == 2); l.clear(); BOOST_TEST(test_attr("0,1,2", auto_ % ',', l) && l.size() == 3 && *l.begin() == 0 && *(++l.begin()) == 1 && *(++ ++l.begin()) == 2); // test optional boost::optional o; BOOST_TEST(test_attr("", auto_, o) && !o); BOOST_TEST(test_attr("1", auto_, o) && !!o && boost::get(o) == 1); // test alternative boost::variant > vv; BOOST_TEST(test_attr("true", auto_, vv) && vv.which() == 1 && boost::get(vv) == true); BOOST_TEST(test_attr("1.0", auto_, vv) && vv.which() == 0 && boost::get(vv) == 1.0); BOOST_TEST(test_create_parser("some_string", vv) && vv.which() == 2 && boost::equals(boost::get >(vv), "some_string")); // test fusion sequence std::pair p; BOOST_TEST(test_attr("1 2.0", auto_, p, qi::space) && p.first == 1 && p.second == 2.0); } { // test primitive types BOOST_TEST(test_rule("true", true)); BOOST_TEST(test_rule("1", 1)); BOOST_TEST(test_rule("1.1", 1.1)); // test containers std::vector v; v.push_back(0); v.push_back(1); v.push_back(2); BOOST_TEST(test_rule("0 1 2", v, qi::space)); std::list l; l.push_back(0); l.push_back(1); l.push_back(2); BOOST_TEST(test_rule("0 1 2", l, qi::space)); // test optional boost::optional o; BOOST_TEST(test_rule("", o)); o = 1; BOOST_TEST(test_rule("1", o)); // test alternative // boost::variant vv; // vv = 1; // BOOST_TEST(test_rule("1", vv)); // vv = 1.0; // BOOST_TEST(test_rule("1.0", vv)); // vv = 1.0f; // BOOST_TEST(test_rule("1.0", vv)); // vv = "some string"; // BOOST_TEST(test_rule("some string", vv)); // test fusion sequence std::pair p (1, 2.0); BOOST_TEST(test_rule("1 2.0", p, qi::space)); } return boost::report_errors(); }