80 lines
2.2 KiB
Rust
80 lines
2.2 KiB
Rust
//! A test suite to parse everything in `parse-fail` and assert that it matches
|
|
//! the `*.err` file it generates.
|
|
//!
|
|
//! Use `BLESS=1` in the environment to auto-update `*.err` files. Be sure to
|
|
//! look at the diff!
|
|
|
|
use libtest_mimic::{Arguments, Trial};
|
|
use std::env;
|
|
use std::path::{Path, PathBuf};
|
|
|
|
fn main() {
|
|
let mut tests = Vec::new();
|
|
find_tests("tests/parse-fail".as_ref(), &mut tests);
|
|
let bless = env::var("BLESS").is_ok();
|
|
|
|
let mut trials = Vec::new();
|
|
for test in tests {
|
|
let trial = Trial::test(format!("{test:?}"), move || {
|
|
run_test(&test, bless).map_err(|e| format!("{e:?}").into())
|
|
});
|
|
trials.push(trial);
|
|
}
|
|
|
|
let mut args = Arguments::from_args();
|
|
if cfg!(target_family = "wasm") && !cfg!(target_feature = "atomics") {
|
|
args.test_threads = Some(1);
|
|
}
|
|
libtest_mimic::run(&args, trials).exit();
|
|
}
|
|
|
|
fn run_test(test: &Path, bless: bool) -> anyhow::Result<()> {
|
|
let err = match wat::parse_file(test) {
|
|
Ok(_) => anyhow::bail!("{} parsed successfully", test.display()),
|
|
Err(e) => e.to_string() + "\n",
|
|
};
|
|
let assert = test.with_extension("wat.err");
|
|
if bless {
|
|
std::fs::write(assert, err)?;
|
|
return Ok(());
|
|
}
|
|
|
|
// Ignore CRLF line ending and force always `\n`
|
|
let assert = std::fs::read_to_string(assert)
|
|
.unwrap_or(String::new())
|
|
.replace("\r\n", "\n");
|
|
|
|
// Compare normalize verisons which handles weirdness like path differences
|
|
if normalize(&assert) == normalize(&err) {
|
|
return Ok(());
|
|
}
|
|
|
|
anyhow::bail!(
|
|
"errors did not match:\n\nexpected:\n\t{}\nactual:\n\t{}\n",
|
|
tab(&assert),
|
|
tab(&err),
|
|
);
|
|
|
|
fn normalize(s: &str) -> String {
|
|
s.replace("\\", "/")
|
|
}
|
|
|
|
fn tab(s: &str) -> String {
|
|
s.replace("\n", "\n\t")
|
|
}
|
|
}
|
|
|
|
fn find_tests(path: &Path, tests: &mut Vec<PathBuf>) {
|
|
for f in path.read_dir().unwrap() {
|
|
let f = f.unwrap();
|
|
if f.file_type().unwrap().is_dir() {
|
|
find_tests(&f.path(), tests);
|
|
continue;
|
|
}
|
|
match f.path().extension().and_then(|s| s.to_str()) {
|
|
Some("wat") => {}
|
|
_ => continue,
|
|
}
|
|
tests.push(f.path());
|
|
}
|
|
}
|