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"
18 #include <boost/next_prior.hpp>
20 namespace merge_tests
{
22 UNORDERED_AUTO_TEST (merge_set
) {
23 boost::unordered_set
<int> x
;
24 boost::unordered_set
<int> y
;
27 BOOST_TEST(x
.empty());
28 BOOST_TEST(y
.empty());
32 BOOST_TEST(x
.size() == 1);
33 BOOST_TEST(x
.count(10) == 1);
34 BOOST_TEST(y
.empty());
37 BOOST_TEST(x
.empty());
38 BOOST_TEST(y
.size() == 1);
39 BOOST_TEST(y
.count(10) == 1);
46 BOOST_TEST_EQ(x
.size(), 4u);
47 BOOST_TEST_EQ(y
.size(), 1u);
48 BOOST_TEST_EQ(x
.count(10), 1u);
49 BOOST_TEST_EQ(x
.count(50), 1u);
50 BOOST_TEST_EQ(x
.count(70), 1u);
51 BOOST_TEST_EQ(x
.count(80), 1u);
52 BOOST_TEST_EQ(y
.count(10), 1u);
53 BOOST_TEST_EQ(y
.count(50), 0u);
54 BOOST_TEST_EQ(y
.count(70), 0u);
55 BOOST_TEST_EQ(y
.count(80), 0u);
57 test::check_equivalent_keys(x
);
58 test::check_equivalent_keys(y
);
61 UNORDERED_AUTO_TEST (merge_multiset
) {
62 boost::unordered_multiset
<int> x
;
63 boost::unordered_multiset
<int> y
;
66 BOOST_TEST(x
.empty());
67 BOOST_TEST(y
.empty());
71 BOOST_TEST(x
.size() == 1);
72 BOOST_TEST(x
.count(10) == 1);
73 BOOST_TEST(y
.empty());
76 BOOST_TEST(x
.empty());
77 BOOST_TEST(y
.size() == 1);
78 BOOST_TEST(y
.count(10) == 1);
85 BOOST_TEST_EQ(x
.size(), 5u);
86 BOOST_TEST_EQ(y
.size(), 0u);
87 BOOST_TEST_EQ(x
.count(10), 2u);
88 BOOST_TEST_EQ(x
.count(50), 1u);
89 BOOST_TEST_EQ(x
.count(70), 1u);
90 BOOST_TEST_EQ(x
.count(80), 1u);
91 BOOST_TEST_EQ(y
.count(10), 0u);
92 BOOST_TEST_EQ(y
.count(50), 0u);
93 BOOST_TEST_EQ(y
.count(70), 0u);
94 BOOST_TEST_EQ(y
.count(80), 0u);
96 test::check_equivalent_keys(x
);
97 test::check_equivalent_keys(y
);
100 UNORDERED_AUTO_TEST (merge_set_and_multiset
) {
101 boost::unordered_set
<int> x
;
102 boost::unordered_multiset
<int> y
;
105 BOOST_TEST(x
.empty());
106 BOOST_TEST(y
.empty());
110 BOOST_TEST(x
.size() == 1);
111 BOOST_TEST(x
.count(10) == 1);
112 BOOST_TEST(y
.empty());
115 BOOST_TEST(x
.empty());
116 BOOST_TEST(y
.size() == 1);
117 BOOST_TEST(y
.count(10) == 1);
124 BOOST_TEST_EQ(x
.size(), 4u);
125 BOOST_TEST_EQ(y
.size(), 1u);
126 BOOST_TEST_EQ(x
.count(10), 1u);
127 BOOST_TEST_EQ(x
.count(50), 1u);
128 BOOST_TEST_EQ(x
.count(70), 1u);
129 BOOST_TEST_EQ(x
.count(80), 1u);
130 BOOST_TEST_EQ(y
.count(10), 1u);
131 BOOST_TEST_EQ(y
.count(50), 0u);
132 BOOST_TEST_EQ(y
.count(70), 0u);
133 BOOST_TEST_EQ(y
.count(80), 0u);
135 test::check_equivalent_keys(x
);
136 test::check_equivalent_keys(y
);
139 template <class X1
, class X2
>
140 void merge_empty_test(X1
*, X2
*, test::random_generator generator
)
142 test::check_instances check_
;
144 test::random_values
<X1
> v(1000, generator
);
145 X1
x1(v
.begin(), v
.end());
148 test::check_container(x1
, v
);
149 BOOST_TEST(x2
.empty());
150 test::check_equivalent_keys(x1
);
151 test::check_equivalent_keys(x2
);
155 void merge_into_empty_test(X
*, test::random_generator generator
)
157 test::check_instances check_
;
159 test::random_values
<X
> v(1000, generator
);
161 X
x2(v
.begin(), v
.end());
163 test::check_container(x1
, v
);
164 BOOST_TEST(x2
.empty());
165 test::check_equivalent_keys(x1
);
166 test::check_equivalent_keys(x2
);
169 template <class X1
, class X2
>
170 void merge_into_unique_keys_test(X1
*, X2
*, int hash_equal1
, int hash_equal2
,
171 test::random_generator generator
)
173 test::check_instances check_
;
175 test::random_values
<X1
> v1(1000, generator
);
176 test::random_values
<X2
> v2(1000, generator
);
177 v1
.insert(v2
.begin(), boost::next(v2
.begin(), 100));
178 v2
.insert(v1
.begin(), boost::next(v1
.begin(), 100));
180 X1
x1(v1
.begin(), v1
.end(), 0, test::hash(hash_equal1
),
181 test::equal_to(hash_equal1
));
182 X2
x2(v2
.begin(), v2
.end(), 0, test::hash(hash_equal2
),
183 test::equal_to(hash_equal2
));
185 test::ordered
<X1
> tracker1
= test::create_ordered(x1
);
186 test::ordered
<X2
> tracker2
= test::create_ordered(x2
);
187 tracker1
.insert(v1
.begin(), v1
.end());
188 for (typename
X2::iterator it
= x2
.begin(); it
!= x2
.end(); ++it
) {
189 if (!tracker1
.insert(*it
).second
) {
190 tracker2
.insert(*it
);
196 tracker1
.compare(x1
);
197 tracker2
.compare(x2
);
198 test::check_equivalent_keys(x1
);
199 test::check_equivalent_keys(x2
);
202 template <class X1
, class X2
>
203 void merge_into_equiv_keys_test(X1
*, X2
*, int hash_equal1
, int hash_equal2
,
204 test::random_generator generator
)
206 test::check_instances check_
;
208 test::random_values
<X1
> v1(1000, generator
);
209 test::random_values
<X2
> v2(1000, generator
);
210 v1
.insert(v2
.begin(), boost::next(v2
.begin(), 100));
211 v2
.insert(v1
.begin(), boost::next(v1
.begin(), 100));
213 X1
x1(v1
.begin(), v1
.end(), 0, test::hash(hash_equal1
),
214 test::equal_to(hash_equal1
));
215 X2
x2(v2
.begin(), v2
.end(), 0, test::hash(hash_equal2
),
216 test::equal_to(hash_equal2
));
219 test::ordered
<X1
> tracker1
= test::create_ordered(x1
);
220 test::ordered
<X2
> tracker2
= test::create_ordered(x2
);
221 tracker1
.insert(v1
.begin(), v1
.end());
222 tracker2
.insert(v2
.begin(), v2
.end());
223 tracker1
.insert(tracker2
.begin(), tracker2
.end());
226 tracker1
.compare(x1
);
227 tracker2
.compare(x2
);
228 test::check_equivalent_keys(x1
);
229 test::check_equivalent_keys(x2
);
232 boost::unordered_set
<test::movable
, test::hash
, test::equal_to
,
233 std::allocator
<test::movable
> >* test_set_std_alloc
;
234 boost::unordered_multiset
<test::movable
, test::hash
, test::equal_to
,
235 std::allocator
<test::movable
> >* test_multiset_std_alloc
;
237 boost::unordered_map
<test::object
, test::object
, test::hash
, test::equal_to
,
238 std::allocator
<test::object
> >* test_map_std_alloc
;
239 boost::unordered_multimap
<test::object
, test::object
, test::hash
,
240 test::equal_to
, std::allocator
<test::object
> >* test_multimap_std_alloc
;
242 boost::unordered_set
<test::object
, test::hash
, test::equal_to
,
243 test::allocator1
<test::object
> >* test_set
;
244 boost::unordered_multiset
<test::object
, test::hash
, test::equal_to
,
245 test::allocator1
<test::object
> >* test_multiset
;
247 boost::unordered_map
<test::movable
, test::movable
, test::hash
, test::equal_to
,
248 test::allocator2
<test::movable
> >* test_map
;
249 boost::unordered_multimap
<test::movable
, test::movable
, test::hash
,
250 test::equal_to
, test::allocator2
<test::movable
> >* test_multimap
;
252 using test::default_generator
;
253 using test::generate_collisions
;
256 UNORDERED_TEST(merge_empty_test
,
257 ((test_set_std_alloc
)(test_multiset_std_alloc
))
258 ((test_set_std_alloc
)(test_multiset_std_alloc
))
259 ((default_generator
)(generate_collisions
)))
260 UNORDERED_TEST(merge_empty_test
,
261 ((test_map_std_alloc
)(test_multimap_std_alloc
))
262 ((test_map_std_alloc
)(test_multimap_std_alloc
))
263 ((default_generator
)(generate_collisions
)))
264 UNORDERED_TEST(merge_empty_test
,
265 ((test_set
)(test_multiset
))
266 ((test_set
)(test_multiset
))
267 ((default_generator
)(generate_collisions
)))
268 UNORDERED_TEST(merge_empty_test
,
269 ((test_map
)(test_multimap
))
270 ((test_map
)(test_multimap
))
271 ((default_generator
)(generate_collisions
)))
273 UNORDERED_TEST(merge_into_empty_test
,
274 ((test_set_std_alloc
)(test_multiset_std_alloc
))
275 ((default_generator
)(generate_collisions
)))
276 UNORDERED_TEST(merge_into_empty_test
,
277 ((test_map_std_alloc
)(test_multimap_std_alloc
))
278 ((default_generator
)(generate_collisions
)))
279 UNORDERED_TEST(merge_into_empty_test
,
280 ((test_set
)(test_multiset
))
281 ((default_generator
)(generate_collisions
)))
282 UNORDERED_TEST(merge_into_empty_test
,
283 ((test_map
)(test_multimap
))
284 ((default_generator
)(generate_collisions
)))
286 UNORDERED_TEST(merge_into_unique_keys_test
,
287 ((test_set_std_alloc
))
288 ((test_set_std_alloc
)(test_multiset_std_alloc
))
291 ((default_generator
)(generate_collisions
)))
292 UNORDERED_TEST(merge_into_unique_keys_test
,
293 ((test_map_std_alloc
))
294 ((test_map_std_alloc
)(test_multimap_std_alloc
))
297 ((default_generator
)(generate_collisions
)))
298 UNORDERED_TEST(merge_into_unique_keys_test
,
300 ((test_set
)(test_multiset
))
303 ((default_generator
)(generate_collisions
)))
304 UNORDERED_TEST(merge_into_unique_keys_test
,
306 ((test_map
)(test_multimap
))
309 ((default_generator
)(generate_collisions
)))
311 UNORDERED_TEST(merge_into_equiv_keys_test
,
312 ((test_multiset_std_alloc
))
313 ((test_set_std_alloc
)(test_multiset_std_alloc
))
316 ((default_generator
)(generate_collisions
)))
317 UNORDERED_TEST(merge_into_equiv_keys_test
,
318 ((test_multimap_std_alloc
))
319 ((test_map_std_alloc
)(test_multimap_std_alloc
))
322 ((default_generator
)(generate_collisions
)))
323 UNORDERED_TEST(merge_into_equiv_keys_test
,
325 ((test_set
)(test_multiset
))
328 ((default_generator
)(generate_collisions
)))
329 UNORDERED_TEST(merge_into_equiv_keys_test
,
331 ((test_map
)(test_multimap
))
334 ((default_generator
)(generate_collisions
)))