summaryrefslogtreecommitdiffstats
path: root/third_party/rust/hashbrown/tests/hasher.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/hashbrown/tests/hasher.rs')
-rw-r--r--third_party/rust/hashbrown/tests/hasher.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/third_party/rust/hashbrown/tests/hasher.rs b/third_party/rust/hashbrown/tests/hasher.rs
new file mode 100644
index 0000000000..e455e3d3c9
--- /dev/null
+++ b/third_party/rust/hashbrown/tests/hasher.rs
@@ -0,0 +1,65 @@
+//! Sanity check that alternate hashers work correctly.
+
+#![cfg(not(miri))] // FIXME: takes too long
+
+use hashbrown::HashSet;
+use std::hash::{BuildHasher, BuildHasherDefault, Hasher};
+
+fn check<S: BuildHasher + Default>() {
+ let range = 0..1_000;
+
+ let mut set = HashSet::<i32, S>::default();
+ set.extend(range.clone());
+
+ assert!(!set.contains(&i32::min_value()));
+ assert!(!set.contains(&(range.start - 1)));
+ for i in range.clone() {
+ assert!(set.contains(&i));
+ }
+ assert!(!set.contains(&range.end));
+ assert!(!set.contains(&i32::max_value()));
+}
+
+/// Use hashbrown's default hasher.
+#[test]
+fn default() {
+ check::<hashbrown::hash_map::DefaultHashBuilder>();
+}
+
+/// Use std's default hasher.
+#[test]
+fn random_state() {
+ check::<std::collections::hash_map::RandomState>();
+}
+
+/// Use a constant 0 hash.
+#[test]
+fn zero() {
+ #[derive(Default)]
+ struct ZeroHasher;
+
+ impl Hasher for ZeroHasher {
+ fn finish(&self) -> u64 {
+ 0
+ }
+ fn write(&mut self, _: &[u8]) {}
+ }
+
+ check::<BuildHasherDefault<ZeroHasher>>();
+}
+
+/// Use a constant maximum hash.
+#[test]
+fn max() {
+ #[derive(Default)]
+ struct MaxHasher;
+
+ impl Hasher for MaxHasher {
+ fn finish(&self) -> u64 {
+ u64::max_value()
+ }
+ fn write(&mut self, _: &[u8]) {}
+ }
+
+ check::<BuildHasherDefault<MaxHasher>>();
+}