use asun::{AsunDecode, AsunEncode};
#[derive(Debug, PartialEq, AsunEncode, AsunDecode)]
struct WithSkip {
a: u32,
#[asun(skip)]
secret: String,
b: u32,
}
#[test]
fn skip_text_omits_and_defaults() {
let v = WithSkip {
a: 1,
secret: "hidden".into(),
b: 2,
};
let txt = asun::encode(&v).unwrap();
assert!(
!txt.contains("secret"),
"text should not contain skipped field: {txt}"
);
assert!(
!txt.contains("hidden"),
"text should not contain skipped value: {txt}"
);
let back: WithSkip = asun::decode(&txt).unwrap();
assert_eq!(
back,
WithSkip {
a: 1,
secret: String::new(),
b: 2
}
);
}
#[test]
fn skip_binary_symmetric() {
let v = WithSkip {
a: 1,
secret: "hidden".into(),
b: 2,
};
let bin = asun::encode_binary(&v).unwrap();
let back: WithSkip = asun::decode_binary(&bin).unwrap();
assert_eq!(
back,
WithSkip {
a: 1,
secret: String::new(),
b: 2
}
);
}
#[derive(Debug, PartialEq, AsunEncode, AsunDecode)]
struct WithSkipSer {
a: u32,
#[asun(skip_serializing)]
tag: String,
b: u32,
}
#[test]
fn skip_serializing_text_reads_when_present() {
let v = WithSkipSer {
a: 1,
tag: "written".into(),
b: 2,
};
let txt = asun::encode(&v).unwrap();
assert!(
!txt.contains("written"),
"value must not be serialized: {txt}"
);
let back: WithSkipSer = asun::decode(&txt).unwrap();
assert_eq!(
back,
WithSkipSer {
a: 1,
tag: String::new(),
b: 2
}
);
let with_tag = "{a,tag,b}:(1,\"present\",2)";
let back2: WithSkipSer = asun::decode(with_tag).unwrap();
assert_eq!(
back2,
WithSkipSer {
a: 1,
tag: "present".into(),
b: 2
}
);
}
#[test]
fn skip_serializing_binary_symmetric() {
let v = WithSkipSer {
a: 1,
tag: "written".into(),
b: 2,
};
let bin = asun::encode_binary(&v).unwrap();
let back: WithSkipSer = asun::decode_binary(&bin).unwrap();
assert_eq!(
back,
WithSkipSer {
a: 1,
tag: String::new(),
b: 2
}
);
}
#[derive(Debug, PartialEq, AsunEncode, AsunDecode)]
struct WithSkipDe {
a: u32,
#[asun(skip_deserializing)]
computed: u32,
b: u32,
}
#[test]
fn skip_deserializing_text() {
let txt = "{a,computed,b}:(1,999,2)";
let back: WithSkipDe = asun::decode(txt).unwrap();
assert_eq!(
back,
WithSkipDe {
a: 1,
computed: 0,
b: 2
}
);
}
#[test]
fn skip_deserializing_binary_symmetric() {
let v = WithSkipDe {
a: 1,
computed: 42,
b: 2,
};
let bin = asun::encode_binary(&v).unwrap();
let back: WithSkipDe = asun::decode_binary(&bin).unwrap();
assert_eq!(
back,
WithSkipDe {
a: 1,
computed: 0,
b: 2
}
);
}
fn is_zero(n: &u32) -> bool {
*n == 0
}
#[derive(Debug, PartialEq, AsunEncode, AsunDecode)]
struct WithSkipIf {
a: u32,
#[asun(skip_serializing_if = "is_zero")]
maybe: u32,
b: u32,
}
#[test]
fn skip_serializing_if_text_conditional() {
let v = WithSkipIf {
a: 1,
maybe: 0,
b: 2,
};
let txt = asun::encode(&v).unwrap();
assert!(
!txt.contains("maybe"),
"field should be omitted when predicate holds: {txt}"
);
let back: WithSkipIf = asun::decode(&txt).unwrap();
assert_eq!(back, v);
let v2 = WithSkipIf {
a: 1,
maybe: 7,
b: 2,
};
let txt2 = asun::encode(&v2).unwrap();
assert!(
txt2.contains("maybe"),
"field should be present when predicate fails: {txt2}"
);
let back2: WithSkipIf = asun::decode(&txt2).unwrap();
assert_eq!(back2, v2);
}
#[test]
fn skip_serializing_if_binary_always_written() {
for maybe in [0u32, 7u32] {
let v = WithSkipIf { a: 1, maybe, b: 2 };
let bin = asun::encode_binary(&v).unwrap();
let back: WithSkipIf = asun::decode_binary(&bin).unwrap();
assert_eq!(back, v);
}
}
#[derive(Debug, PartialEq)]
struct NoDefault(u32);
fn make_no_default() -> NoDefault {
NoDefault(123)
}
#[derive(Debug, PartialEq, AsunEncode, AsunDecode)]
struct WithNonDefault {
a: u32,
#[asun(skip, default = "make_no_default")]
inner: NoDefault,
}
#[test]
fn default_path_for_non_default_type() {
let v = WithNonDefault {
a: 5,
inner: NoDefault(999),
};
let txt = asun::encode(&v).unwrap();
let back: WithNonDefault = asun::decode(&txt).unwrap();
assert_eq!(
back,
WithNonDefault {
a: 5,
inner: NoDefault(123)
}
);
let bin = asun::encode_binary(&v).unwrap();
let back_b: WithNonDefault = asun::decode_binary(&bin).unwrap();
assert_eq!(
back_b,
WithNonDefault {
a: 5,
inner: NoDefault(123)
}
);
}