use indoc::indoc; use serde::de::Deserialize; #[cfg(not(miri))] use serde::de::{SeqAccess, Visitor}; use serde_derive::{Deserialize, Serialize}; use serde_yaml::value::{Tag, TaggedValue}; use serde_yaml::{Deserializer, Value}; #[cfg(not(miri))] use std::collections::BTreeMap; #[cfg(not(miri))] use std::fmt; use std::fmt::Debug;
fn test_error<'de, T>(yaml: &'de str, expected: &str) where
T: Deserialize<'de> + Debug,
{ let result = serde_yaml::from_str::<T>(yaml);
assert_eq!(expected, result.unwrap_err().to_string());
letmut deserializer = Deserializer::from_str(yaml); iflet Some(first_document) = deserializer.next() { if deserializer.next().is_none() { let result = T::deserialize(first_document);
assert_eq!(expected, result.unwrap_err().to_string());
}
}
}
#[test] fn test_scan_error() { let yaml = ">\n@"; let expected = "found character that cannot start any token at line 2 column 1, while scanning for the next token";
test_error::<Value>(yaml, expected);
}
#[test] fn test_incorrect_type() { let yaml = indoc! {"
---
str "}; let expected = "invalid type: string \"str\", expected i16 at line 2 column 1";
test_error::<i16>(yaml, expected);
}
#[test] fn test_incorrect_nested_type() { #[derive(Deserialize, Debug)] pubstruct A { #[allow(dead_code)] pub b: Vec<B>,
} #[derive(Deserialize, Debug)] pubenum B {
C(#[allow(dead_code)] C),
} #[derive(Deserialize, Debug)] pubstruct C { #[allow(dead_code)] pub d: bool,
} let yaml = indoc! {"
b:
- !C
d: fase "}; let expected = "b[0].d: invalid type: string \"fase\", expected a boolean at line 3 column 8";
test_error::<A>(yaml, expected);
}
#[test] fn test_empty() { let expected = "EOF while parsing a value";
test_error::<String>("", expected);
}
#[test] fn test_missing_field() { #[derive(Deserialize, Debug)] pubstruct Basic { #[allow(dead_code)] pub v: bool, #[allow(dead_code)] pub w: bool,
} let yaml = indoc! {"
---
v: true "}; let expected = "missing field `w` at line 2 column 1";
test_error::<Basic>(yaml, expected);
}
#[test] fn test_unknown_anchor() { let yaml = indoc! {"
---
*some "}; let expected = "unknown anchor at line 2 column 1";
test_error::<String>(yaml, expected);
}
#[test] fn test_ignored_unknown_anchor() { #[derive(Deserialize, Debug)] pubstruct Wrapper { #[allow(dead_code)] pub c: (),
} let yaml = indoc! {"
b: [*a]
c: ~ "}; let expected = "unknown anchor at line 1 column 5";
test_error::<Wrapper>(yaml, expected);
}
#[test] fn test_bytes() { let expected = "serialization and deserialization of bytes in YAML is not implemented";
test_error::<&[u8]>("...", expected);
}
#[test] fn test_two_documents() { let yaml = indoc! {"
--- 0
--- 1 "}; let expected = "deserializing from YAML containing more than one document is not supported";
test_error::<usize>(yaml, expected);
}
letmut de = Deserializer::from_str(yaml); let first_doc = de.next().unwrap(); let result = <usize as serde::Deserialize>::deserialize(first_doc);
assert_eq!(0, result.unwrap());
let second_doc = de.next().unwrap(); let result = <usize as serde::Deserialize>::deserialize(second_doc); let expected = "did not find expected node content at line 4 column 1, while parsing a block node";
assert_eq!(expected, result.unwrap_err().to_string());
}
#[test] fn test_missing_enum_tag() { #[derive(Deserialize, Debug)] pubenum E {
V(#[allow(dead_code)] usize),
} let yaml = indoc! {r#" "V": 16 "other": 32 "#}; let expected = "invalid type: map, expected a YAML tag starting with '!'";
test_error::<E>(yaml, expected);
}
let yaml = indoc! {"
---
!Inner [] "}; let expected = "deserializing nested enum in Outer::Inner from YAML is not supported yet at line 2 column 1";
test_error::<Outer>(yaml, expected);
let yaml = indoc! {"
---
!Variant [] "}; let expected = "unknown variant `Variant`, expected `Inner`";
test_error::<Outer>(yaml, expected);
let yaml = indoc! {"
---
!Inner !Variant [] "}; let expected = "deserializing nested enum in Outer::Inner from YAML is not supported yet at line 2 column 1";
test_error::<Outer>(yaml, expected);
}
#[test] fn test_variant_not_a_seq() { #[derive(Deserialize, Debug)] pubenum E {
V(#[allow(dead_code)] usize),
} let yaml = indoc! {"
---
!V
value: 0 "}; let expected = "invalid type: map, expected usize at line 2 column 1";
test_error::<E>(yaml, expected);
}
let yaml = "x: ''\n"; let expected = "x: invalid type: string \"\", expected an array of length 1 at line 1 column 4";
test_error::<S>(yaml, expected);
}
let yaml = "{'x':".repeat(1_000) + &"}".repeat(1_000); let expected = "recursion limit exceeded at line 1 column 641";
test_error::<S>(&yaml, expected);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.