123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- // 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 <boost/mpl/print.hpp>
- #include <boost/config/warning_disable.hpp>
- #include <boost/spirit/include/karma.hpp>
- #include <boost/spirit/include/karma_format.hpp>
- #include <boost/spirit/include/karma_format_auto.hpp>
- #include <boost/spirit/include/karma_stream.hpp>
- #include <boost/spirit/include/phoenix_core.hpp>
- #include <boost/spirit/include/phoenix_operator.hpp>
- #include <string>
- #include <sstream>
- #include <vector>
- #include <list>
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/assign/std/vector.hpp>
- #include <boost/assign/std/list.hpp>
- ///////////////////////////////////////////////////////////////////////////////
- template <typename Char, typename Expr>
- bool test(Char const *expected, Expr const& xpr)
- {
- // Report invalid expression error as early as possible.
- // If you got an error_invalid_expression error message here,
- // then the expression (expr) is not a valid spirit karma expression.
- BOOST_SPIRIT_ASSERT_MATCH(boost::spirit::karma::domain, Expr);
- std::ostringstream ostrm;
- ostrm << boost::spirit::compile<boost::spirit::karma::domain>(xpr);
- return ostrm.good() && ostrm.str() == expected;
- }
- template <typename Char, typename Expr, typename CopyExpr, typename CopyAttr
- , typename Delimiter, typename Attribute>
- bool test(Char const *expected,
- boost::spirit::karma::detail::format_manip<
- Expr, CopyExpr, CopyAttr, Delimiter, Attribute> const& fm)
- {
- std::ostringstream ostrm;
- ostrm << fm;
- return ostrm.good() && ostrm.str() == expected;
- }
- ///////////////////////////////////////////////////////////////////////////////
- int
- main()
- {
- using namespace boost::spirit;
- using namespace boost::spirit::ascii;
- namespace fusion = boost::fusion;
- using namespace boost::phoenix;
- {
- BOOST_TEST(test( "a",
- char_('a')
- ));
- BOOST_TEST(test( "a",
- char_[_1 = val('a')]
- ));
- BOOST_TEST(test( "a",
- karma::format(char_[_1 = val('a')])
- ));
- BOOST_TEST(test( "a ",
- karma::format_delimited(char_[_1 = val('a')], space)
- ));
- BOOST_TEST(test( "a",
- karma::format(char_, 'a')
- ));
- BOOST_TEST(test( "a ",
- karma::format_delimited(char_, space, 'a')
- ));
- }
- {
- BOOST_TEST(test( "ab",
- char_[_1 = val('a')] << char_[_1 = val('b')]
- ));
- BOOST_TEST(test( "ab",
- karma::format(char_[_1 = val('a')] << char_[_1 = val('b')])
- ));
- BOOST_TEST(test( "a b ",
- karma::format_delimited(char_[_1 = val('a')] << char_[_1 = val('b')], space)
- ));
- fusion::vector<char, char> t('a', 'b');
- BOOST_TEST(test( "ab",
- karma::format(char_ << char_, t)
- ));
- BOOST_TEST(test( "a b ",
- karma::format_delimited(char_ << char_, space, t)
- ));
- BOOST_TEST(test( "ab",
- karma::format(t)
- ));
- BOOST_TEST(test( "a b ",
- karma::format_delimited(t, space)
- ));
- }
- {
- BOOST_TEST(test( "abc",
- char_[_1 = 'a'] << char_[_1 = 'b'] << char_[_1 = 'c']
- ));
- BOOST_TEST(test( "abc",
- karma::format(char_('a') << char_('b') << char_('c'))
- ));
- BOOST_TEST(test( "a b c ",
- karma::format_delimited(char_('a') << char_('b') << char_('c'), space)
- ));
- fusion::vector<char, char, char> t('a', 'b', 'c');
- BOOST_TEST(test( "abc",
- karma::format(char_ << char_ << char_, t)
- ));
- BOOST_TEST(test( "a b c ",
- karma::format_delimited(char_ << char_ << char_, space, t)
- ));
- }
- {
- BOOST_TEST(test( "a2",
- (char_ << int_)[_1 = 'a', _2 = 2]
- ));
- fusion::vector<char, int> t('a', 2);
- BOOST_TEST(test( "a2",
- karma::format(char_ << int_, t)
- ));
- BOOST_TEST(test( "a 2 ",
- karma::format_delimited(char_ << int_, space, t)
- ));
- }
- using namespace boost::assign;
- {
- // output all elements of a vector
- std::vector<char> v;
- v += 'a', 'b', 'c';
- BOOST_TEST(test( "abc",
- (*char_)[_1 = v]
- ));
- BOOST_TEST(test( "abc",
- karma::format(*char_, v)
- ));
- BOOST_TEST(test( "a b c ",
- karma::format_delimited(*char_, space, v)
- ));
- BOOST_TEST(test( "abc",
- karma::format(v)
- ));
- BOOST_TEST(test( "a b c ",
- karma::format_delimited(v, space)
- ));
- // output a comma separated list of vector elements
- BOOST_TEST(test( "a, b, c",
- (char_ % lit(", "))[_0 = fusion::make_single_view(v)]
- ));
- BOOST_TEST(test( "a, b, c",
- karma::format((char_ % lit(", "))[_0 = fusion::make_single_view(v)])
- ));
- BOOST_TEST(test( "a , b , c ",
- karma::format_delimited((char_ % ',')[_0 = fusion::make_single_view(v)], space)
- ));
- BOOST_TEST(test( "a,b,c",
- karma::format(char_ % ',', v)
- ));
- BOOST_TEST(test( "a , b , c ",
- karma::format_delimited(char_ % ',', space, v)
- ));
- // output all elements of a list
- std::list<char> l;
- l += 'a', 'b', 'c';
- // BOOST_TEST(test( "abc",
- // (*char_)[_1 = l]
- // ));
- // BOOST_TEST(test( "abc",
- // karma::format((*char_)[_1 = l])
- // ));
- // BOOST_TEST(test( "a b c ",
- // karma::format_delimited((*char_)[_1 = l], space)
- // ));
- BOOST_TEST(test( "abc",
- karma::format(*char_, l)
- ));
- BOOST_TEST(test( "a b c ",
- karma::format_delimited(*char_, space, l)
- ));
- BOOST_TEST(test( "abc",
- karma::format(l)
- ));
- BOOST_TEST(test( "a b c ",
- karma::format_delimited(l, space)
- ));
- }
- return boost::report_errors();
- }
|