Add tests for interop assignment

This commit is contained in:
Christian Mazakas
2023-07-25 12:05:08 -07:00
parent e563c89b1c
commit 4918bb6b7e

View File

@ -33,6 +33,9 @@ using hasher = stateful_hash;
using key_equal = stateful_key_equal;
using allocator_type = stateful_allocator<std::pair<raii const, raii> >;
using flat_map_type = boost::unordered::unordered_flat_map<raii, raii, hasher,
key_equal, allocator_type>;
using map_type = boost::unordered::concurrent_flat_map<raii, raii, hasher,
key_equal, allocator_type>;
@ -843,6 +846,136 @@ namespace {
}
check_raii_counts();
}
template <class G> void flat_map_move_assign(G gen, test::random_generator rg)
{
auto values = make_random_values(1024 * 16, [&] { return gen(rg); });
auto reference_map =
boost::unordered_flat_map<raii, raii>(values.begin(), values.end());
/*
* basically test that a temporary container is materialized and we
* move-assign from that
*
* we don't need to be super rigorous here because we already have tests for
* container assignment, we're just testing that a temporary is materialized
*/
{
raii::reset_counts();
flat_map_type flat_map(values.begin(), values.end(), values.size(),
hasher(1), key_equal(2), allocator_type(3));
map_type map(0, hasher(2), key_equal(1), allocator_type(3));
BOOST_TEST(flat_map.get_allocator() == map.get_allocator());
map = std::move(flat_map);
BOOST_TEST(flat_map.empty());
BOOST_TEST_EQ(map.size(), reference_map.size());
test_fuzzy_matches_reference(map, reference_map, rg);
BOOST_TEST_EQ(map.hash_function(), hasher(1));
BOOST_TEST_EQ(map.key_eq(), key_equal(2));
BOOST_TEST_EQ(raii::copy_constructor, 2 * values.size());
BOOST_TEST_EQ(raii::destructor, 2 * values.size());
BOOST_TEST_EQ(raii::move_constructor, 2 * reference_map.size());
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
check_raii_counts();
{
raii::reset_counts();
map_type map(values.begin(), values.end(), values.size(), hasher(1),
key_equal(2), allocator_type(3));
flat_map_type flat_map(0, hasher(2), key_equal(1), allocator_type(3));
BOOST_TEST(flat_map.get_allocator() == map.get_allocator());
flat_map = std::move(map);
BOOST_TEST(map.empty());
BOOST_TEST_EQ(flat_map.size(), reference_map.size());
BOOST_TEST_EQ(flat_map.hash_function(), hasher(1));
BOOST_TEST_EQ(flat_map.key_eq(), key_equal(2));
BOOST_TEST_EQ(raii::copy_constructor, 2 * values.size());
BOOST_TEST_EQ(raii::destructor, 2 * values.size());
BOOST_TEST_EQ(raii::move_constructor, 2 * reference_map.size());
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
check_raii_counts();
{
raii::reset_counts();
flat_map_type flat_map(values.begin(), values.end(), values.size(),
hasher(1), key_equal(2), allocator_type(3));
map_type map(0, hasher(2), key_equal(1), allocator_type(4));
BOOST_TEST(flat_map.get_allocator() != map.get_allocator());
map = std::move(flat_map);
BOOST_TEST(flat_map.empty());
BOOST_TEST_EQ(map.size(), reference_map.size());
test_fuzzy_matches_reference(map, reference_map, rg);
BOOST_TEST_EQ(map.hash_function(), hasher(1));
BOOST_TEST_EQ(map.key_eq(), key_equal(2));
BOOST_TEST_EQ(raii::copy_constructor, 2 * values.size());
BOOST_TEST_EQ(
raii::destructor, 2 * values.size() + 2 * reference_map.size());
BOOST_TEST_EQ(raii::move_constructor, 4 * reference_map.size());
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
check_raii_counts();
{
raii::reset_counts();
map_type map(values.begin(), values.end(), values.size(), hasher(1),
key_equal(2), allocator_type(3));
flat_map_type flat_map(0, hasher(2), key_equal(1), allocator_type(4));
BOOST_TEST(flat_map.get_allocator() != map.get_allocator());
flat_map = std::move(map);
BOOST_TEST(map.empty());
BOOST_TEST_EQ(flat_map.size(), reference_map.size());
BOOST_TEST_EQ(flat_map.hash_function(), hasher(1));
BOOST_TEST_EQ(flat_map.key_eq(), key_equal(2));
BOOST_TEST_EQ(raii::copy_constructor, 2 * values.size());
BOOST_TEST_EQ(
raii::destructor, 2 * values.size() + 2 * reference_map.size());
BOOST_TEST_EQ(raii::move_constructor, 4 * reference_map.size());
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
check_raii_counts();
}
} // namespace
// clang-format off
@ -860,6 +993,11 @@ UNORDERED_TEST(
insert_and_assign,
((init_type_generator))
((default_generator)(sequential)(limited_range)))
UNORDERED_TEST(
flat_map_move_assign,
((init_type_generator))
((default_generator)(sequential)(limited_range)))
// clang-format on
RUN_TESTS()