use std::fmt::Write as _;
use ridl_syntax::{Parse, Profile, parse};
fn dump(parse: &Parse) -> String {
let mut out = format!("{:#?}", parse.syntax());
out.push_str("errors:");
if parse.errors().is_empty() {
out.push_str(" none\n");
} else {
out.push('\n');
for error in parse.errors() {
writeln!(out, " {} {:?} {}", error.code, error.range, error.message)
.expect("writing to a String");
}
}
out
}
#[test]
fn ok_corpus_is_lossless_error_free_and_matches_snapshots() {
insta::glob!("../test_data/parser/ok", "*.typl", |path| {
let input = std::fs::read_to_string(path).expect("a readable corpus file");
let parsed = parse(&input, Profile::Typl);
assert_eq!(
parsed.syntax().text().to_string(),
input,
"parse is not lossless for {}",
path.display(),
);
assert!(
parsed.errors().is_empty(),
"ok-corpus file {} must parse with zero errors, got: {:?}",
path.display(),
parsed.errors(),
);
insta::assert_snapshot!(dump(&parsed));
});
}
#[test]
fn ridl_ok_corpus_is_lossless_error_free_and_matches_snapshots() {
insta::glob!("../test_data/parser/ok", "*.ridl", |path| {
let input = std::fs::read_to_string(path).expect("a readable corpus file");
let parsed = parse(&input, Profile::Ridl);
assert_eq!(
parsed.syntax().text().to_string(),
input,
"parse is not lossless for {}",
path.display(),
);
assert!(
parsed.errors().is_empty(),
"ok-corpus file {} must parse with zero errors, got: {:?}",
path.display(),
parsed.errors(),
);
insta::assert_snapshot!(dump(&parsed));
});
}
#[test]
fn rsdl_ok_corpus_is_lossless_error_free_and_matches_snapshots() {
insta::glob!("../test_data/parser/ok", "*.rsdl", |path| {
let input = std::fs::read_to_string(path).expect("a readable corpus file");
let parsed = parse(&input, Profile::Rsdl);
assert_eq!(
parsed.syntax().text().to_string(),
input,
"parse is not lossless for {}",
path.display(),
);
assert!(
parsed.errors().is_empty(),
"ok-corpus file {} must parse with zero errors, got: {:?}",
path.display(),
parsed.errors(),
);
insta::assert_snapshot!(dump(&parsed));
});
}