2 // Copyright 2008-2009 Daniel James.
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 #define BOOST_UNORDERED_DEPRECATED_EQUALITY
8 #include "../helpers/prefix.hpp"
10 #include <boost/unordered_set.hpp>
11 #include <boost/unordered_map.hpp>
12 #include <boost/preprocessor/seq.hpp>
14 #include "../helpers/test.hpp"
16 namespace equality_tests
22 explicit mod_compare(bool alt_hash = false) : alt_hash_(alt_hash) {}
24 bool operator()(int x, int y) const
26 return x % 1000 == y % 1000;
29 int operator()(int x) const
31 return alt_hash_ ? x % 250 : (x + 5) % 250;
35 #define UNORDERED_EQUALITY_SET_TEST(seq1, op, seq2) \
37 boost::unordered_set<int, mod_compare, mod_compare> set1, set2; \
38 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set1, seq1) \
39 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set2, seq2) \
40 BOOST_TEST(set1 op set2); \
43 #define UNORDERED_EQUALITY_MULTISET_TEST(seq1, op, seq2) \
45 boost::unordered_multiset<int, mod_compare, mod_compare> \
47 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set1, seq1) \
48 BOOST_PP_SEQ_FOR_EACH(UNORDERED_SET_INSERT, set2, seq2) \
49 BOOST_TEST(set1 op set2); \
52 #define UNORDERED_EQUALITY_MAP_TEST(seq1, op, seq2) \
54 boost::unordered_map<int, int, mod_compare, mod_compare> \
56 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map1, seq1) \
57 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map2, seq2) \
58 BOOST_TEST(map1 op map2); \
61 #define UNORDERED_EQUALITY_MULTIMAP_TEST(seq1, op, seq2) \
63 boost::unordered_multimap<int, int, mod_compare, mod_compare> \
65 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map1, seq1) \
66 BOOST_PP_SEQ_FOR_EACH(UNORDERED_MAP_INSERT, map2, seq2) \
67 BOOST_TEST(map1 op map2); \
70 #define UNORDERED_SET_INSERT(r, set, item) set.insert(item);
71 #define UNORDERED_MAP_INSERT(r, map, item) \
72 map.insert(std::pair<int const, int> BOOST_PP_SEQ_TO_TUPLE(item));
74 UNORDERED_AUTO_TEST(equality_size_tests)
76 boost::unordered_set<int> x1, x2;
78 BOOST_TEST(!(x1 != x2));
82 BOOST_TEST(!(x1 == x2));
84 BOOST_TEST(!(x2 == x1));
88 BOOST_TEST(!(x1 != x2));
92 BOOST_TEST(!(x1 == x2));
94 BOOST_TEST(!(x2 == x1));
97 UNORDERED_AUTO_TEST(equality_key_value_tests)
99 UNORDERED_EQUALITY_MULTISET_TEST((1), !=, (2))
100 UNORDERED_EQUALITY_SET_TEST((2), ==, (2))
101 UNORDERED_EQUALITY_MAP_TEST(((1)(1))((2)(1)), !=, ((1)(1))((3)(1)))
104 UNORDERED_AUTO_TEST(equality_collision_test)
106 UNORDERED_EQUALITY_MULTISET_TEST(
108 UNORDERED_EQUALITY_MULTISET_TEST(
109 (1)(251), !=, (1)(501))
110 UNORDERED_EQUALITY_MULTIMAP_TEST(
111 ((251)(1))((1)(1)), !=, ((501)(1))((1)(1)))
112 UNORDERED_EQUALITY_MULTISET_TEST(
113 (1)(501), ==, (1)(501))
114 UNORDERED_EQUALITY_SET_TEST(
115 (1)(501), ==, (501)(1))
118 UNORDERED_AUTO_TEST(equality_group_size_test)
120 UNORDERED_EQUALITY_MULTISET_TEST(
121 (10)(20)(20), !=, (10)(10)(20))
122 UNORDERED_EQUALITY_MULTIMAP_TEST(
123 ((10)(1))((20)(1))((20)(1)), !=,
124 ((10)(1))((20)(1))((10)(1)))
125 UNORDERED_EQUALITY_MULTIMAP_TEST(
126 ((20)(1))((10)(1))((10)(1)), ==,
127 ((10)(1))((20)(1))((10)(1)))
130 UNORDERED_AUTO_TEST(equality_map_value_test)
132 UNORDERED_EQUALITY_MAP_TEST(
133 ((1)(1)), !=, ((1)(2)))
134 UNORDERED_EQUALITY_MAP_TEST(
135 ((1)(1)), ==, ((1)(1)))
136 UNORDERED_EQUALITY_MULTIMAP_TEST(
137 ((1)(1)), !=, ((1)(2)))
138 UNORDERED_EQUALITY_MULTIMAP_TEST(
139 ((1)(1))((1)(1)), !=, ((1)(1))((1)(2)))
140 UNORDERED_EQUALITY_MULTIMAP_TEST(
141 ((1)(2))((1)(1)), !=, ((1)(1))((1)(2)))
144 UNORDERED_AUTO_TEST(equality_predicate_test)
146 UNORDERED_EQUALITY_SET_TEST(
148 UNORDERED_EQUALITY_MAP_TEST(
149 ((1)(2))((1001)(1)), ==, ((1001)(2))((1)(1)))
152 // Test that equality still works when the two containers have
153 // different hash functions but the same equality predicate.
155 UNORDERED_AUTO_TEST(equality_different_hash_test)
157 typedef boost::unordered_set<int, mod_compare, mod_compare> set;
158 set set1(0, mod_compare(false), mod_compare(false));
159 set set2(0, mod_compare(true), mod_compare(true));
160 BOOST_TEST(set1 == set2);
161 set1.insert(1); set2.insert(2);
162 BOOST_TEST(set1 != set2);
163 set1.insert(2); set2.insert(1);
164 BOOST_TEST(set1 == set2);
165 set1.insert(10); set2.insert(20);
166 BOOST_TEST(set1 != set2);
167 set1.insert(20); set2.insert(10);
168 BOOST_TEST(set1 == set2);