use clock_hash::*;
#[test]
fn test_main_functions_accessible() {
let data = b"api completeness test";
let hash1 = clockhash256(data);
assert_eq!(hash1.len(), 32);
let hash2 = clockhash256_domain(b"DOMAIN", data);
assert_eq!(hash2.len(), 32);
assert_ne!(hash1, hash2);
let hash3 = clockhash256_with_domain(DomainTag::Block, data);
assert_eq!(hash3.len(), 32);
assert_ne!(hash1, hash3);
let mut hasher = ClockHasher::new();
hasher.update(data);
let hash4 = hasher.finalize();
assert_eq!(hash4.len(), 32);
assert_eq!(hash1, hash4); }
#[test]
fn test_constants_accessible() {
assert_eq!(constants::IV.len(), 8);
for &word in &constants::IV {
assert!(word != 0); }
assert_eq!(constants::ROTATION_SCHEDULE.len(), 16);
assert!(constants::P0 != 0);
assert!(constants::P1 != 0);
assert_eq!(constants::SBOX.len(), 256);
}
#[test]
fn test_domain_tags_accessible() {
use clock_hash::tags;
let _block_tag = tags::CLK_BLOCK;
let _tx_tag = tags::CLK_TX;
let _merkle_tag = tags::CLK_MERKLE;
let _nonce_tag = tags::CLK_NONCE;
let _rng_tag = tags::CLK_RNG;
assert!(!tags::CLK_BLOCK.is_empty());
assert!(!tags::CLK_TX.is_empty());
assert!(!tags::CLK_MERKLE.is_empty());
assert!(!tags::CLK_NONCE.is_empty());
assert!(!tags::CLK_RNG.is_empty());
}
#[test]
fn test_utils_accessible() {
use clock_hash::utils;
assert_eq!(utils::rotl64(0x1234567890ABCDEF, 8), 0x34567890ABCDEF12);
assert_eq!(utils::rotr64(0x1234567890ABCDEF, 8), 0xEF1234567890ABCD);
assert_eq!(utils::rotl8(0x12, 4), 0x21);
}
#[test]
fn test_cpuid_accessible() {
let _vendor = cpuid::get_vendor();
let _family_model_stepping = cpuid::get_family_model_stepping();
let _has_avx = cpuid::has_avx();
let _has_avx2 = cpuid::has_avx2();
}
#[test]
fn test_security_functions_accessible() {
let input1 = [0u8; 64];
let input2 = [0u8; 64];
let avalanche = verify_avalanche(&input1, &input2);
assert!(avalanche >= 0.0 && avalanche <= 1.0);
let test_cases: &[&[u8]] = &[&b"test1"[..], &b"test2"[..], &b"test3"[..]];
let no_collisions = verify_collision_resistance(test_cases);
assert!(no_collisions);
let domains: &[&[u8]] = &[&b"domain1"[..], &b"domain2"[..]];
let domains_separated = verify_domain_separation(b"data", domains);
assert!(domains_separated);
}
#[cfg(feature = "std")]
#[test]
fn test_performance_functions_accessible() {
let throughput = measure_throughput(100, 1024);
assert!(throughput > 0.0);
let stats = performance_stats();
assert!(stats.len() > 0);
let benchmarks = benchmark_sizes();
assert!(benchmarks.len() > 0);
}
#[cfg(feature = "simd")]
#[test]
fn test_simd_functions_accessible() {
use clock_hash::simd::dispatch::{is_avx2_available, is_avx512_available};
let _avx2_available = is_avx2_available();
let _avx512_available = is_avx512_available();
let mut data = [0u64; 16];
unsafe {
let _ = std::panic::catch_unwind(|| {
simd::clock_mix_avx2(&mut data);
});
}
}
#[test]
fn test_public_types_traits() {
let _hasher1 = ClockHasher::new();
let _hasher2 = ClockHasher::default();
let tag1 = DomainTag::Block;
let tag2 = DomainTag::Transaction;
assert!(tag1 == tag1);
assert!(tag1 != tag2);
let bytes = tag1.as_bytes();
assert!(!bytes.is_empty());
}