use super::stable_hash::{hash_id, FNV_OFFSET_BASIS, FNV_PRIME};
use proptest::prelude::*;
fn fnv1a_reference(input: &str) -> u64 {
let mut hash = FNV_OFFSET_BASIS;
for byte in input.as_bytes() {
hash ^= u64::from(*byte);
hash = hash.wrapping_mul(FNV_PRIME);
}
hash
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(100))]
#[test]
fn prop_hash_id_is_deterministic(input in ".*") {
let first = hash_id(&input);
let second = hash_id(&input);
let third = hash_id(&input.clone());
prop_assert_eq!(first, second);
prop_assert_eq!(first, third);
}
#[test]
fn prop_hash_id_matches_fnv1a_reference(input in ".*") {
prop_assert_eq!(hash_id(&input), fnv1a_reference(&input));
}
#[test]
fn prop_hash_id_tracks_reference_for_pairs(a in ".*", b in ".*") {
prop_assert_eq!(hash_id(&a), fnv1a_reference(&a));
prop_assert_eq!(hash_id(&b), fnv1a_reference(&b));
if a != b {
prop_assert_eq!(hash_id(&a) == hash_id(&b), fnv1a_reference(&a) == fnv1a_reference(&b));
}
}
}