use crate::hash::Hash;
#[macro_export]
macro_rules! for_each_hash_test {
($callback:ident) => {
$crate::__apply! {
$callback,
test_basic,
}
};
}
pub use for_each_hash_test;
#[macro_export]
macro_rules! test_hash {
($name:ident, $hash:ty) => {
mod $name {
#[allow(unused_imports)]
use super::*;
$crate::test_hash!($hash);
}
};
($hash:ty) => {
macro_rules! __hash_test {
($test:ident) => {
#[test]
fn $test() {
$crate::test_util::hash::$test::<$hash>()
}
};
}
$crate::for_each_hash_test!(__hash_test);
};
}
pub use test_hash;
pub fn test_basic<T: Hash>() {
const INPUT: &[u8] = r#"
Sir, in my heart there was a kind of fighting
That would not let me sleep. Methought I lay
Worse than the mutines in the bilboes. Rashly—
And prais'd be rashness for it—let us know
Our indiscretion sometimes serves us well ...
"#
.as_bytes();
let want = T::hash(INPUT);
let got = {
let mut h = T::new();
for c in INPUT {
h.update(&[*c]);
}
h.digest()
};
assert_eq!(want, got);
assert_eq!(want, T::hash(INPUT));
let mut modified = INPUT.to_vec();
modified[0] += 1;
assert_ne!(want, T::hash(&modified[..]));
}