spirit/test/karma/format_manip.cpp
2018-10-01 02:16:04 +03:00

216 lines
6.2 KiB
C++

// 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();
}