123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*=============================================================================
- Copyright (c) 2001-2011 Hartmut Kaiser
- Copyright (c) 2001-2011 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 "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();
- }
|