tessarikv-format 0.1.0

On-disk formats of TessariKV: log records and table blocks
Documentation
use proptest::prelude::*;

use super::*;

proptest! {
    #[test]
    fn every_u32_round_trips(value in any::<u32>()) {
        let mut out = Vec::new();
        put_u32(&mut out, value);
        prop_assert_eq!(get_u32(&out), Some((value, out.len())));
    }
}

#[test]
fn truncated_and_oversized_encodings_are_refused() {
    assert_eq!(get_u32(&[0x80]), None);
    assert_eq!(get_u32(&[]), None);
    assert_eq!(get_u32(&[0xFF, 0xFF, 0xFF, 0xFF, 0x1F]), None);
    assert_eq!(
        get_u32(&[0xFF, 0xFF, 0xFF, 0xFF, 0x0F]),
        Some((u32::MAX, 5))
    );
    assert_eq!(get_u32(&[0x80, 0x80, 0x80, 0x80, 0x80, 0x01]), None);
}

proptest! {
    #[test]
    fn every_u64_round_trips(value in any::<u64>()) {
        let mut out = Vec::new();
        put_u64(&mut out, value);
        prop_assert_eq!(get_u64(&out), Some((value, out.len())));
    }
}

#[test]
fn truncated_and_oversized_u64_encodings_are_refused() {
    assert_eq!(get_u64(&[0x80]), None);
    assert_eq!(get_u64(&[]), None);
    let mut max = vec![0xFF; 9];
    max.push(0x01);
    assert_eq!(get_u64(&max), Some((u64::MAX, 10)));
    let mut over = vec![0xFF; 9];
    over.push(0x02);
    assert_eq!(get_u64(&over), None, "the tenth byte carries one bit");
    assert_eq!(get_u64(&[0x80; 11]), None);
}