• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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