1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/containers/cxx20_erase.h"
6 #include "base/containers/queue.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace {
10
11 template <typename Container>
GetSize(const Container & c)12 size_t GetSize(const Container& c) {
13 return c.size();
14 }
15
16 template <typename Container>
RunEraseTest()17 void RunEraseTest() {
18 const std::pair<Container, Container> test_data[] = {
19 {Container(), Container()}, {{1, 2, 3}, {1, 3}}, {{1, 2, 3, 2}, {1, 3}}};
20
21 for (auto test_case : test_data) {
22 size_t expected_erased =
23 GetSize(test_case.first) - GetSize(test_case.second);
24 EXPECT_EQ(expected_erased, base::Erase(test_case.first, 2));
25 EXPECT_EQ(test_case.second, test_case.first);
26 }
27 }
28
29 // This test is written for containers of std::pair<int, int> to support maps.
30 template <typename Container>
RunEraseIfTest()31 void RunEraseIfTest() {
32 struct {
33 Container input;
34 Container erase_even;
35 Container erase_odd;
36 } test_data[] = {
37 {Container(), Container(), Container()},
38 {{{1, 1}, {2, 2}, {3, 3}}, {{1, 1}, {3, 3}}, {{2, 2}}},
39 {{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {3, 3}}, {{2, 2}, {4, 4}}},
40 };
41
42 for (auto test_case : test_data) {
43 size_t expected_erased =
44 GetSize(test_case.input) - GetSize(test_case.erase_even);
45 EXPECT_EQ(expected_erased,
46 base::EraseIf(test_case.input, [](const auto& elem) {
47 return !(elem.first & 1);
48 }));
49 EXPECT_EQ(test_case.erase_even, test_case.input);
50 }
51
52 for (auto test_case : test_data) {
53 size_t expected_erased =
54 GetSize(test_case.input) - GetSize(test_case.erase_odd);
55 EXPECT_EQ(expected_erased,
56 base::EraseIf(test_case.input,
57 [](const auto& elem) { return elem.first & 1; }));
58 EXPECT_EQ(test_case.erase_odd, test_case.input);
59 }
60 }
61
62 struct CustomIntHash {
operator ()__anonc1171a910111::CustomIntHash63 size_t operator()(int elem) const { return std::hash<int>()(elem) + 1; }
64 };
65
66 struct HashByFirst {
operator ()__anonc1171a910111::HashByFirst67 size_t operator()(const std::pair<int, int>& elem) const {
68 return std::hash<int>()(elem.first);
69 }
70 };
71
72 } // namespace
73
74 namespace base {
75 namespace {
76
TEST(Erase,Vector)77 TEST(Erase, Vector) {
78 RunEraseTest<std::vector<int>>();
79 RunEraseIfTest<std::vector<std::pair<int, int>>>();
80 }
81
TEST(Erase,Map)82 TEST(Erase, Map) {
83 RunEraseIfTest<std::map<int, int>>();
84 RunEraseIfTest<std::map<int, int, std::greater<>>>();
85 }
86
87 } // namespace
88 } // namespace base
89