cranpose-render-common 0.1.166

Common rendering contracts for Cranpose
Documentation
use std::hash::{BuildHasher, DefaultHasher};

use super::*;
use crate::bounded_lru_cache::BoundedLruCache;

fn hash_of<T: Hash + ?Sized>(value: &T) -> u64 {
    std::hash::BuildHasherDefault::<DefaultHasher>::default().hash_one(value)
}

#[test]
fn a_borrowed_probe_hashes_and_compares_like_the_stored_key() {
    let text = String::from("the same words");
    let probe = TextProbe::new(text.as_str(), (14u32, 3u64));
    let stored = probe.to_owned_key();

    assert_eq!(hash_of(probe.key()), hash_of(&stored));
    assert!(probe.key() == Borrow::<dyn TextKey<(u32, u64)>>::borrow(&stored));
    assert!(
        TextProbe::new("other words", (14u32, 3u64)).key()
            != Borrow::<dyn TextKey<(u32, u64)>>::borrow(&stored)
    );
    assert!(
        TextProbe::new(text.as_str(), (15u32, 3u64)).key()
            != Borrow::<dyn TextKey<(u32, u64)>>::borrow(&stored)
    );
}

#[test]
fn a_cache_finds_an_entry_by_a_probe_of_the_same_text() {
    let mut cache = BoundedLruCache::with_capacity_at_least_one(4);
    let first = String::from("measured once");
    cache.put(TextProbe::new(first.as_str(), 1u64).to_owned_key(), 10);

    let again = String::from("measured once");
    assert_eq!(
        cache.get(TextProbe::new(again.as_str(), 1u64).key()),
        Some(&10)
    );
    assert_eq!(cache.get(TextProbe::new(again.as_str(), 2u64).key()), None);
    assert!(cache.contains(TextProbe::new(again.as_str(), 1u64).key()));
}