From fdedb6c957e4cfb6ef6d52d94d89056a9d50ef26 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Tue, 30 May 2023 09:19:50 -0700 Subject: [PATCH] Add merge exceptions tests for cfoa --- test/Jamfile.v2 | 1 + test/cfoa/exception_merge_tests.cpp | 78 +++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 test/cfoa/exception_merge_tests.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 08f60bab..4e256e2a 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -194,6 +194,7 @@ local CFOA_TESTS = exception_erase_tests exception_constructor_tests exception_assign_tests + exception_merge_tests ; for local test in $(CFOA_TESTS) diff --git a/test/cfoa/exception_merge_tests.cpp b/test/cfoa/exception_merge_tests.cpp new file mode 100644 index 00000000..0f54eb27 --- /dev/null +++ b/test/cfoa/exception_merge_tests.cpp @@ -0,0 +1,78 @@ +// Copyright (C) 2023 Christian Mazakas +// 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 "exception_helpers.hpp" + +#include + +#include + +using allocator_type = stateful_allocator >; + +using hasher = stateful_hash; +using key_equal = stateful_key_equal; + +using map_type = boost::unordered::concurrent_flat_map; + +namespace { + test::seed_t initialize_seed(223333016); + + template void merge(G gen, test::random_generator rg) + { + auto values = make_random_values(1024 * 16, [&] { return gen(rg); }); + auto reference_map = + boost::unordered_flat_map(values.begin(), values.end()); + + raii::reset_counts(); + + auto begin = values.begin(); + auto mid = begin + static_cast(values.size() / 2); + auto end = values.end(); + + { + unsigned num_throws = 0; + + for (unsigned i = 0; i < 5 * alloc_throw_threshold; ++i) { + disable_exceptions(); + + map_type x1(0, hasher(1), key_equal(2), allocator_type(3)); + x1.insert(begin, mid); + + map_type x2(0, hasher(2), key_equal(1), allocator_type(3)); + x2.insert(mid, end); + + enable_exceptions(); + try { + x1.merge(x2); + } catch (...) { + ++num_throws; + } + + disable_exceptions(); + test_fuzzy_matches_reference(x1, reference_map, rg); + test_fuzzy_matches_reference(x2, reference_map, rg); + } + + BOOST_TEST_GT(num_throws, 0u); + } + + check_raii_counts(); + } + +} // namespace + +using test::default_generator; +using test::limited_range; +using test::sequential; + +// clang-format off +UNORDERED_TEST( + merge, + ((exception_value_type_generator)) + ((default_generator)(sequential)(limited_range))) + +// clang-format on + +RUN_TESTS()