saphyr-serde/parser/tests/spec_test.rs

108 lines
2.8 KiB
Rust
Raw Permalink Normal View History

2015-05-27 13:57:42 +00:00
#![allow(dead_code)]
2015-05-30 10:49:54 +00:00
#![allow(non_upper_case_globals)]
extern crate saphyr_parser;
2015-05-27 13:57:42 +00:00
use saphyr_parser::{Event, EventReceiver, Parser, TScalarStyle};
2015-05-27 13:57:42 +00:00
2017-05-08 18:35:53 +00:00
// These names match the names used in the C++ test suite.
2024-06-13 20:05:43 +00:00
#[allow(clippy::enum_variant_names)]
2015-05-27 13:57:42 +00:00
#[derive(Clone, PartialEq, PartialOrd, Debug)]
enum TestEvent {
OnDocumentStart,
OnDocumentEnd,
OnSequenceStart,
OnSequenceEnd,
OnMapStart,
OnMapEnd,
OnScalar,
OnAlias,
OnNull,
}
struct YamlChecker {
2018-09-15 16:49:04 +00:00
pub evs: Vec<TestEvent>,
2015-05-27 13:57:42 +00:00
}
impl EventReceiver for YamlChecker {
fn on_event(&mut self, ev: Event) {
let tev = match ev {
Event::DocumentStart(_) => TestEvent::OnDocumentStart,
2015-05-27 13:57:42 +00:00
Event::DocumentEnd => TestEvent::OnDocumentEnd,
2015-05-28 17:56:03 +00:00
Event::SequenceStart(..) => TestEvent::OnSequenceStart,
2015-05-27 13:57:42 +00:00
Event::SequenceEnd => TestEvent::OnSequenceEnd,
2015-05-28 17:56:03 +00:00
Event::MappingStart(..) => TestEvent::OnMapStart,
2015-05-27 13:57:42 +00:00
Event::MappingEnd => TestEvent::OnMapEnd,
2018-09-15 16:49:04 +00:00
Event::Scalar(ref v, style, _, _) => {
if v == "~" && style == TScalarStyle::Plain {
2015-05-27 13:57:42 +00:00
TestEvent::OnNull
} else {
TestEvent::OnScalar
}
2018-09-15 16:49:04 +00:00
}
2015-05-28 17:56:03 +00:00
Event::Alias(_) => TestEvent::OnAlias,
2018-09-15 16:49:04 +00:00
_ => return, // ignore other events
2015-05-27 13:57:42 +00:00
};
self.evs.push(tev);
}
}
fn str_to_test_events(docs: &str) -> Vec<TestEvent> {
let mut str_events = vec![];
let mut str_error = None;
let mut iter_events = vec![];
let mut iter_error = None;
for x in Parser::new_from_str(docs) {
match x {
Ok(event) => str_events.push(event),
Err(e) => {
str_error = Some(e);
break;
}
}
}
for x in Parser::new_from_iter(docs.chars()) {
match x {
Ok(event) => iter_events.push(event),
Err(e) => {
iter_error = Some(e);
break;
}
}
}
// eprintln!("str_events");
// for x in &str_events {
// eprintln!("\t{x:?}");
// }
// eprintln!("iter_events");
// for x in &iter_events {
// eprintln!("\t{x:?}");
// }
assert_eq!(str_events, iter_events);
assert_eq!(str_error, None);
assert_eq!(iter_error, None);
2018-09-15 16:49:04 +00:00
let mut p = YamlChecker { evs: Vec::new() };
for event in str_events.into_iter().map(|x| x.0) {
p.on_event(event);
}
2015-05-27 13:57:42 +00:00
p.evs
}
macro_rules! assert_next {
2018-09-15 16:49:04 +00:00
($v:expr, $p:pat) => {
2015-05-27 13:57:42 +00:00
match $v.next().unwrap() {
2018-09-15 16:49:04 +00:00
$p => {}
e => {
2023-12-26 17:08:21 +00:00
panic!("unexpected event: {:?} (expected {:?})", e, stringify!($p));
2018-09-15 16:49:04 +00:00
}
2015-05-27 13:57:42 +00:00
}
2018-09-15 16:49:04 +00:00
};
2015-05-27 13:57:42 +00:00
}
// auto generated from handler_spec_test.cpp
include!("specexamples.rs.inc");
include!("spec_test.rs.inc");