123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // Copyright 2017-2018 Daniel James.
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #include "../helpers/exception_test.hpp"
- #include "../helpers/invariants.hpp"
- #include "../helpers/metafunctions.hpp"
- #include "../helpers/random_values.hpp"
- #include "./containers.hpp"
- template <typename T1, typename T2> void merge_exception_test(T1 x, T2 y)
- {
- std::size_t size = x.size() + y.size();
- try {
- ENABLE_EXCEPTIONS;
- x.merge(y);
- } catch (...) {
- test::check_equivalent_keys(x);
- test::check_equivalent_keys(y);
- throw;
- }
- // Not a full check, just want to make sure the merge completed.
- BOOST_TEST(size == x.size() + y.size());
- if (y.size()) {
- BOOST_TEST(test::has_unique_keys<T1>::value);
- for (typename T2::iterator it = y.begin(); it != y.end(); ++it) {
- BOOST_TEST(x.find(test::get_key<T2>(*it)) != x.end());
- }
- }
- test::check_equivalent_keys(x);
- test::check_equivalent_keys(y);
- }
- template <typename T1, typename T2>
- void merge_exception_test(T1 const*, T2 const*, std::size_t count12, int tag12,
- test::random_generator gen1, test::random_generator gen2)
- {
- std::size_t count1 = count12 / 256;
- std::size_t count2 = count12 % 256;
- int tag1 = tag12 / 256;
- int tag2 = tag12 % 256;
- test::random_values<T1> v1(count1, gen1);
- test::random_values<T2> v2(count2, gen2);
- T1 x(v1.begin(), v1.end(), 0, test::exception::hash(tag1),
- test::exception::equal_to(tag1));
- T2 y(v2.begin(), v2.end(), 0, test::exception::hash(tag2),
- test::exception::equal_to(tag2));
- EXCEPTION_LOOP(merge_exception_test(x, y))
- }
- boost::unordered_set<test::exception::object, test::exception::hash,
- test::exception::equal_to,
- test::exception::allocator<test::exception::object> >* test_set_;
- boost::unordered_multiset<test::exception::object, test::exception::hash,
- test::exception::equal_to,
- test::exception::allocator<test::exception::object> >* test_multiset_;
- boost::unordered_map<test::exception::object, test::exception::object,
- test::exception::hash, test::exception::equal_to,
- test::exception::allocator2<test::exception::object> >* test_map_;
- boost::unordered_multimap<test::exception::object, test::exception::object,
- test::exception::hash, test::exception::equal_to,
- test::exception::allocator2<test::exception::object> >* test_multimap_;
- using test::default_generator;
- using test::generate_collisions;
- using test::limited_range;
- // clang-format off
- UNORDERED_MULTI_TEST(set_merge, merge_exception_test,
- ((test_set_)(test_multiset_))
- ((test_set_)(test_multiset_))
- ((0x0000)(0x6400)(0x0064)(0x0a64)(0x3232))
- ((0x0000)(0x0001)(0x0102))
- ((default_generator)(limited_range))
- ((default_generator)(limited_range))
- )
- UNORDERED_MULTI_TEST(map_merge, merge_exception_test,
- ((test_map_)(test_multimap_))
- ((test_map_)(test_multimap_))
- ((0x0000)(0x6400)(0x0064)(0x0a64)(0x3232))
- ((0x0101)(0x0200)(0x0201))
- ((default_generator)(limited_range))
- ((default_generator)(limited_range))
- )
- // Run fewer generate_collisions tests, as they're slow.
- UNORDERED_MULTI_TEST(set_merge_collisions, merge_exception_test,
- ((test_set_)(test_multiset_))
- ((test_set_)(test_multiset_))
- ((0x0a0a))
- ((0x0202)(0x0100)(0x0201))
- ((generate_collisions))
- ((generate_collisions))
- )
- UNORDERED_MULTI_TEST(map_merge_collisions, merge_exception_test,
- ((test_map_)(test_multimap_))
- ((test_map_)(test_multimap_))
- ((0x0a0a))
- ((0x0000)(0x0002)(0x0102))
- ((generate_collisions))
- ((generate_collisions))
- )
- // clang-format on
- RUN_TESTS_QUIET()
|