| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <lib/stdcompat/queue.h> |
| |
| #include "gtest.h" |
| |
| namespace { |
| |
| TEST(DequeTest, EraseRemovesAllMatchingEntries) { |
| std::deque<int> v = {1, 2, 1, 2, 1, 3, 4, 5, 1}; |
| |
| ASSERT_EQ(cpp20::erase(v, 1), 4u); |
| |
| EXPECT_THAT(v, testing::ElementsAreArray({2, 2, 3, 4, 5})); |
| } |
| |
| TEST(DequeTest, EraseWithNoEntries) { |
| std::deque<int> v = {1, 2, 1, 2, 1, 3, 4, 5}; |
| |
| ASSERT_EQ(cpp20::erase(v, 6), 0u); |
| |
| EXPECT_THAT(v, testing::ElementsAreArray({1, 2, 1, 2, 1, 3, 4, 5})); |
| } |
| |
| TEST(DequeTest, EraseIfRemovesAllMatchingEntries) { |
| std::deque<int> v = {1, 2, 1, 2, 1, 3, 4, 5, 1}; |
| |
| ASSERT_EQ(cpp20::erase_if(v, [](auto b) { return b == 1 || b == 2; }), 6u); |
| |
| EXPECT_THAT(v, testing::ElementsAreArray({3, 4, 5})); |
| } |
| |
| TEST(DequeTest, EraseIfWithNoEntries) { |
| std::deque<int> v = {1, 2, 1, 2, 1, 3, 4, 5}; |
| |
| // Nothing matches. |
| ASSERT_EQ(cpp20::erase_if(v, [](auto b) { return false; }), 0u); |
| |
| EXPECT_THAT(v, testing::ElementsAreArray({1, 2, 1, 2, 1, 3, 4, 5})); |
| } |
| |
| TEST(DequeTest, EraseWithStrings) { |
| std::deque<std::string> container = {"value 1", "value 2"}; |
| cpp20::erase(container, "value 2"); |
| |
| ASSERT_EQ(container.size(), 1u); |
| ASSERT_EQ(container.front(), "value 1"); |
| } |
| |
| #if defined(__cpp_lib_erase_if) && __cpp_lib_erase_if >= 202002 && \ |
| !defined(LIB_STDCOMPAT_USE_POLYFILLS) |
| |
| TEST(DequeTest, EraseVariantsAreAliasForStdWhenAvailable) { |
| using size_type = std::deque<int>::size_type; |
| using arg = std::deque<int>; |
| using value = int; |
| |
| constexpr size_type (*cpp20_erase)(arg&, const value&) = &cpp20::erase; |
| constexpr size_type (*std_erase)(arg&, const value&) = &std::erase; |
| static_assert(cpp20_erase == std_erase, ""); |
| |
| using pred = bool (*)(value); |
| constexpr size_type (*cpp20_erase_if)(arg&, pred) = &cpp20::erase_if; |
| constexpr size_type (*std_erase_if)(arg&, pred) = &std::erase_if; |
| static_assert(cpp20_erase_if == std_erase_if, ""); |
| } |
| |
| #endif |
| |
| } // namespace |