2 // Copyright 2016 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 #include "../helpers/postfix.hpp"
7 #include "../helpers/prefix.hpp"
8 #include <boost/unordered_map.hpp>
9 #include <boost/unordered_set.hpp>
11 #include "../helpers/count.hpp"
12 #include "../helpers/helpers.hpp"
13 #include "../helpers/invariants.hpp"
14 #include "../helpers/random_values.hpp"
15 #include "../helpers/test.hpp"
16 #include "../helpers/tracker.hpp"
17 #include "../objects/test.hpp"
19 namespace merge_tests
{
21 UNORDERED_AUTO_TEST (merge_set
) {
22 boost::unordered_set
<int> x
;
23 boost::unordered_set
<int> y
;
26 BOOST_TEST(x
.empty());
27 BOOST_TEST(y
.empty());
31 BOOST_TEST(x
.size() == 1);
32 BOOST_TEST(x
.count(10) == 1);
33 BOOST_TEST(y
.empty());
36 BOOST_TEST(x
.empty());
37 BOOST_TEST(y
.size() == 1);
38 BOOST_TEST(y
.count(10) == 1);
45 BOOST_TEST_EQ(x
.size(), 4u);
46 BOOST_TEST_EQ(y
.size(), 1u);
47 BOOST_TEST_EQ(x
.count(10), 1u);
48 BOOST_TEST_EQ(x
.count(50), 1u);
49 BOOST_TEST_EQ(x
.count(70), 1u);
50 BOOST_TEST_EQ(x
.count(80), 1u);
51 BOOST_TEST_EQ(y
.count(10), 1u);
52 BOOST_TEST_EQ(y
.count(50), 0u);
53 BOOST_TEST_EQ(y
.count(70), 0u);
54 BOOST_TEST_EQ(y
.count(80), 0u);
56 test::check_equivalent_keys(x
);
57 test::check_equivalent_keys(y
);
60 UNORDERED_AUTO_TEST (merge_multiset
) {
61 boost::unordered_multiset
<int> x
;
62 boost::unordered_multiset
<int> y
;
65 BOOST_TEST(x
.empty());
66 BOOST_TEST(y
.empty());
70 BOOST_TEST(x
.size() == 1);
71 BOOST_TEST(x
.count(10) == 1);
72 BOOST_TEST(y
.empty());
75 BOOST_TEST(x
.empty());
76 BOOST_TEST(y
.size() == 1);
77 BOOST_TEST(y
.count(10) == 1);
84 BOOST_TEST_EQ(x
.size(), 5u);
85 BOOST_TEST_EQ(y
.size(), 0u);
86 BOOST_TEST_EQ(x
.count(10), 2u);
87 BOOST_TEST_EQ(x
.count(50), 1u);
88 BOOST_TEST_EQ(x
.count(70), 1u);
89 BOOST_TEST_EQ(x
.count(80), 1u);
90 BOOST_TEST_EQ(y
.count(10), 0u);
91 BOOST_TEST_EQ(y
.count(50), 0u);
92 BOOST_TEST_EQ(y
.count(70), 0u);
93 BOOST_TEST_EQ(y
.count(80), 0u);
95 test::check_equivalent_keys(x
);
96 test::check_equivalent_keys(y
);
99 UNORDERED_AUTO_TEST (merge_set_and_multiset
) {
100 boost::unordered_set
<int> x
;
101 boost::unordered_multiset
<int> y
;
104 BOOST_TEST(x
.empty());
105 BOOST_TEST(y
.empty());
109 BOOST_TEST(x
.size() == 1);
110 BOOST_TEST(x
.count(10) == 1);
111 BOOST_TEST(y
.empty());
114 BOOST_TEST(x
.empty());
115 BOOST_TEST(y
.size() == 1);
116 BOOST_TEST(y
.count(10) == 1);
123 BOOST_TEST_EQ(x
.size(), 4u);
124 BOOST_TEST_EQ(y
.size(), 1u);
125 BOOST_TEST_EQ(x
.count(10), 1u);
126 BOOST_TEST_EQ(x
.count(50), 1u);
127 BOOST_TEST_EQ(x
.count(70), 1u);
128 BOOST_TEST_EQ(x
.count(80), 1u);
129 BOOST_TEST_EQ(y
.count(10), 1u);
130 BOOST_TEST_EQ(y
.count(50), 0u);
131 BOOST_TEST_EQ(y
.count(70), 0u);
132 BOOST_TEST_EQ(y
.count(80), 0u);
134 test::check_equivalent_keys(x
);
135 test::check_equivalent_keys(y
);
138 template <class X1
, class X2
>
139 void merge_empty_test(X1
*, X2
*, test::random_generator generator
)
141 test::check_instances check_
;
143 test::random_values
<X1
> v(1000, generator
);
144 X1
x1(v
.begin(), v
.end());
147 test::check_container(x1
, v
);
148 BOOST_TEST(x2
.empty());
149 test::check_equivalent_keys(x1
);
150 test::check_equivalent_keys(x2
);
154 void merge_into_empty_test(X
*, test::random_generator generator
)
156 test::check_instances check_
;
158 test::random_values
<X
> v(1000, generator
);
160 X
x2(v
.begin(), v
.end());
162 test::check_container(x1
, v
);
163 BOOST_TEST(x2
.empty());
164 test::check_equivalent_keys(x1
);
165 test::check_equivalent_keys(x2
);
168 template <class X1
, class X2
>
169 void merge_into_unique_keys_test(X1
*, X2
*, int hash_equal1
, int hash_equal2
,
170 test::random_generator generator
)
172 test::check_instances check_
;
174 test::random_values
<X1
> v1(1000, generator
);
175 test::random_values
<X2
> v2(1000, generator
);
176 v1
.insert(v2
.begin(), test::next(v2
.begin(), 100));
177 v2
.insert(v1
.begin(), test::next(v1
.begin(), 100));
179 X1
x1(v1
.begin(), v1
.end(), 0, test::hash(hash_equal1
),
180 test::equal_to(hash_equal1
));
181 X2
x2(v2
.begin(), v2
.end(), 0, test::hash(hash_equal2
),
182 test::equal_to(hash_equal2
));
184 test::ordered
<X1
> tracker1
= test::create_ordered(x1
);
185 test::ordered
<X2
> tracker2
= test::create_ordered(x2
);
186 tracker1
.insert(v1
.begin(), v1
.end());
187 for (typename
X2::iterator it
= x2
.begin(); it
!= x2
.end(); ++it
) {
188 if (!tracker1
.insert(*it
).second
) {
189 tracker2
.insert(*it
);
195 tracker1
.compare(x1
);
196 tracker2
.compare(x2
);
197 test::check_equivalent_keys(x1
);
198 test::check_equivalent_keys(x2
);
201 template <class X1
, class X2
>
202 void merge_into_equiv_keys_test(X1
*, X2
*, int hash_equal1
, int hash_equal2
,
203 test::random_generator generator
)
205 test::check_instances check_
;
207 test::random_values
<X1
> v1(1000, generator
);
208 test::random_values
<X2
> v2(1000, generator
);
209 v1
.insert(v2
.begin(), test::next(v2
.begin(), 100));
210 v2
.insert(v1
.begin(), test::next(v1
.begin(), 100));
212 X1
x1(v1
.begin(), v1
.end(), 0, test::hash(hash_equal1
),
213 test::equal_to(hash_equal1
));
214 X2
x2(v2
.begin(), v2
.end(), 0, test::hash(hash_equal2
),
215 test::equal_to(hash_equal2
));
218 test::ordered
<X1
> tracker1
= test::create_ordered(x1
);
219 test::ordered
<X2
> tracker2
= test::create_ordered(x2
);
220 tracker1
.insert(v1
.begin(), v1
.end());
221 tracker2
.insert(v2
.begin(), v2
.end());
222 tracker1
.insert(tracker2
.begin(), tracker2
.end());
225 tracker1
.compare(x1
);
226 tracker2
.compare(x2
);
227 test::check_equivalent_keys(x1
);
228 test::check_equivalent_keys(x2
);
231 boost::unordered_set
<test::movable
, test::hash
, test::equal_to
,
232 std::allocator
<test::movable
> >* test_set_std_alloc
;
233 boost::unordered_multiset
<test::movable
, test::hash
, test::equal_to
,
234 std::allocator
<test::movable
> >* test_multiset_std_alloc
;
236 boost::unordered_map
<test::object
, test::object
, test::hash
, test::equal_to
,
237 std::allocator
<test::object
> >* test_map_std_alloc
;
238 boost::unordered_multimap
<test::object
, test::object
, test::hash
,
239 test::equal_to
, std::allocator
<test::object
> >* test_multimap_std_alloc
;
241 boost::unordered_set
<test::object
, test::hash
, test::equal_to
,
242 test::allocator1
<test::object
> >* test_set
;
243 boost::unordered_multiset
<test::object
, test::hash
, test::equal_to
,
244 test::allocator1
<test::object
> >* test_multiset
;
246 boost::unordered_map
<test::movable
, test::movable
, test::hash
, test::equal_to
,
247 test::allocator2
<test::movable
> >* test_map
;
248 boost::unordered_multimap
<test::movable
, test::movable
, test::hash
,
249 test::equal_to
, test::allocator2
<test::movable
> >* test_multimap
;
251 using test::default_generator
;
252 using test::generate_collisions
;
255 UNORDERED_TEST(merge_empty_test
,
256 ((test_set_std_alloc
)(test_multiset_std_alloc
))
257 ((test_set_std_alloc
)(test_multiset_std_alloc
))
258 ((default_generator
)(generate_collisions
)))
259 UNORDERED_TEST(merge_empty_test
,
260 ((test_map_std_alloc
)(test_multimap_std_alloc
))
261 ((test_map_std_alloc
)(test_multimap_std_alloc
))
262 ((default_generator
)(generate_collisions
)))
263 UNORDERED_TEST(merge_empty_test
,
264 ((test_set
)(test_multiset
))
265 ((test_set
)(test_multiset
))
266 ((default_generator
)(generate_collisions
)))
267 UNORDERED_TEST(merge_empty_test
,
268 ((test_map
)(test_multimap
))
269 ((test_map
)(test_multimap
))
270 ((default_generator
)(generate_collisions
)))
272 UNORDERED_TEST(merge_into_empty_test
,
273 ((test_set_std_alloc
)(test_multiset_std_alloc
))
274 ((default_generator
)(generate_collisions
)))
275 UNORDERED_TEST(merge_into_empty_test
,
276 ((test_map_std_alloc
)(test_multimap_std_alloc
))
277 ((default_generator
)(generate_collisions
)))
278 UNORDERED_TEST(merge_into_empty_test
,
279 ((test_set
)(test_multiset
))
280 ((default_generator
)(generate_collisions
)))
281 UNORDERED_TEST(merge_into_empty_test
,
282 ((test_map
)(test_multimap
))
283 ((default_generator
)(generate_collisions
)))
285 UNORDERED_TEST(merge_into_unique_keys_test
,
286 ((test_set_std_alloc
))
287 ((test_set_std_alloc
)(test_multiset_std_alloc
))
290 ((default_generator
)(generate_collisions
)))
291 UNORDERED_TEST(merge_into_unique_keys_test
,
292 ((test_map_std_alloc
))
293 ((test_map_std_alloc
)(test_multimap_std_alloc
))
296 ((default_generator
)(generate_collisions
)))
297 UNORDERED_TEST(merge_into_unique_keys_test
,
299 ((test_set
)(test_multiset
))
302 ((default_generator
)(generate_collisions
)))
303 UNORDERED_TEST(merge_into_unique_keys_test
,
305 ((test_map
)(test_multimap
))
308 ((default_generator
)(generate_collisions
)))
310 UNORDERED_TEST(merge_into_equiv_keys_test
,
311 ((test_multiset_std_alloc
))
312 ((test_set_std_alloc
)(test_multiset_std_alloc
))
315 ((default_generator
)(generate_collisions
)))
316 UNORDERED_TEST(merge_into_equiv_keys_test
,
317 ((test_multimap_std_alloc
))
318 ((test_map_std_alloc
)(test_multimap_std_alloc
))
321 ((default_generator
)(generate_collisions
)))
322 UNORDERED_TEST(merge_into_equiv_keys_test
,
324 ((test_set
)(test_multiset
))
327 ((default_generator
)(generate_collisions
)))
328 UNORDERED_TEST(merge_into_equiv_keys_test
,
330 ((test_map
)(test_multimap
))
333 ((default_generator
)(generate_collisions
)))