use proptest::prelude::*;
use std::io::Cursor;
use crate::{
orchard,
serialization::{ZcashDeserializeInto, ZcashSerialize},
};
proptest! {
#[test]
fn flag_roundtrip_bytes(flags in any::<u8>()) {
let mut serialized = Cursor::new(Vec::new());
flags.zcash_serialize(&mut serialized)?;
serialized.set_position(0);
let maybe_deserialized = (&mut serialized).zcash_deserialize_into();
let pre_nu6_3_reserved =
!(orchard::Flags::ENABLE_SPENDS.bits() | orchard::Flags::ENABLE_OUTPUTS.bits());
if flags & pre_nu6_3_reserved == 0 {
prop_assert_eq!(
maybe_deserialized.ok(),
Some(orchard::Flags::from_bits_truncate(flags))
);
} else {
prop_assert_eq!(
maybe_deserialized.err().unwrap().to_string(),
"parse error: invalid reserved orchard flags"
);
}
}
}