| /*============================================================================= |
| Copyright (c) 2001-2010 Hartmut Kaiser |
| Copyright (c) 2001-2010 Joel de Guzman |
| |
| 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 <boost/config/warning_disable.hpp> |
| #include <boost/detail/lightweight_test.hpp> |
| |
| #include <boost/spirit/include/karma_string.hpp> |
| #include <boost/spirit/include/karma_numeric.hpp> |
| #include <boost/spirit/include/karma_directive.hpp> |
| #include <boost/spirit/include/karma_operator.hpp> |
| #include <boost/spirit/include/karma_phoenix_attributes.hpp> |
| |
| #include <boost/spirit/include/phoenix_core.hpp> |
| #include <boost/spirit/include/phoenix_operator.hpp> |
| #include <boost/spirit/include/phoenix_statement.hpp> |
| |
| #include "test.hpp" |
| |
| using namespace spirit_test; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // special bool output policy allowing to spell false as true backwards (eurt) |
| struct special_bool_policy : boost::spirit::karma::bool_policies<> |
| { |
| template <typename CharEncoding, typename Tag |
| , typename OutputIterator> |
| static bool generate_false(OutputIterator& sink, bool) |
| { |
| // we want to spell the names of true and false backwards |
| return boost::spirit::karma::string_inserter<CharEncoding, Tag>:: |
| call(sink, "eurt"); |
| } |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // special policy allowing to use any type as a boolean |
| struct test_bool_data |
| { |
| explicit test_bool_data(bool b) : b(b) {} |
| |
| bool b; |
| |
| // we need to provide (safe) convertibility to bool |
| private: |
| struct dummy { void true_() {}; }; |
| typedef void (dummy::*safe_bool)(); |
| |
| public: |
| operator safe_bool () const { return b ? &dummy::true_ : 0; } |
| }; |
| |
| struct test_bool_policy : boost::spirit::karma::bool_policies<> |
| { |
| template <typename Inserter, typename OutputIterator, typename Policies> |
| static bool |
| call (OutputIterator& sink, test_bool_data b, Policies const& p) |
| { |
| // call the predefined inserter to do the job |
| return Inserter::call_n(sink, bool(b), p); |
| } |
| }; |
| |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| int main() |
| { |
| using boost::spirit::karma::bool_; |
| using boost::spirit::karma::false_; |
| using boost::spirit::karma::true_; |
| using boost::spirit::karma::lit; |
| using boost::spirit::karma::lower; |
| using boost::spirit::karma::upper; |
| |
| // testing plain bool |
| { |
| BOOST_TEST(test("false", bool_, false)); |
| BOOST_TEST(test("true", bool_, true)); |
| BOOST_TEST(test("false", false_, false)); |
| BOOST_TEST(test("true", true_, true)); |
| BOOST_TEST(test("false", bool_(false))); |
| BOOST_TEST(test("true", bool_(true))); |
| BOOST_TEST(test("false", bool_(false), false)); |
| BOOST_TEST(test("true", bool_(true), true)); |
| BOOST_TEST(!test("", bool_(false), true)); |
| BOOST_TEST(!test("", bool_(true), false)); |
| BOOST_TEST(test("false", lit(false))); |
| BOOST_TEST(test("true", lit(true))); |
| } |
| |
| // test optional attributes |
| { |
| boost::optional<bool> optbool; |
| |
| BOOST_TEST(!test("", bool_, optbool)); |
| BOOST_TEST(test("", -bool_, optbool)); |
| optbool = false; |
| BOOST_TEST(test("false", bool_, optbool)); |
| BOOST_TEST(test("false", -bool_, optbool)); |
| optbool = true; |
| BOOST_TEST(test("true", bool_, optbool)); |
| BOOST_TEST(test("true", -bool_, optbool)); |
| } |
| |
| // we support Phoenix attributes only starting with V2.2 |
| #if SPIRIT_VERSION >= 0x2020 |
| // test Phoenix expression attributes (requires to include |
| // karma_phoenix_attributes.hpp) |
| { |
| namespace phoenix = boost::phoenix; |
| |
| BOOST_TEST(test("true", bool_, phoenix::val(true))); |
| |
| bool b = false; |
| BOOST_TEST(test("false", bool_, phoenix::ref(b))); |
| BOOST_TEST(test("true", bool_, ++phoenix::ref(b))); |
| } |
| #endif |
| |
| { |
| BOOST_TEST(test("false", lower[bool_], false)); |
| BOOST_TEST(test("true", lower[bool_], true)); |
| BOOST_TEST(test("false", lower[bool_(false)])); |
| BOOST_TEST(test("true", lower[bool_(true)])); |
| BOOST_TEST(test("false", lower[bool_(false)], false)); |
| BOOST_TEST(test("true", lower[bool_(true)], true)); |
| BOOST_TEST(!test("", lower[bool_(false)], true)); |
| BOOST_TEST(!test("", lower[bool_(true)], false)); |
| BOOST_TEST(test("false", lower[lit(false)])); |
| BOOST_TEST(test("true", lower[lit(true)])); |
| } |
| |
| { |
| BOOST_TEST(test("FALSE", upper[bool_], false)); |
| BOOST_TEST(test("TRUE", upper[bool_], true)); |
| BOOST_TEST(test("FALSE", upper[bool_(false)])); |
| BOOST_TEST(test("TRUE", upper[bool_(true)])); |
| BOOST_TEST(test("FALSE", upper[bool_(false)], false)); |
| BOOST_TEST(test("TRUE", upper[bool_(true)], true)); |
| BOOST_TEST(!test("", upper[bool_(false)], true)); |
| BOOST_TEST(!test("", upper[bool_(true)], false)); |
| BOOST_TEST(test("FALSE", upper[lit(false)])); |
| BOOST_TEST(test("TRUE", upper[lit(true)])); |
| } |
| |
| { |
| typedef boost::spirit::karma::bool_generator<bool, special_bool_policy> |
| backwards_bool_type; |
| backwards_bool_type const backwards_bool = backwards_bool_type(); |
| |
| BOOST_TEST(test("eurt", backwards_bool, false)); |
| BOOST_TEST(test("true", backwards_bool, true)); |
| BOOST_TEST(test("eurt", backwards_bool(false))); |
| BOOST_TEST(test("true", backwards_bool(true))); |
| BOOST_TEST(test("eurt", backwards_bool(false), false)); |
| BOOST_TEST(test("true", backwards_bool(true), true)); |
| BOOST_TEST(!test("", backwards_bool(false), true)); |
| BOOST_TEST(!test("", backwards_bool(true), false)); |
| } |
| |
| { |
| typedef boost::spirit::karma::bool_generator< |
| test_bool_data, test_bool_policy> test_bool_type; |
| test_bool_type const test_bool = test_bool_type(); |
| |
| test_bool_data const test_false = test_bool_data(false); |
| test_bool_data const test_true = test_bool_data(true); |
| |
| BOOST_TEST(test("false", test_bool, test_false)); |
| BOOST_TEST(test("true", test_bool, test_true)); |
| BOOST_TEST(test("false", test_bool(test_false))); |
| BOOST_TEST(test("true", test_bool(test_true))); |
| BOOST_TEST(test("false", test_bool(test_false), test_false)); |
| BOOST_TEST(test("true", test_bool(test_true), test_true)); |
| BOOST_TEST(!test("", test_bool(test_false), test_true)); |
| BOOST_TEST(!test("", test_bool(test_true), test_false)); |
| } |
| |
| return boost::report_errors(); |
| } |
| |