extern crate alloc;
use ciborium::{de::from_reader, ser::into_writer, tag::*, value::Value};
use rstest::rstest;
use serde::{Deserialize, Serialize};
use core::fmt::Debug;
#[rstest(item, bytes, value, encode, success,
case(Captured(Some(6), true), "c6f5", Value::Tag(6, Value::Bool(true).into()), true, true),
case(Captured(None, true), "f5", Value::Bool(true), true, true),
case(Required::<_, 6>(true), "c6f5", Value::Tag(6, Value::Bool(true).into()), true, true),
case(Required::<_, 6>(true), "c7f5", Value::Tag(7, Value::Bool(true).into()), false, false),
case(Required::<_, 6>(true), "f5", Value::Bool(true), false, false),
case(Accepted::<_, 6>(true), "c6f5", Value::Tag(6, Value::Bool(true).into()), true, true),
case(Accepted::<_, 6>(true), "c7f5", Value::Tag(7, Value::Bool(true).into()), false, false),
case(Accepted::<_, 6>(true), "f5", Value::Bool(true), false, true),
)]
fn test<'de, T: Serialize + Deserialize<'de> + Debug + Eq>(
item: T,
bytes: &str,
value: Value,
encode: bool,
success: bool,
) {
let bytes = hex::decode(bytes).unwrap();
if encode {
let mut encoded = Vec::new();
into_writer(&item, &mut encoded).unwrap();
assert_eq!(bytes, encoded);
assert_eq!(value, Value::serialized(&item).unwrap());
}
match from_reader(&bytes[..]) {
Ok(x) if success => assert_eq!(item, x),
Ok(..) => panic!("unexpected success"),
Err(e) if success => Err(e).unwrap(),
Err(..) => (),
}
match value.deserialized() {
Ok(x) if success => assert_eq!(item, x),
Ok(..) => panic!("unexpected success"),
Err(e) if success => Err(e).unwrap(),
Err(..) => (),
}
}