hash_string_test.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // Copyright 2005-2009 Daniel James.
  2. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #include "./config.hpp"
  5. #ifdef BOOST_HASH_TEST_STD_INCLUDES
  6. # include <functional>
  7. #else
  8. # include <boost/container_hash/hash.hpp>
  9. #endif
  10. #include <boost/core/lightweight_test.hpp>
  11. #include <string>
  12. #include "./compile_time.hpp"
  13. void string_tests()
  14. {
  15. compile_time_tests((std::string*) 0);
  16. BOOST_HASH_TEST_NAMESPACE::hash<std::string> x1;
  17. BOOST_HASH_TEST_NAMESPACE::hash<std::string> x2;
  18. BOOST_TEST(x1("Hello") == x2(std::string("Hel") + "lo"));
  19. BOOST_TEST(x1("") == x2(std::string()));
  20. #if defined(BOOST_HASH_TEST_EXTENSIONS)
  21. std::string value1;
  22. std::string value2("Hello");
  23. BOOST_TEST(x1(value1) == BOOST_HASH_TEST_NAMESPACE::hash_value(value1));
  24. BOOST_TEST(x1(value2) == BOOST_HASH_TEST_NAMESPACE::hash_value(value2));
  25. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value1) ==
  26. BOOST_HASH_TEST_NAMESPACE::hash_range(value1.begin(), value1.end()));
  27. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value2) ==
  28. BOOST_HASH_TEST_NAMESPACE::hash_range(value2.begin(), value2.end()));
  29. #endif
  30. }
  31. void string0_tests()
  32. {
  33. std::string x1(1, '\0');
  34. std::string x2(2, '\0');
  35. std::string x3(3, '\0');
  36. std::string x4(10, '\0');
  37. BOOST_HASH_TEST_NAMESPACE::hash<std::string> hasher;
  38. BOOST_TEST(hasher(x1) != hasher(x2));
  39. BOOST_TEST(hasher(x1) != hasher(x3));
  40. BOOST_TEST(hasher(x1) != hasher(x4));
  41. BOOST_TEST(hasher(x2) != hasher(x3));
  42. BOOST_TEST(hasher(x2) != hasher(x4));
  43. BOOST_TEST(hasher(x3) != hasher(x4));
  44. }
  45. #if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
  46. void wstring_tests()
  47. {
  48. compile_time_tests((std::wstring*) 0);
  49. BOOST_HASH_TEST_NAMESPACE::hash<std::wstring> x1;
  50. BOOST_HASH_TEST_NAMESPACE::hash<std::wstring> x2;
  51. BOOST_TEST(x1(L"Hello") == x2(std::wstring(L"Hel") + L"lo"));
  52. BOOST_TEST(x1(L"") == x2(std::wstring()));
  53. #if defined(BOOST_HASH_TEST_EXTENSIONS)
  54. std::wstring value1;
  55. std::wstring value2(L"Hello");
  56. BOOST_TEST(x1(value1) == BOOST_HASH_TEST_NAMESPACE::hash_value(value1));
  57. BOOST_TEST(x1(value2) == BOOST_HASH_TEST_NAMESPACE::hash_value(value2));
  58. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value1) ==
  59. BOOST_HASH_TEST_NAMESPACE::hash_range(value1.begin(), value1.end()));
  60. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value2) ==
  61. BOOST_HASH_TEST_NAMESPACE::hash_range(value2.begin(), value2.end()));
  62. #endif
  63. }
  64. #endif
  65. #if !defined(BOOST_NO_CXX11_CHAR16_T)
  66. void u16string_tests()
  67. {
  68. compile_time_tests((std::u16string*) 0);
  69. BOOST_HASH_TEST_NAMESPACE::hash<std::u16string> x1;
  70. BOOST_HASH_TEST_NAMESPACE::hash<std::u16string> x2;
  71. BOOST_TEST(x1(u"Hello") == x2(std::u16string(u"Hel") + u"lo"));
  72. BOOST_TEST(x1(u"") == x2(std::u16string()));
  73. #if defined(BOOST_HASH_TEST_EXTENSIONS)
  74. std::u16string value1;
  75. std::u16string value2(u"Hello");
  76. BOOST_TEST(x1(value1) == BOOST_HASH_TEST_NAMESPACE::hash_value(value1));
  77. BOOST_TEST(x1(value2) == BOOST_HASH_TEST_NAMESPACE::hash_value(value2));
  78. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value1) ==
  79. BOOST_HASH_TEST_NAMESPACE::hash_range(value1.begin(), value1.end()));
  80. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value2) ==
  81. BOOST_HASH_TEST_NAMESPACE::hash_range(value2.begin(), value2.end()));
  82. #endif
  83. }
  84. #endif
  85. #if !defined(BOOST_NO_CXX11_CHAR32_T)
  86. void u32string_tests()
  87. {
  88. compile_time_tests((std::u32string*) 0);
  89. BOOST_HASH_TEST_NAMESPACE::hash<std::u32string> x1;
  90. BOOST_HASH_TEST_NAMESPACE::hash<std::u32string> x2;
  91. BOOST_TEST(x1(U"Hello") == x2(std::u32string(U"Hel") + U"lo"));
  92. BOOST_TEST(x1(U"") == x2(std::u32string()));
  93. #if defined(BOOST_HASH_TEST_EXTENSIONS)
  94. std::u32string value1;
  95. std::u32string value2(U"Hello");
  96. BOOST_TEST(x1(value1) == BOOST_HASH_TEST_NAMESPACE::hash_value(value1));
  97. BOOST_TEST(x1(value2) == BOOST_HASH_TEST_NAMESPACE::hash_value(value2));
  98. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value1) ==
  99. BOOST_HASH_TEST_NAMESPACE::hash_range(value1.begin(), value1.end()));
  100. BOOST_TEST(BOOST_HASH_TEST_NAMESPACE::hash_value(value2) ==
  101. BOOST_HASH_TEST_NAMESPACE::hash_range(value2.begin(), value2.end()));
  102. #endif
  103. }
  104. #endif
  105. template <typename StringType>
  106. void generic_string_tests(StringType*)
  107. {
  108. std::string x1(1, '\0');
  109. std::string x2(2, '\0');
  110. std::string x3(3, '\0');
  111. std::string x4(10, '\0');
  112. std::string x5 = x2 + "hello" + x2;
  113. StringType strings[] = {
  114. "",
  115. "hello",
  116. x1,
  117. x2,
  118. x3,
  119. x4,
  120. x5
  121. };
  122. std::size_t const strings_length = sizeof(strings) / sizeof(StringType);
  123. boost::hash<StringType> hash;
  124. for (std::size_t i = 0; i < strings_length; ++i) {
  125. std::size_t hash_i = hash(strings[i]);
  126. for (std::size_t j = 0; j < strings_length; ++j) {
  127. std::size_t hash_j = hash(strings[j]);
  128. BOOST_TEST((hash_i == hash_j) == (i == j));
  129. }
  130. }
  131. }
  132. int main()
  133. {
  134. string_tests();
  135. string0_tests();
  136. #if !defined(BOOST_NO_STD_WSTRING) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
  137. wstring_tests();
  138. #endif
  139. #if !defined(BOOST_NO_CXX11_CHAR16_T)
  140. u16string_tests();
  141. #endif
  142. #if !defined(BOOST_NO_CXX11_CHAR32_T)
  143. u32string_tests();
  144. #endif
  145. generic_string_tests((std::string*) 0);
  146. #if BOOST_HASH_HAS_STRING_VIEW
  147. generic_string_tests((std::string_view*) 0);
  148. #endif
  149. return boost::report_errors();
  150. }