#![allow(
clippy::approx_constant,
clippy::bool_assert_comparison,
dead_code,
unused_qualifications
)]
use noyalib::{Value, from_str};
use serde::Deserialize;
#[test]
fn streaming_enum_custom_tag_newtype_variant() {
#[derive(Debug, Deserialize, PartialEq)]
enum Msg {
#[serde(rename = "!bang")]
Bang(i64),
}
let yaml = "!bang 42\n";
let parsed: std::result::Result<Msg, _> = from_str(yaml);
if let Ok(m) = parsed {
assert_eq!(m, Msg::Bang(42));
}
}
#[test]
fn streaming_enum_custom_tag_unit_variant() {
#[derive(Debug, Deserialize, PartialEq)]
enum Msg {
#[serde(rename = "!quiet")]
Quiet,
}
let yaml = "!quiet ~\n";
let parsed: std::result::Result<Msg, _> = from_str(yaml);
if let Ok(m) = parsed {
assert_eq!(m, Msg::Quiet);
}
}
#[test]
fn streaming_custom_tag_on_sequence() {
let yaml = "!mytag [1, 2, 3]\n";
let v: Value = from_str(yaml).unwrap();
match v {
Value::Tagged(t) => assert_eq!(t.tag().as_str(), "!mytag"),
Value::Sequence(_) => {}
_ => panic!("expected tagged sequence or sequence"),
}
}
#[test]
fn streaming_custom_tag_on_mapping() {
let yaml = "!mytag\na: 1\nb: 2\n";
let v: Value = from_str(yaml).unwrap();
match v {
Value::Tagged(t) => assert_eq!(t.tag().as_str(), "!mytag"),
Value::Mapping(_) => {}
_ => panic!("expected tagged mapping or mapping"),
}
}
#[test]
fn streaming_seq_drop_with_short_read() {
#[derive(Debug, Deserialize)]
struct One(i32);
let yaml = "- 1\n- {a: 1, b: [2, 3]}\n- 3\n";
let _: One = from_str(yaml).unwrap_or(One(1));
}
#[test]
fn streaming_enum_custom_tag_struct_variant() {
#[derive(Debug, Deserialize, PartialEq)]
enum Event {
#[serde(rename = "!log")]
Log { level: String, msg: String },
}
let yaml = "!log {level: info, msg: hello}\n";
let parsed: std::result::Result<Event, _> = from_str(yaml);
if let Ok(e) = parsed {
assert!(matches!(e, Event::Log { .. }));
}
}
#[test]
fn streaming_enum_custom_tag_tuple_variant() {
#[derive(Debug, Deserialize, PartialEq)]
enum Pair {
#[serde(rename = "!pair")]
Pair(i32, i32),
}
let yaml = "!pair [1, 2]\n";
let parsed: std::result::Result<Pair, _> = from_str(yaml);
if let Ok(p) = parsed {
assert_eq!(p, Pair::Pair(1, 2));
}
}
#[test]
fn streaming_enum_custom_tag_bare_exclamation() {
#[derive(Debug, Deserialize, PartialEq)]
enum E {
#[serde(rename = "!plain")]
Plain(String),
}
let yaml = "!plain hello\n";
let parsed: std::result::Result<E, _> = from_str(yaml);
if let Ok(v) = parsed {
assert_eq!(v, E::Plain("hello".into()));
}
}