// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/containers/to_vector.h" #include #include "base/containers/flat_set.h" #include "base/ranges/ranges.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace base::test { template void IdentityTest() { C c = {1, 2, 3, 4, 5}; auto vec = ToVector(c); EXPECT_THAT(vec, testing::ElementsAre(1, 2, 3, 4, 5)); } template void ProjectionTest() { C c = {1, 2, 3, 4, 5}; auto vec = ToVector(c, [](int x) { return x + 1; }); EXPECT_THAT(vec, testing::ElementsAre(2, 3, 4, 5, 6)); } TEST(ToVectorTest, Identity) { IdentityTest>(); IdentityTest>(); IdentityTest(); IdentityTest>(); } TEST(ToVectorTest, Projection) { ProjectionTest>(); ProjectionTest>(); ProjectionTest(); ProjectionTest>(); } TEST(ToVectorTest, MoveOnly) { struct MoveOnly { MoveOnly() = default; MoveOnly(const MoveOnly&) = delete; MoveOnly& operator=(const MoveOnly&) = delete; MoveOnly(MoveOnly&&) = default; MoveOnly& operator=(MoveOnly&&) = default; }; std::vector vec(/*size=*/10); auto mapped_vec = ToVector(std::move(vec), [](MoveOnly& value) { return std::move(value); }); EXPECT_EQ(mapped_vec.size(), 10U); } template constexpr bool CorrectlyProjected = std::is_same_v(), std::declval()))::value_type>; TEST(ToVectorTest, CorrectlyProjected) { // Tests that projected types are deduced correctly. constexpr auto proj = [](const auto& value) -> const auto& { return value; }; static_assert(CorrectlyProjected, decltype(proj), std::string>); static_assert( CorrectlyProjected, decltype(&std::string::length), std::size_t>); } } // namespace base::test