// 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 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::value); for (typename T2::iterator it = y.begin(); it != y.end(); ++it) { BOOST_TEST(x.find(test::get_key(*it)) != x.end()); } } test::check_equivalent_keys(x); test::check_equivalent_keys(y); } template 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 v1(count1, gen1); test::random_values 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_set_; boost::unordered_multiset >* test_multiset_; boost::unordered_map >* test_map_; boost::unordered_multimap >* 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()