2014-06-21 18:54:11 +02:00
|
|
|
/*
|
2015-01-25 15:32:33 +01:00
|
|
|
* Copyright Andrey Semashev 2007 - 2015.
|
2014-06-21 18:54:11 +02:00
|
|
|
* 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)
|
|
|
|
*/
|
|
|
|
/*!
|
|
|
|
* \file attr_sets_insertion_lookup.cpp
|
|
|
|
* \author Andrey Semashev
|
|
|
|
* \date 21.06.2014
|
|
|
|
*
|
|
|
|
* \brief This header contains tests for the attribute and attribute value sets. This test performs special checks
|
|
|
|
* for insert() and find() methods that depend on the attribute name ids and the order in which
|
|
|
|
* insert() operations are invoked, see https://sourceforge.net/p/boost-log/discussion/710022/thread/e883db9a/.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define BOOST_TEST_MODULE attr_sets_insertion_lookup
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <sstream>
|
|
|
|
#include <boost/config.hpp>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <boost/log/attributes/constant.hpp>
|
|
|
|
#include <boost/log/attributes/attribute_set.hpp>
|
|
|
|
#include <boost/log/attributes/attribute_value_set.hpp>
|
|
|
|
|
|
|
|
namespace logging = boost::log;
|
|
|
|
namespace attrs = logging::attributes;
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
template< typename SetT, typename ValueT >
|
|
|
|
void test_insertion_lookup(SetT& values, ValueT const& value)
|
|
|
|
{
|
|
|
|
// Initialize attribute names. Each name will gain a consecutive id.
|
|
|
|
logging::attribute_name names[20];
|
|
|
|
for (unsigned int i = 0; i < sizeof(names) / sizeof(*names); ++i)
|
|
|
|
{
|
|
|
|
std::ostringstream strm;
|
|
|
|
strm << "Attr" << i;
|
|
|
|
names[i] = logging::attribute_name(strm.str());
|
|
|
|
}
|
|
|
|
|
|
|
|
// Insert attribute values in this exact order so that different cases in the hash table implementation are tested.
|
|
|
|
values.insert(names[17], value);
|
|
|
|
values.insert(names[1], value);
|
|
|
|
values.insert(names[8], value);
|
|
|
|
values.insert(names[9], value);
|
|
|
|
values.insert(names[10], value);
|
|
|
|
values.insert(names[16], value);
|
|
|
|
values.insert(names[0], value);
|
|
|
|
values.insert(names[11], value);
|
|
|
|
values.insert(names[12], value);
|
|
|
|
values.insert(names[13], value);
|
|
|
|
values.insert(names[14], value);
|
|
|
|
values.insert(names[15], value);
|
|
|
|
values.insert(names[18], value);
|
|
|
|
values.insert(names[19], value);
|
|
|
|
values.insert(names[4], value);
|
|
|
|
values.insert(names[5], value);
|
|
|
|
values.insert(names[7], value);
|
|
|
|
values.insert(names[6], value);
|
|
|
|
values.insert(names[2], value);
|
|
|
|
values.insert(names[3], value);
|
|
|
|
|
|
|
|
// Check that all values are accessible through iteration and find()
|
|
|
|
for (unsigned int i = 0; i < sizeof(names) / sizeof(*names); ++i)
|
|
|
|
{
|
|
|
|
BOOST_CHECK_MESSAGE(values.find(names[i]) != values.end(), "Attribute " << names[i] << " (id: " << names[i].id() << ") not found by find()");
|
|
|
|
|
|
|
|
bool found_by_iteration = false;
|
|
|
|
for (typename SetT::const_iterator it = values.begin(), end = values.end(); it != end; ++it)
|
|
|
|
{
|
|
|
|
if (it->first == names[i])
|
|
|
|
{
|
|
|
|
found_by_iteration = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_CHECK_MESSAGE(found_by_iteration, "Attribute " << names[i] << " (id: " << names[i].id() << ") not found by iteration");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(attributes)
|
|
|
|
{
|
|
|
|
logging::attribute_set values;
|
|
|
|
attrs::constant< int > attr(10);
|
|
|
|
|
|
|
|
test_insertion_lookup(values, attr);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(attribute_values)
|
|
|
|
{
|
|
|
|
logging::attribute_value_set values;
|
|
|
|
attrs::constant< int > attr(10);
|
|
|
|
|
|
|
|
test_insertion_lookup(values, attr.get_value());
|
|
|
|
}
|