blob: c19ee0090b80d32e02226ab0d78a5c544cbd8fe8 [file] [log] [blame]
// SPDX-License-Identifier: Apache-2.0
extern crate alloc;
use ciborium::{de::from_reader, ser::into_writer, tag::*, value::Value};
use rstest::rstest;
use serde::{de::DeserializeOwned, 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<T: Serialize + DeserializeOwned + Debug + Eq>(
item: T,
bytes: &str,
value: Value,
encode: bool,
success: bool,
) {
let bytes = hex::decode(bytes).unwrap();
if encode {
// Encode into bytes
let mut encoded = Vec::new();
into_writer(&item, &mut encoded).unwrap();
assert_eq!(bytes, encoded);
// Encode into value
assert_eq!(value, Value::serialized(&item).unwrap());
}
// Decode from bytes
match from_reader(&bytes[..]) {
Ok(x) if success => assert_eq!(item, x),
Ok(..) => panic!("unexpected success"),
Err(e) if success => Err(e).unwrap(),
Err(..) => (),
}
// Decode from value
match value.deserialized() {
Ok(x) if success => assert_eq!(item, x),
Ok(..) => panic!("unexpected success"),
Err(e) if success => Err(e).unwrap(),
Err(..) => (),
}
}