#[cfg(test)]
mod tests {
use serde::{Deserialize, Serialize};
use serde_yml::with::*;
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum MyEnum {
Unit,
Newtype(usize),
Tuple(usize, usize),
Struct { value: usize },
}
#[test]
fn test_nested_singleton_map() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum InnerEnum {
Variant1,
Variant2(String),
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum OuterEnum {
Variant1(InnerEnum),
Variant2 { inner: InnerEnum },
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TestStruct {
#[serde(with = "nested_singleton_map")]
field: OuterEnum,
}
let test_struct = TestStruct {
field: OuterEnum::Variant1(InnerEnum::Variant1),
};
let yaml = serde_yml::to_string(&test_struct).unwrap();
assert_eq!(yaml, "field:\n Variant1: Variant1\n");
let deserialized: TestStruct =
serde_yml::from_str(&yaml).unwrap();
assert_eq!(test_struct, deserialized);
let test_struct = TestStruct {
field: OuterEnum::Variant2 {
inner: InnerEnum::Variant2("value".to_string()),
},
};
let yaml = serde_yml::to_string(&test_struct).unwrap();
assert_eq!(
yaml,
"field:\n Variant2:\n inner:\n Variant2: value\n"
);
let deserialized: TestStruct =
serde_yml::from_str(&yaml).unwrap();
assert_eq!(test_struct, deserialized);
}
#[test]
fn test_singleton_map_optional() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TestStruct {
#[serde(with = "singleton_map_optional")]
field: Option<MyEnum>,
}
let test_struct = TestStruct {
field: Some(MyEnum::Unit),
};
let yaml = serde_yml::to_string(&test_struct).unwrap();
assert_eq!(yaml, "field: Unit\n");
let deserialized: TestStruct =
serde_yml::from_str(&yaml).unwrap();
assert_eq!(test_struct, deserialized);
let test_struct = TestStruct { field: None };
let yaml = serde_yml::to_string(&test_struct).unwrap();
assert_eq!(yaml, "field: null\n");
let deserialized: TestStruct =
serde_yml::from_str(&yaml).unwrap();
assert_eq!(test_struct, deserialized);
}
#[test]
fn test_singleton_map_with() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TestStruct {
#[serde(with = "singleton_map_with")]
field: MyEnum,
}
let test_struct = TestStruct {
field: MyEnum::Unit,
};
let yaml = serde_yml::to_string(&test_struct).unwrap();
assert_eq!(yaml, "field: Unit\n");
let deserialized: TestStruct =
serde_yml::from_str(&yaml).unwrap();
assert_eq!(test_struct, deserialized);
}
#[test]
fn test_nested_singleton_map_serialization() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum InnerEnum {
Variant1,
Variant2(String),
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum OuterEnum {
Variant1(InnerEnum),
Variant2 { inner: InnerEnum },
}
let value = OuterEnum::Variant1(InnerEnum::Variant1);
let mut serializer = serde_yml::Serializer::new(Vec::new());
nested_singleton_map::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Variant1: Variant1\n");
let value = OuterEnum::Variant2 {
inner: InnerEnum::Variant2("value".to_string()),
};
let mut serializer = serde_yml::Serializer::new(Vec::new());
nested_singleton_map::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Variant2:\n inner:\n Variant2: value\n");
}
#[test]
fn test_nested_singleton_map_deserialization() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum InnerEnum {
Variant1,
Variant2(String),
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum OuterEnum {
Variant1(InnerEnum),
Variant2 { inner: InnerEnum },
}
let yaml = "Variant1: Variant1\n";
let deserialized: OuterEnum =
nested_singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(
deserialized,
OuterEnum::Variant1(InnerEnum::Variant1)
);
let yaml = "Variant2:\n inner:\n Variant2: value\n";
let deserialized: OuterEnum =
nested_singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(
deserialized,
OuterEnum::Variant2 {
inner: InnerEnum::Variant2("value".to_string())
}
);
}
#[test]
fn test_singleton_map_recursive() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum NestedEnum {
Variant(MyEnum),
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct TestStruct {
#[serde(with = "singleton_map_recursive")]
field: NestedEnum,
}
let test_struct = TestStruct {
field: NestedEnum::Variant(MyEnum::Unit),
};
let yaml = serde_yml::to_string(&test_struct).unwrap();
assert_eq!(yaml, "field:\n Variant: Unit\n");
let deserialized: TestStruct =
serde_yml::from_str(&yaml).unwrap();
assert_eq!(test_struct, deserialized);
}
#[test]
fn test_singleton_map_recursive_top_level() {
let value = MyEnum::Unit;
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map_recursive::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Unit\n");
let deserialized: MyEnum =
singleton_map_recursive::deserialize(
serde_yml::Deserializer::from_str(&yaml),
)
.unwrap();
assert_eq!(value, deserialized);
}
#[test]
fn test_singleton_map_serialization() {
let value = MyEnum::Unit;
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Unit\n");
let value = MyEnum::Newtype(42);
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Newtype: 42\n");
let value = MyEnum::Tuple(1, 2);
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Tuple:\n- 1\n- 2\n");
let value = MyEnum::Struct { value: 42 };
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Struct:\n value: 42\n");
}
#[test]
fn test_singleton_map_deserialization() {
let yaml = "Unit\n";
let deserialized: MyEnum = singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, MyEnum::Unit);
let yaml = "Newtype: 42\n";
let deserialized: MyEnum = singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, MyEnum::Newtype(42));
let yaml = "Tuple:\n- 1\n- 2\n";
let deserialized: MyEnum = singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, MyEnum::Tuple(1, 2));
let yaml = "Struct:\n value: 42\n";
let deserialized: MyEnum = singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, MyEnum::Struct { value: 42 });
}
#[test]
fn test_singleton_map_optional_serialization() {
let value = Some(MyEnum::Unit);
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map_optional::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Unit\n");
let value: Option<MyEnum> = None;
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map_optional::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "null\n");
}
#[test]
fn test_singleton_map_optional_deserialization() {
let yaml = "Unit\n";
let deserialized: Option<MyEnum> =
singleton_map_optional::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, Some(MyEnum::Unit));
let yaml = "null\n";
let deserialized: Option<MyEnum> =
singleton_map_optional::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, None);
}
#[test]
fn test_singleton_map_with_serialization() {
let value = MyEnum::Unit;
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map_with::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Unit\n");
}
#[test]
fn test_singleton_map_with_deserialization() {
let yaml = "Unit\n";
let deserialized: MyEnum = singleton_map_with::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, MyEnum::Unit);
}
#[test]
fn test_singleton_map_recursive_serialization() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum NestedEnum {
Variant(MyEnum),
}
let value = NestedEnum::Variant(MyEnum::Unit);
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map_recursive::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Variant: Unit\n");
}
#[test]
fn test_singleton_map_recursive_deserialization() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum NestedEnum {
Variant(MyEnum),
}
let yaml = "Variant: Unit\n";
let deserialized: NestedEnum =
singleton_map_recursive::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, NestedEnum::Variant(MyEnum::Unit));
}
#[test]
fn test_singleton_map_recursive_top_level_serialization() {
let value = MyEnum::Unit;
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map_recursive::serialize(&value, &mut serializer)
.unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Unit\n");
}
#[test]
fn test_singleton_map_recursive_top_level_deserialization() {
let yaml = "Unit\n";
let deserialized: MyEnum =
singleton_map_recursive::deserialize(
serde_yml::Deserializer::from_str(yaml),
)
.unwrap();
assert_eq!(deserialized, MyEnum::Unit);
}
#[test]
fn test_singleton_map_deserialization_error() {
let yaml = "InvalidYAML";
let result: Result<MyEnum, _> = singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
);
assert!(result.is_err());
}
#[test]
fn test_singleton_map_missing_field_error() {
let yaml = "MissingField: 42";
let result: Result<MyEnum, _> = singleton_map::deserialize(
serde_yml::Deserializer::from_str(yaml),
);
assert!(result.is_err());
}
#[test]
fn test_empty_enum() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum SingleVariantEnum {
Variant,
}
let value = SingleVariantEnum::Variant;
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Variant\n");
let deserialized: SingleVariantEnum =
singleton_map::deserialize(
serde_yml::Deserializer::from_str(&yaml),
)
.unwrap();
assert_eq!(value, deserialized);
}
#[test]
fn test_generic_enum() {
#[derive(Serialize, Deserialize, PartialEq, Debug)]
enum GenericEnum<T> {
Variant(T),
}
let value = GenericEnum::Variant(42);
let mut serializer = serde_yml::Serializer::new(Vec::new());
singleton_map::serialize(&value, &mut serializer).unwrap();
let yaml = String::from_utf8(serializer.into_inner().unwrap())
.unwrap();
assert_eq!(yaml, "Variant: 42\n");
let deserialized: GenericEnum<i32> =
singleton_map::deserialize(
serde_yml::Deserializer::from_str(&yaml),
)
.unwrap();
assert_eq!(value, deserialized);
}
}