skip_ratchet 0.3.0

Skip ratchet
Documentation
use crate::{hash::Hash, salt::Salt, seek::JumpSize, Ratchet};
use hex::FromHex;
use proptest::{prelude::any, strategy::Strategy};

pub(crate) fn hash_from_hex(s: &str) -> Hash {
    Hash::from_raw(<[u8; 32]>::from_hex(s).unwrap())
}

pub(crate) fn salt_from_hex(s: &str) -> Salt {
    Salt::from_raw(<[u8; 32]>::from_hex(s).unwrap())
}

pub(crate) fn salt() -> [u8; 32] {
    salt_from_hex("eafe7de965c8a149d6ad0e1a4bd28c79db7d408f6655b1570e9c16d4a96bfc5e").into()
}

pub(crate) fn seed() -> [u8; 32] {
    hash_from_hex("600b56e66b7d12e08fd58544d7c811db0063d7aa467a1f6be39990fed0ca5b33").into()
}

pub(crate) fn assert_ratchet_equal(expected: &Ratchet, got: &Ratchet) {
    assert_eq!(format!("{expected:#?}"), format!("{got:#?}"));
}

#[macro_export]
macro_rules! prop_assert_ratchet_eq {
    ($expected:expr, $actual:expr) => {
        prop_assert_eq!(format!("{:#?}", $expected), format!("{:#?}", $actual));
    };
}

pub(crate) fn any_jump_size() -> impl Strategy<Value = JumpSize> {
    (0..3).prop_map(|n| match n {
        0 => JumpSize::Zero,
        1 => JumpSize::Small,
        2 => JumpSize::Medium,
        3 => JumpSize::Large,
        _ => unreachable!(),
    })
}

pub(crate) fn any_ratchet() -> impl Strategy<Value = Ratchet> {
    (any::<[u8; 32]>().no_shrink(), 0..=255u8, 254..=255u8)
        .prop_map(|(seed, inc_small, inc_med)| Ratchet::from_seed(&seed, inc_small, inc_med))
}