dig-capsule 0.5.0

The DIG Network .dig capsule data plane — one crate over the DIGS format, capsule read-crypto, compiler, staging, and the guest/host serve triad.
use crate::imp::compiler::ChunkIndex;
use crate::imp::core::Bytes32;

fn h(b: u8) -> Bytes32 {
    Bytes32([b; 32])
}

#[test]
fn inserts_assign_sequential_indices() {
    let mut idx = ChunkIndex::new();
    assert_eq!(idx.insert(h(1), vec![0xAA]), 0);
    assert_eq!(idx.insert(h(2), vec![0xBB]), 1);
    assert_eq!(idx.len(), 2);
}

#[test]
fn duplicate_hash_returns_existing_index_and_does_not_grow() {
    let mut idx = ChunkIndex::new();
    let first = idx.insert(h(7), vec![0x01, 0x02]);
    let again = idx.insert(h(7), vec![0x01, 0x02]);
    assert_eq!(first, again);
    assert_eq!(idx.len(), 1);
}

#[test]
fn bodies_returned_in_insertion_order() {
    let mut idx = ChunkIndex::new();
    idx.insert(h(3), vec![0x30]);
    idx.insert(h(1), vec![0x10]);
    idx.insert(h(2), vec![0x20]);
    let bodies: Vec<Vec<u8>> = idx.bodies_in_order().map(|b| b.to_vec()).collect();
    assert_eq!(bodies, vec![vec![0x30], vec![0x10], vec![0x20]]);
}

#[test]
fn index_of_resolves_known_hash() {
    let mut idx = ChunkIndex::new();
    idx.insert(h(5), vec![0x55]);
    idx.insert(h(6), vec![0x66]);
    assert_eq!(idx.index_of(&h(6)), Some(1));
    assert_eq!(idx.index_of(&h(9)), None);
}