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