Skip to content

Commit d6a75d9

Browse files
ezbrcopybara-github
authored andcommitted
Add test cases for absl::Hash:
- That hashes are consistent for the same int value across different int types. - That hashes of vectors of strings are unequal even when their concatenations are equal. - That FragmentedCord hashes works as intended for small Cords. PiperOrigin-RevId: 707592036 Change-Id: Ifb440245ce94bf9e624f64f9e370c0918c0b3f54
1 parent 553c74b commit d6a75d9

File tree

1 file changed

+33
-18
lines changed

1 file changed

+33
-18
lines changed

absl/hash/hash_test.cc

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,15 @@ TEST(HashValueTest, EnumAndBool) {
119119
std::make_tuple(true, false)));
120120
}
121121

122+
TEST(HashValueTest, HashConsistentAcrossIntTypes){
123+
std::vector<size_t> hashes = {
124+
absl::Hash<int8_t>{}(1), absl::Hash<uint8_t>{}(1),
125+
absl::Hash<int16_t>{}(1), absl::Hash<uint16_t>{}(1),
126+
absl::Hash<int32_t>{}(1), absl::Hash<uint32_t>{}(1),
127+
absl::Hash<int64_t>{}(1), absl::Hash<uint64_t>{}(1)};
128+
EXPECT_THAT(hashes, testing::Each(absl::Hash<int>{}(1)));
129+
}
130+
122131
TEST(HashValueTest, FloatingPoint) {
123132
EXPECT_TRUE((is_hashable<float>::value));
124133
EXPECT_TRUE((is_hashable<double>::value));
@@ -303,7 +312,7 @@ TEST(HashValueTest, CombineContiguousWorks) {
303312

304313
struct DummyDeleter {
305314
template <typename T>
306-
void operator() (T* ptr) {}
315+
void operator() (T*) {}
307316
};
308317

309318
struct SmartPointerEq {
@@ -421,33 +430,39 @@ TEST(HashValueTest, Strings) {
421430
const std::string large = std::string(2048, 'x'); // multiple of chunk size
422431
const std::string huge = std::string(5000, 'a'); // not a multiple
423432

424-
EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple( //
425-
std::string(), absl::string_view(), absl::Cord(), //
426-
std::string(""), absl::string_view(""), absl::Cord(""), //
427-
std::string(small), absl::string_view(small), absl::Cord(small), //
428-
std::string(dup), absl::string_view(dup), absl::Cord(dup), //
429-
std::string(large), absl::string_view(large), absl::Cord(large), //
430-
std::string(huge), absl::string_view(huge), FlatCord(huge), //
433+
EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple(
434+
std::string(), absl::string_view(), absl::Cord(), std::string(""),
435+
absl::string_view(""), absl::Cord(""), std::string(small),
436+
absl::string_view(small), absl::Cord(small), FragmentedCord(small),
437+
std::string(dup), absl::string_view(dup), absl::Cord(dup),
438+
std::string(large), absl::string_view(large), absl::Cord(large),
439+
std::string(huge), absl::string_view(huge), FlatCord(huge),
431440
FragmentedCord(huge))));
432441

433442
// Also check that nested types maintain the same hash.
434443
const WrapInTuple t{};
435-
EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple( //
436-
t(std::string()), t(absl::string_view()), t(absl::Cord()), //
437-
t(std::string("")), t(absl::string_view("")), t(absl::Cord("")), //
438-
t(std::string(small)), t(absl::string_view(small)), //
439-
t(absl::Cord(small)), //
440-
t(std::string(dup)), t(absl::string_view(dup)), t(absl::Cord(dup)), //
441-
t(std::string(large)), t(absl::string_view(large)), //
442-
t(absl::Cord(large)), //
443-
t(std::string(huge)), t(absl::string_view(huge)), //
444-
t(FlatCord(huge)), t(FragmentedCord(huge)))));
444+
EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple(
445+
t(std::string()), t(absl::string_view()), t(absl::Cord()),
446+
t(std::string("")), t(absl::string_view("")), t(absl::Cord("")),
447+
t(std::string(small)), t(absl::string_view(small)), t(absl::Cord(small)),
448+
t(FragmentedCord(small)), t(std::string(dup)), t(absl::string_view(dup)),
449+
t(absl::Cord(dup)), t(std::string(large)), t(absl::string_view(large)),
450+
t(absl::Cord(large)), t(std::string(huge)), t(absl::string_view(huge)),
451+
t(FlatCord(huge)), t(FragmentedCord(huge)))));
445452

446453
// Make sure that hashing a `const char*` does not use its string-value.
447454
EXPECT_NE(SpyHash(static_cast<const char*>("ABC")),
448455
SpyHash(absl::string_view("ABC")));
449456
}
450457

458+
TEST(HashValueTest, StringsVector) {
459+
using Vec = std::vector<std::string>;
460+
EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(std::make_tuple(
461+
Vec{"abc", "def"}, Vec{"abcde", "f"},
462+
Vec{"abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"},
463+
Vec{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXY", "Z"})));
464+
}
465+
451466
TEST(HashValueTest, WString) {
452467
EXPECT_TRUE((is_hashable<std::wstring>::value));
453468

0 commit comments

Comments
 (0)