xpressive/test/test_format.cpp
2014-01-11 00:36:40 -08:00

134 lines
4.0 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// test_format.hpp
//
// Copyright 2008 Eric Niebler. 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)
//
// Test all the different ways to call regex_replace with a formatter.
#include <map>
#include <string>
#include <boost/test/unit_test.hpp>
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
std::map<std::string, std::string> replacements;
struct format1
{
template<typename BidiIter>
std::string operator()(match_results<BidiIter> const &what) const
{
return replacements[what[1].str()];
}
};
struct format2
{
template<typename BidiIter, typename OutIter>
OutIter operator()(match_results<BidiIter> const &what, OutIter out) const
{
std::map<std::string, std::string>::const_iterator where = replacements.find(what[1].str());
if(where != replacements.end())
out = std::copy((*where).second.begin(), (*where).second.end(), out);
return out;
}
};
struct format3
{
template<typename BidiIter, typename OutIter>
OutIter operator()(match_results<BidiIter> const &what, OutIter out, regex_constants::match_flag_type) const
{
std::map<std::string, std::string>::const_iterator where = replacements.find(what[1].str());
if(where != replacements.end())
out = std::copy((*where).second.begin(), (*where).second.end(), out);
return out;
}
};
std::string format_fun(smatch const &what)
{
return replacements[what[1].str()];
}
std::string c_format_fun(cmatch const &what)
{
return replacements[what[1].str()];
}
void test_main()
{
replacements["X"] = "this";
replacements["Y"] = "that";
std::string input("\"$(X)\" has the value \"$(Y)\""), output;
sregex rx = sregex::compile("\\$\\(([^\\)]+)\\)");
cregex crx = cregex::compile("\\$\\(([^\\)]+)\\)");
std::string result("\"this\" has the value \"that\"");
output = regex_replace(input, rx, format1());
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input.c_str(), crx, format1());
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input, rx, format2());
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input.c_str(), crx, format2());
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input, rx, format3());
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input.c_str(), crx, format3());
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input, rx, format_fun);
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input.c_str(), crx, c_format_fun);
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input, rx, &format_fun);
BOOST_CHECK_EQUAL(output, result);
output = regex_replace(input.c_str(), crx, &c_format_fun);
BOOST_CHECK_EQUAL(output, result);
output.clear();
regex_replace(std::back_inserter(output), input.begin(), input.end(), rx, format1());
BOOST_CHECK_EQUAL(output, result);
output.clear();
regex_replace(std::back_inserter(output), input.begin(), input.end(), rx, format2());
BOOST_CHECK_EQUAL(output, result);
output.clear();
regex_replace(std::back_inserter(output), input.begin(), input.end(), rx, format2());
BOOST_CHECK_EQUAL(output, result);
output.clear();
regex_replace(std::back_inserter(output), input.begin(), input.end(), rx, format_fun);
BOOST_CHECK_EQUAL(output, result);
output.clear();
regex_replace(std::back_inserter(output), input.begin(), input.end(), rx, &format_fun);
BOOST_CHECK_EQUAL(output, result);
}
using namespace boost::unit_test;
///////////////////////////////////////////////////////////////////////////////
// init_unit_test_suite
//
test_suite* init_unit_test_suite( int argc, char* argv[] )
{
test_suite *test = BOOST_TEST_SUITE("test_format");
test->add(BOOST_TEST_CASE(&test_main));
return test;
}