#![allow(non_snake_case)]
mod common;
use std::hash::Hasher;
use osom_lib_hashes::{
fnv::{FNV1_64HasherBuilder, FNV1_128HasherBuilder, FNV1a_64HasherBuilder, FNV1a_128HasherBuilder},
traits::HashFunction,
};
use rstest::rstest;
#[rstest]
#[case::FNV1_64__1(|| FNV1_64HasherBuilder::new().create_hasher(), "", &[0x25, 0x23, 0x22, 0x84, 0xe4, 0x9c, 0xf2, 0xcb])]
#[case::FNV1_64__2(|| FNV1_64HasherBuilder::new().create_hasher(), "a", &[0xbe, 0xb7, 0x01, 0x86, 0x4c, 0xbd, 0x63, 0xaf])]
#[case::FNV1_64__3(|| FNV1_64HasherBuilder::new().create_hasher(), "A", &[0x9e, 0xb7, 0x01, 0x86, 0x4c, 0xbd, 0x63, 0xaf])]
#[case::FNV1_64__4(|| FNV1_64HasherBuilder::new().create_hasher(), " ", &[0xff, 0xb7, 0x01, 0x86, 0x4c, 0xbd, 0x63, 0xaf])]
#[case::FNV1_64__5(|| FNV1_64HasherBuilder::new().create_hasher(), "ala ma kota", &[0xfa, 0x12, 0x51, 0x4a, 0xc2, 0xd6, 0x64, 0x3b])]
#[case::FNV1a_64__1(|| FNV1a_64HasherBuilder::new().create_hasher(), "", &[0x25, 0x23, 0x22, 0x84, 0xe4, 0x9c, 0xf2, 0xcb])]
#[case::FNV1a_64__2(|| FNV1a_64HasherBuilder::new().create_hasher(), "a", &[0x8c, 0xec, 0x01, 0x86, 0x4c, 0xdc, 0x63, 0xaf])]
#[case::FNV1a_64__3(|| FNV1a_64HasherBuilder::new().create_hasher(), "A", &[0xec, 0x22, 0x02, 0x86, 0x4c, 0xfc, 0x63, 0xaf])]
#[case::FNV1a_64__4(|| FNV1a_64HasherBuilder::new().create_hasher(), " ", &[0x7f, 0x81, 0x01, 0x86, 0x4c, 0x9d, 0x63, 0xaf])]
#[case::FNV1a_64__5(|| FNV1a_64HasherBuilder::new().create_hasher(), "ala ma kota", &[0x40, 0x22, 0x48, 0x20, 0xbb, 0x68, 0x6a, 0xfc])]
#[case::FNV1_128__1(|| FNV1_128HasherBuilder::new().create_hasher(), "", &[0x8d, 0xc5, 0x95, 0x62, 0x75, 0x21, 0xb8, 0x62, 0x42, 0x01, 0xbb, 0x07, 0x2e, 0x27, 0x62, 0x6c])]
#[case::FNV1_128__2(|| FNV1_128HasherBuilder::new().create_hasher(), "a", &[0x1e, 0x14, 0x4a, 0x4e, 0x70, 0x2b, 0x91, 0x78, 0xaf, 0x8c, 0x1a, 0x10, 0x69, 0xcb, 0x28, 0xd2])]
#[case::FNV1_128__3(|| FNV1_128HasherBuilder::new().create_hasher(), "A", &[0x3e, 0x14, 0x4a, 0x4e, 0x70, 0x2b, 0x91, 0x78, 0xaf, 0x8c, 0x1a, 0x10, 0x69, 0xcb, 0x28, 0xd2])]
#[case::FNV1_128__4(|| FNV1_128HasherBuilder::new().create_hasher(), " ", &[0x5f, 0x14, 0x4a, 0x4e, 0x70, 0x2b, 0x91, 0x78, 0xaf, 0x8c, 0x1a, 0x10, 0x69, 0xcb, 0x28, 0xd2])]
#[case::FNV1_128__5(|| FNV1_128HasherBuilder::new().create_hasher(), "ala ma kota", &[0x3a, 0xf2, 0x81, 0xc1, 0xbd, 0x23, 0x41, 0xe8, 0x97, 0xc6, 0x67, 0x16, 0x49, 0x48, 0xc5, 0x82])]
#[case::FNV1a_128__1(|| FNV1a_128HasherBuilder::new().create_hasher(), "", &[0x8d, 0xc5, 0x95, 0x62, 0x75, 0x21, 0xb8, 0x62, 0x42, 0x01, 0xbb, 0x07, 0x2e, 0x27, 0x62, 0x6c])]
#[case::FNV1a_128__2(|| FNV1a_128HasherBuilder::new().create_hasher(), "a", &[0x64, 0x89, 0x4a, 0x4e, 0x70, 0x2b, 0x91, 0x78, 0xaf, 0x8c, 0x1a, 0x6f, 0x69, 0xcb, 0x28, 0xd2])]
#[case::FNV1a_128__3(|| FNV1a_128HasherBuilder::new().create_hasher(), "A", &[0x04, 0x62, 0x4a, 0x4e, 0x70, 0x2b, 0x91, 0x78, 0xaf, 0x8c, 0x1a, 0x4f, 0x69, 0xcb, 0x28, 0xd2])]
#[case::FNV1a_128__4(|| FNV1a_128HasherBuilder::new().create_hasher(), " ", &[0xdf, 0x3b, 0x4a, 0x4e, 0x70, 0x2b, 0x91, 0x78, 0xaf, 0x8c, 0x1a, 0x30, 0x69, 0xcb, 0x28, 0xd2])]
#[case::FNV1a_128__5(|| FNV1a_128HasherBuilder::new().create_hasher(), "ala ma kota", &[0xb8, 0x8d, 0xdb, 0x17, 0x7e, 0xe0, 0x53, 0x2e, 0x0a, 0xb2, 0x9a, 0xfb, 0xfd, 0xb1, 0xd5, 0x39])]
fn test_fnv<TH: Hasher + HashFunction, F: FnOnce() -> TH>(
#[case] builder: F,
#[case] input: &str,
#[case] expected: &[u8],
) {
let mut fnv = builder();
fnv.update(input.as_bytes());
let block = fnv.result();
assert_eq!(block.as_ref(), expected);
}
#[rstest]
#[case(5000, &[0x14, 0x23, 0x72, 0x19, 0x13, 0xe7, 0xfd, 0xd6, 0x8b, 0x13, 0xd6, 0xc7, 0xc6, 0xd9, 0xf7, 0xcf])]
#[case(5001, &[0x6f, 0x83, 0x71, 0x4f, 0x80, 0x54, 0x6b, 0x8a, 0x11, 0x0d, 0x6a, 0x41, 0xbb, 0x69, 0x12, 0xf9])]
#[case(5002, &[0x79, 0x3e, 0xad, 0xc0, 0xe1, 0xf9, 0x10, 0x52, 0x95, 0x14, 0x7e, 0x58, 0xed, 0x8a, 0xf7, 0xf9])]
#[case(5003, &[0xad, 0x8d, 0x2b, 0x15, 0xc8, 0x78, 0xe3, 0xfa, 0xbb, 0x53, 0x23, 0x1a, 0x4a, 0x9f, 0x58, 0x75])]
#[case(5004, &[0xc3, 0x9d, 0x96, 0x0c, 0x32, 0x9e, 0xe5, 0xb5, 0x4d, 0x08, 0x78, 0x42, 0xbb, 0x2b, 0x21, 0x2c])]
#[case(5005, &[0x80, 0xcc, 0x53, 0x7d, 0x95, 0xa7, 0x89, 0xd1, 0x9e, 0x37, 0xb2, 0x49, 0x08, 0x66, 0xdd, 0x7e])]
#[case(5006, &[0xe5, 0x78, 0x1c, 0x36, 0xf1, 0x34, 0x61, 0xd4, 0x6b, 0x70, 0x4a, 0x0d, 0xff, 0xdf, 0xe9, 0xaf])]
#[case(5007, &[0xae, 0xdb, 0x07, 0x95, 0xcd, 0x24, 0x9c, 0x53, 0xae, 0x54, 0x98, 0x84, 0x4d, 0xbb, 0xfc, 0x65])]
#[case(5008, &[0x16, 0x8f, 0xab, 0x60, 0xf6, 0x48, 0x21, 0xe1, 0x80, 0x32, 0x70, 0x09, 0x3e, 0x80, 0x8f, 0x4b])]
fn test_long_fnv1a_128(#[case] size: usize, #[case] expected: &[u8]) {
common::test_pseudo_random_hashing(|| FNV1a_128HasherBuilder::new().create_hasher(), size, expected);
}