Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The inserted attributes and attribute values could sometimes be left not-findable by find() method and other methods that rely on it. The elements were still obtainable through iteration.
- Loading branch information
Showing
3 changed files
with
140 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* | ||
* Copyright Andrey Semashev 2007 - 2014. | ||
* 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()); | ||
} |