mod common;
use common::codec;
const SPACED_ERROR_STRIDE: usize = 40;
fn flip_coded_bit(bytes: &mut [u8], i: usize) {
bytes[i / 8] ^= 1 << (7 - (i % 8));
}
proptest::proptest! {
#[test]
fn decode_of_encode_is_identity(raw in proptest::collection::vec(proptest::num::u8::ANY, 0..300)) {
let (enc, mut dec) = codec();
proptest::prop_assert_eq!(dec.decode_block(&enc.encode(&raw).unwrap()).unwrap().bytes, raw);
}
#[test]
fn exact_recovery_under_spaced_errors(
raw in proptest::collection::vec(proptest::num::u8::ANY, 1..128)
) {
let (enc, mut dec) = codec();
let mut coded = enc.encode(&raw).unwrap();
let mut i = SPACED_ERROR_STRIDE / 2;
while i < coded.nbits {
flip_coded_bit(&mut coded.bytes, i);
i += SPACED_ERROR_STRIDE;
}
proptest::prop_assert_eq!(dec.decode_block(&coded).unwrap().bytes, raw);
}
}
#[test]
fn deterministic_across_runs() {
let (enc, mut dec) = codec();
let coded = enc.encode(b"determinism").unwrap();
let a = dec.decode_block(&coded).unwrap();
let b = dec.decode_block(&coded).unwrap();
assert_eq!(a, b);
}