attr_attribute_value_set.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. * Copyright Andrey Semashev 2007 - 2015.
  3. * Distributed under the Boost Software License, Version 1.0.
  4. * (See accompanying file LICENSE_1_0.txt or copy at
  5. * http://www.boost.org/LICENSE_1_0.txt)
  6. */
  7. /*!
  8. * \file attr_attribute_value_set.cpp
  9. * \author Andrey Semashev
  10. * \date 24.01.2009
  11. *
  12. * \brief This header contains tests for the attribute value set.
  13. */
  14. #define BOOST_TEST_MODULE attr_attribute_value_set
  15. #include <vector>
  16. #include <string>
  17. #include <sstream>
  18. #include <utility>
  19. #include <iterator>
  20. #include <boost/config.hpp>
  21. #include <boost/test/unit_test.hpp>
  22. #include <boost/test/tools//floating_point_comparison.hpp>
  23. #include <boost/log/attributes/constant.hpp>
  24. #include <boost/log/attributes/attribute_set.hpp>
  25. #include <boost/log/attributes/attribute_value_set.hpp>
  26. #include <boost/log/attributes/value_visitation.hpp>
  27. #include <boost/log/utility/type_dispatch/static_type_dispatcher.hpp>
  28. #include "char_definitions.hpp"
  29. namespace logging = boost::log;
  30. namespace attrs = logging::attributes;
  31. namespace {
  32. //! A simple attribute value receiver functional object
  33. template< typename T >
  34. struct receiver
  35. {
  36. typedef void result_type;
  37. receiver(T& val) : m_Val(val) {}
  38. result_type operator() (T const& val) const
  39. {
  40. m_Val = val;
  41. }
  42. private:
  43. T& m_Val;
  44. };
  45. //! The function extracts attribute value
  46. template< typename T >
  47. inline bool get_attr_value(logging::attribute_value const& val, T& res)
  48. {
  49. receiver< T > r(res);
  50. logging::static_type_dispatcher< T > disp(r);
  51. return val.dispatch(disp);
  52. }
  53. } // namespace
  54. // The test checks construction and assignment
  55. BOOST_AUTO_TEST_CASE(construction)
  56. {
  57. typedef logging::attribute_set attr_set;
  58. typedef logging::attribute_value_set attr_values;
  59. typedef test_data< char > data;
  60. attrs::constant< int > attr1(10);
  61. attrs::constant< double > attr2(5.5);
  62. attrs::constant< std::string > attr3("Hello, world!");
  63. attrs::constant< char > attr4('L');
  64. {
  65. attr_set set1, set2, set3;
  66. set1[data::attr1()] = attr1;
  67. set1[data::attr2()] = attr2;
  68. set1[data::attr3()] = attr3;
  69. attr_values view1(set1, set2, set3);
  70. view1.freeze();
  71. BOOST_CHECK(!view1.empty());
  72. BOOST_CHECK_EQUAL(view1.size(), 3UL);
  73. }
  74. {
  75. attr_set set1, set2, set3;
  76. set1[data::attr1()] = attr1;
  77. set2[data::attr2()] = attr2;
  78. set3[data::attr3()] = attr3;
  79. attr_values view1(set1, set2, set3);
  80. view1.freeze();
  81. BOOST_CHECK(!view1.empty());
  82. BOOST_CHECK_EQUAL(view1.size(), 3UL);
  83. attr_values view2 = view1;
  84. BOOST_CHECK(!view2.empty());
  85. BOOST_CHECK_EQUAL(view2.size(), 3UL);
  86. }
  87. // Check that the more prioritized attributes replace the less ones
  88. {
  89. attrs::constant< int > attr2_2(20);
  90. attrs::constant< double > attr4_2(10.3);
  91. attrs::constant< float > attr3_3(static_cast< float >(-7.2));
  92. attrs::constant< unsigned int > attr4_3(5);
  93. attr_set set1, set2, set3;
  94. set3[data::attr1()] = attr1;
  95. set3[data::attr2()] = attr2;
  96. set3[data::attr3()] = attr3;
  97. set3[data::attr4()] = attr4;
  98. set2[data::attr2()] = attr2_2;
  99. set2[data::attr4()] = attr4_2;
  100. set1[data::attr3()] = attr3_3;
  101. set1[data::attr4()] = attr4_3;
  102. attr_values view1(set1, set2, set3);
  103. view1.freeze();
  104. BOOST_CHECK(!view1.empty());
  105. BOOST_CHECK_EQUAL(view1.size(), 4UL);
  106. int n = 0;
  107. BOOST_CHECK(logging::visit< int >(data::attr1(), view1, receiver< int >(n)));
  108. BOOST_CHECK_EQUAL(n, 10);
  109. BOOST_CHECK(logging::visit< int >(data::attr2(), view1, receiver< int >(n)));
  110. BOOST_CHECK_EQUAL(n, 20);
  111. float f = static_cast< float >(0.0);
  112. BOOST_CHECK(logging::visit< float >(data::attr3(), view1, receiver< float >(f)));
  113. BOOST_CHECK_CLOSE(f, static_cast< float >(-7.2), static_cast< float >(0.001));
  114. unsigned int m = 0;
  115. BOOST_CHECK(logging::visit< unsigned int >(data::attr4(), view1, receiver< unsigned int >(m)));
  116. BOOST_CHECK_EQUAL(m, 5U);
  117. }
  118. }
  119. // The test checks lookup methods
  120. BOOST_AUTO_TEST_CASE(lookup)
  121. {
  122. typedef logging::attribute_set attr_set;
  123. typedef logging::attribute_value_set attr_values;
  124. typedef test_data< char > data;
  125. typedef std::basic_string< char > string;
  126. attrs::constant< int > attr1(10);
  127. attrs::constant< double > attr2(5.5);
  128. attrs::constant< std::string > attr3("Hello, world!");
  129. attr_set set1, set2, set3;
  130. set1[data::attr1()] = attr1;
  131. set1[data::attr2()] = attr2;
  132. set1[data::attr3()] = attr3;
  133. attr_values view1(set1, set2, set3);
  134. view1.freeze();
  135. // Traditional find methods
  136. attr_values::const_iterator it = view1.find(data::attr1());
  137. BOOST_CHECK(it != view1.end());
  138. BOOST_CHECK(it->first == data::attr1());
  139. int val1 = 0;
  140. BOOST_CHECK(get_attr_value(it->second, val1));
  141. BOOST_CHECK_EQUAL(val1, 10);
  142. string s1 = data::attr2();
  143. it = view1.find(s1);
  144. BOOST_CHECK(it != view1.end());
  145. BOOST_CHECK(it->first == data::attr2());
  146. double val2 = 0;
  147. BOOST_CHECK(get_attr_value(it->second, val2));
  148. BOOST_CHECK_CLOSE(val2, 5.5, 0.001);
  149. it = view1.find(data::attr3());
  150. BOOST_CHECK(it != view1.end());
  151. BOOST_CHECK(it->first == data::attr3());
  152. std::string val3;
  153. BOOST_CHECK(get_attr_value(it->second, val3));
  154. BOOST_CHECK_EQUAL(val3, "Hello, world!");
  155. // make an additional check that the result is absent if the value type does not match the requested type
  156. BOOST_CHECK(!get_attr_value(it->second, val2));
  157. it = view1.find(data::attr4());
  158. BOOST_CHECK(it == view1.end());
  159. // Subscript operator
  160. logging::attribute_value p = view1[data::attr1()];
  161. BOOST_CHECK_EQUAL(view1.size(), 3UL);
  162. BOOST_CHECK(!!p);
  163. BOOST_CHECK(get_attr_value(p, val1));
  164. BOOST_CHECK_EQUAL(val1, 10);
  165. p = view1[s1];
  166. BOOST_CHECK_EQUAL(view1.size(), 3UL);
  167. BOOST_CHECK(!!p);
  168. BOOST_CHECK(get_attr_value(p, val2));
  169. BOOST_CHECK_CLOSE(val2, 5.5, 0.001);
  170. p = view1[data::attr3()];
  171. BOOST_CHECK_EQUAL(view1.size(), 3UL);
  172. BOOST_CHECK(!!p);
  173. BOOST_CHECK(get_attr_value(p, val3));
  174. BOOST_CHECK_EQUAL(val3, "Hello, world!");
  175. p = view1[data::attr4()];
  176. BOOST_CHECK(!p);
  177. BOOST_CHECK_EQUAL(view1.size(), 3UL);
  178. // Counting elements
  179. BOOST_CHECK_EQUAL(view1.count(data::attr1()), 1UL);
  180. BOOST_CHECK_EQUAL(view1.count(s1), 1UL);
  181. BOOST_CHECK_EQUAL(view1.count(data::attr3()), 1UL);
  182. BOOST_CHECK_EQUAL(view1.count(data::attr4()), 0UL);
  183. }
  184. // The test checks size method
  185. BOOST_AUTO_TEST_CASE(size)
  186. {
  187. typedef logging::attribute_value_set attr_values;
  188. attrs::constant< int > attr1(10);
  189. attr_values view;
  190. view.freeze();
  191. unsigned int i = 0;
  192. for (; i < 100; ++i)
  193. {
  194. std::ostringstream strm;
  195. strm << "Attr" << i;
  196. view.insert(attr_values::key_type(strm.str()), attr1.get_value());
  197. }
  198. BOOST_CHECK_EQUAL(view.size(), i);
  199. }