1 // Copyright 2018 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef ABSL_CONTAINER_INTERNAL_UNORDERED_MAP_LOOKUP_TEST_H_
16 #define ABSL_CONTAINER_INTERNAL_UNORDERED_MAP_LOOKUP_TEST_H_
17 
18 #include "gmock/gmock.h"
19 #include "gtest/gtest.h"
20 #include "absl/container/internal/hash_generator_testing.h"
21 #include "absl/container/internal/hash_policy_testing.h"
22 
23 namespace absl {
24 ABSL_NAMESPACE_BEGIN
25 namespace container_internal {
26 
27 template <class UnordMap>
28 class LookupTest : public ::testing::Test {};
29 
30 TYPED_TEST_SUITE_P(LookupTest);
31 
TYPED_TEST_P(LookupTest,At)32 TYPED_TEST_P(LookupTest, At) {
33   using T = hash_internal::GeneratedType<TypeParam>;
34   std::vector<T> values;
35   std::generate_n(std::back_inserter(values), 10,
36                   hash_internal::Generator<T>());
37   TypeParam m(values.begin(), values.end());
38   for (const auto& p : values) {
39     const auto& val = m.at(p.first);
40     EXPECT_EQ(p.second, val) << ::testing::PrintToString(p.first);
41   }
42 }
43 
TYPED_TEST_P(LookupTest,OperatorBracket)44 TYPED_TEST_P(LookupTest, OperatorBracket) {
45   using T = hash_internal::GeneratedType<TypeParam>;
46   using V = typename TypeParam::mapped_type;
47   std::vector<T> values;
48   std::generate_n(std::back_inserter(values), 10,
49                   hash_internal::Generator<T>());
50   TypeParam m;
51   for (const auto& p : values) {
52     auto& val = m[p.first];
53     EXPECT_EQ(V(), val) << ::testing::PrintToString(p.first);
54     val = p.second;
55   }
56   for (const auto& p : values)
57     EXPECT_EQ(p.second, m[p.first]) << ::testing::PrintToString(p.first);
58 }
59 
TYPED_TEST_P(LookupTest,Count)60 TYPED_TEST_P(LookupTest, Count) {
61   using T = hash_internal::GeneratedType<TypeParam>;
62   std::vector<T> values;
63   std::generate_n(std::back_inserter(values), 10,
64                   hash_internal::Generator<T>());
65   TypeParam m;
66   for (const auto& p : values)
67     EXPECT_EQ(0, m.count(p.first)) << ::testing::PrintToString(p.first);
68   m.insert(values.begin(), values.end());
69   for (const auto& p : values)
70     EXPECT_EQ(1, m.count(p.first)) << ::testing::PrintToString(p.first);
71 }
72 
TYPED_TEST_P(LookupTest,Find)73 TYPED_TEST_P(LookupTest, Find) {
74   using std::get;
75   using T = hash_internal::GeneratedType<TypeParam>;
76   std::vector<T> values;
77   std::generate_n(std::back_inserter(values), 10,
78                   hash_internal::Generator<T>());
79   TypeParam m;
80   for (const auto& p : values)
81     EXPECT_TRUE(m.end() == m.find(p.first))
82         << ::testing::PrintToString(p.first);
83   m.insert(values.begin(), values.end());
84   for (const auto& p : values) {
85     auto it = m.find(p.first);
86     EXPECT_TRUE(m.end() != it) << ::testing::PrintToString(p.first);
87     EXPECT_EQ(p.second, get<1>(*it)) << ::testing::PrintToString(p.first);
88   }
89 }
90 
TYPED_TEST_P(LookupTest,EqualRange)91 TYPED_TEST_P(LookupTest, EqualRange) {
92   using std::get;
93   using T = hash_internal::GeneratedType<TypeParam>;
94   std::vector<T> values;
95   std::generate_n(std::back_inserter(values), 10,
96                   hash_internal::Generator<T>());
97   TypeParam m;
98   for (const auto& p : values) {
99     auto r = m.equal_range(p.first);
100     ASSERT_EQ(0, std::distance(r.first, r.second));
101   }
102   m.insert(values.begin(), values.end());
103   for (const auto& p : values) {
104     auto r = m.equal_range(p.first);
105     ASSERT_EQ(1, std::distance(r.first, r.second));
106     EXPECT_EQ(p.second, get<1>(*r.first)) << ::testing::PrintToString(p.first);
107   }
108 }
109 
110 REGISTER_TYPED_TEST_CASE_P(LookupTest, At, OperatorBracket, Count, Find,
111                            EqualRange);
112 
113 }  // namespace container_internal
114 ABSL_NAMESPACE_END
115 }  // namespace absl
116 
117 #endif  // ABSL_CONTAINER_INTERNAL_UNORDERED_MAP_LOOKUP_TEST_H_
118