Source code
Revision control
Copy as Markdown
Other Tools
use crate::{
integer, key_ref, serializer::Serializer, string_ref, token_ref, Date, Decimal, Error,
};
#[cfg(feature = "parsed-types")]
use crate::{BareItem, Dictionary, FieldType, InnerList, Item, List, Parameters};
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_value_empty_dict() {
let dict_field_value = Dictionary::new();
assert_eq!(None, dict_field_value.serialize());
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_value_empty_list() {
let list_field_value = List::new();
assert_eq!(None, list_field_value.serialize());
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_value_list_mixed_members_with_params() -> Result<(), Error> {
let item1 = Item::new(Decimal::try_from(42.4568)?);
let item2_param = Parameters::from_iter(vec![(
key_ref("itm2_p").to_owned(),
BareItem::Boolean(true),
)]);
let item2 = Item::with_params(17, item2_param);
let inner_list_item1_param = Parameters::from_iter(vec![(
key_ref("in1_p").to_owned(),
BareItem::Boolean(false),
)]);
let inner_list_item1 = Item::with_params(string_ref("str1"), inner_list_item1_param);
let inner_list_item2_param = Parameters::from_iter(vec![(
key_ref("in2_p").to_owned(),
BareItem::String(string_ref("valu\\e").to_owned()),
)]);
let inner_list_item2 = Item::with_params(token_ref("str2"), inner_list_item2_param);
let inner_list_param = Parameters::from_iter(vec![(
key_ref("inner_list_param").to_owned(),
BareItem::ByteSequence(b"weather".to_vec()),
)]);
let inner_list =
InnerList::with_params(vec![inner_list_item1, inner_list_item2], inner_list_param);
let list_field_value: List = vec![item1.into(), item2.into(), inner_list.into()];
assert_eq!(
Some(
r#"42.457, 17;itm2_p, ("str1";in1_p=?0 str2;in2_p="valu\\e");inner_list_param=:d2VhdGhlcg==:"#
),
list_field_value.serialize().as_deref(),
);
Ok(())
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_item_byteseq_with_param() {
let item_param = (
key_ref("a").to_owned(),
BareItem::Token(token_ref("*ab_1").to_owned()),
);
let item_param = Parameters::from_iter(vec![item_param]);
let item = Item::with_params(b"parser".to_vec(), item_param);
assert_eq!(":cGFyc2Vy:;a=*ab_1", item.serialize());
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_item_without_params() {
let item = Item::new(1);
assert_eq!("1", item.serialize());
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_item_with_bool_true_param() -> Result<(), Error> {
let param = Parameters::from_iter(vec![(key_ref("a").to_owned(), BareItem::Boolean(true))]);
let item = Item::with_params(Decimal::try_from(12.35)?, param);
assert_eq!("12.35;a", item.serialize());
Ok(())
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_item_with_token_param() {
let param = Parameters::from_iter(vec![(
key_ref("a1").to_owned(),
BareItem::Token(token_ref("*tok").to_owned()),
)]);
let item = Item::with_params(string_ref("12.35"), param);
assert_eq!(r#""12.35";a1=*tok"#, item.serialize());
}
#[test]
fn serialize_integer() {
let mut buf = String::new();
Serializer::serialize_integer(integer(-12), &mut buf);
assert_eq!("-12", &buf);
buf.clear();
Serializer::serialize_integer(integer(0), &mut buf);
assert_eq!("0", &buf);
buf.clear();
Serializer::serialize_integer(integer(999_999_999_999_999), &mut buf);
assert_eq!("999999999999999", &buf);
buf.clear();
Serializer::serialize_integer(integer(-999_999_999_999_999), &mut buf);
assert_eq!("-999999999999999", &buf);
}
#[test]
fn serialize_decimal() -> Result<(), Error> {
let mut buf = String::new();
Serializer::serialize_decimal(Decimal::try_from(-99.134_689_7)?, &mut buf);
assert_eq!("-99.135", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(-1.00)?, &mut buf);
assert_eq!("-1.0", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(-99.134_689_7)?, &mut buf);
assert_eq!("-99.135", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(100.13)?, &mut buf);
assert_eq!("100.13", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(-100.130)?, &mut buf);
assert_eq!("-100.13", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(-100.100)?, &mut buf);
assert_eq!("-100.1", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(-137.0)?, &mut buf);
assert_eq!("-137.0", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(137_121_212_112.123)?, &mut buf);
assert_eq!("137121212112.123", &buf);
buf.clear();
Serializer::serialize_decimal(Decimal::try_from(137_121_212_112.123_8)?, &mut buf);
assert_eq!("137121212112.124", &buf);
Ok(())
}
#[test]
fn serialize_string() {
let mut buf = String::new();
Serializer::serialize_string(string_ref("1.1 text"), &mut buf);
assert_eq!(r#""1.1 text""#, &buf);
buf.clear();
Serializer::serialize_string(string_ref(r#"hello "name""#), &mut buf);
assert_eq!(r#""hello \"name\"""#, &buf);
buf.clear();
Serializer::serialize_string(string_ref("something\\nothing"), &mut buf);
assert_eq!(r#""something\\nothing""#, &buf);
buf.clear();
Serializer::serialize_string(string_ref(""), &mut buf);
assert_eq!(r#""""#, &buf);
buf.clear();
Serializer::serialize_string(string_ref(" "), &mut buf);
assert_eq!(r#"" ""#, &buf);
buf.clear();
Serializer::serialize_string(string_ref(" "), &mut buf);
assert_eq!(r#"" ""#, &buf);
}
#[test]
fn serialize_token() {
let mut buf = String::new();
Serializer::serialize_token(token_ref("*"), &mut buf);
assert_eq!("*", &buf);
buf.clear();
Serializer::serialize_token(token_ref("abc"), &mut buf);
assert_eq!("abc", &buf);
buf.clear();
Serializer::serialize_token(token_ref("abc:de"), &mut buf);
assert_eq!("abc:de", &buf);
buf.clear();
Serializer::serialize_token(token_ref("smth/#!else"), &mut buf);
assert_eq!("smth/#!else", &buf);
}
#[test]
fn serialize_byte_sequence() {
let mut buf = String::new();
Serializer::serialize_byte_sequence("hello".as_bytes(), &mut buf);
assert_eq!(":aGVsbG8=:", &buf);
buf.clear();
Serializer::serialize_byte_sequence("test_encode".as_bytes(), &mut buf);
assert_eq!(":dGVzdF9lbmNvZGU=:", &buf);
buf.clear();
Serializer::serialize_byte_sequence("".as_bytes(), &mut buf);
assert_eq!("::", &buf);
buf.clear();
Serializer::serialize_byte_sequence("pleasure.".as_bytes(), &mut buf);
assert_eq!(":cGxlYXN1cmUu:", &buf);
buf.clear();
Serializer::serialize_byte_sequence("leasure.".as_bytes(), &mut buf);
assert_eq!(":bGVhc3VyZS4=:", &buf);
buf.clear();
Serializer::serialize_byte_sequence("easure.".as_bytes(), &mut buf);
assert_eq!(":ZWFzdXJlLg==:", &buf);
buf.clear();
Serializer::serialize_byte_sequence("asure.".as_bytes(), &mut buf);
assert_eq!(":YXN1cmUu:", &buf);
buf.clear();
Serializer::serialize_byte_sequence("sure.".as_bytes(), &mut buf);
assert_eq!(":c3VyZS4=:", &buf);
}
#[test]
fn serialize_bool() {
let mut buf = String::new();
Serializer::serialize_bool(true, &mut buf);
assert_eq!("?1", &buf);
buf.clear();
Serializer::serialize_bool(false, &mut buf);
assert_eq!("?0", &buf);
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_params_bool() {
let mut buf = String::new();
Serializer::serialize_parameter(key_ref("*b"), true, &mut buf);
assert_eq!(";*b", buf);
buf.clear();
Serializer::serialize_parameter(key_ref("a.a"), false, &mut buf);
assert_eq!(";a.a=?0", buf);
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_params_string() {
let mut buf = String::new();
Serializer::serialize_parameter(key_ref("b"), string_ref("param_val"), &mut buf);
assert_eq!(r#";b="param_val""#, buf);
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_params_numbers() -> Result<(), Error> {
let mut buf = String::new();
Serializer::serialize_parameter(key_ref("key1"), Decimal::try_from(746.15)?, &mut buf);
assert_eq!(";key1=746.15", buf);
buf.clear();
Serializer::serialize_parameter(key_ref("key2"), 11111, &mut buf);
assert_eq!(";key2=11111", buf);
Ok(())
}
#[test]
fn serialize_key() {
let mut buf = String::new();
Serializer::serialize_key(key_ref("*a_fg"), &mut buf);
assert_eq!("*a_fg", &buf);
buf.clear();
Serializer::serialize_key(key_ref("*a_fg*"), &mut buf);
assert_eq!("*a_fg*", &buf);
buf.clear();
Serializer::serialize_key(key_ref("key1"), &mut buf);
assert_eq!("key1", &buf);
buf.clear();
Serializer::serialize_key(key_ref("ke-y.1"), &mut buf);
assert_eq!("ke-y.1", &buf);
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_list_of_items_and_inner_list() {
let item1 = Item::new(12);
let item2 = Item::new(14);
let item3 = Item::new(token_ref("a"));
let item4 = Item::new(token_ref("b"));
let inner_list_param = Parameters::from_iter(vec![(
key_ref("param").to_owned(),
BareItem::String(string_ref("param_value_1").to_owned()),
)]);
let inner_list = InnerList::with_params(vec![item3, item4], inner_list_param);
let input: List = vec![item1.into(), item2.into(), inner_list.into()];
assert_eq!(
Some(r#"12, 14, (a b);param="param_value_1""#),
input.serialize().as_deref(),
);
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_list_of_lists() {
let item1 = Item::new(1);
let item2 = Item::new(2);
let item3 = Item::new(42);
let item4 = Item::new(43);
let inner_list_1 = InnerList::new(vec![item1, item2]);
let inner_list_2 = InnerList::new(vec![item3, item4]);
let input: List = vec![inner_list_1.into(), inner_list_2.into()];
assert_eq!(Some("(1 2), (42 43)"), input.serialize().as_deref());
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_list_with_bool_item_and_bool_params() {
let item1_params = Parameters::from_iter(vec![
(key_ref("a").to_owned(), BareItem::Boolean(true)),
(key_ref("b").to_owned(), BareItem::Boolean(false)),
]);
let item1 = Item::with_params(false, item1_params);
let item2 = Item::new(token_ref("cde_456"));
let input: List = vec![item1.into(), item2.into()];
assert_eq!(Some("?0;a;b=?0, cde_456"), input.serialize().as_deref());
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_dictionary_with_params() {
let item1_params = Parameters::from_iter(vec![
(key_ref("a").to_owned(), 1.into()),
(key_ref("b").to_owned(), BareItem::Boolean(true)),
]);
let item2_params = Parameters::new();
let item3_params = Parameters::from_iter(vec![
(key_ref("q").to_owned(), BareItem::Boolean(false)),
(
key_ref("r").to_owned(),
BareItem::String(string_ref("+w").to_owned()),
),
]);
let item1 = Item::with_params(123, item1_params);
let item2 = Item::with_params(456, item2_params);
let item3 = Item::with_params(789, item3_params);
let input = Dictionary::from_iter(vec![
(key_ref("abc").to_owned(), item1.into()),
(key_ref("def").to_owned(), item2.into()),
(key_ref("ghi").to_owned(), item3.into()),
]);
assert_eq!(
Some(r#"abc=123;a=1;b, def=456, ghi=789;q=?0;r="+w""#),
input.serialize().as_deref(),
);
}
#[test]
#[cfg(feature = "parsed-types")]
fn serialize_dict_empty_member_value() {
let inner_list = InnerList::new(vec![]);
let input = Dictionary::from_iter(vec![(key_ref("a").to_owned(), inner_list.into())]);
assert_eq!(Some("a=()"), input.serialize().as_deref());
}
#[test]
fn serialize_date_with() {
let mut buf = String::new();
Serializer::serialize_date(Date::UNIX_EPOCH, &mut buf);
assert_eq!(buf, "@0");
}
#[test]
fn serialize_display_string() {
let mut buf = String::new();
Serializer::serialize_display_string("üsers", &mut buf);
assert_eq!(buf, r#"%"%c3%bcsers""#);
}