use libtest::{Arguments, Completion, Failed, Trial};
use pretty_assertions::StrComparison;
use pulldown_cmark::Parser;
use std::{fs, path::PathBuf, process::ExitCode};
macro_rules! assert_eq {
($left:expr, $right:expr) => {{
let left = $left;
let right = $right;
if left == right {
Ok(Completion::Completed)
} else {
Err(Failed::from(format_args!(
"assertion failed (`{}` == `{}`):\n{}",
stringify!($left),
stringify!($right),
StrComparison::new(&left, &right)
)))
}
}};
}
fn test(md_path: PathBuf) -> Result<Completion, Failed> {
let md = fs::read_to_string(&md_path)?;
let parser = Parser::new_ext(&md, pulldown_cmark_to_flowed::parser_options());
let mut txt = String::new();
pulldown_cmark_to_flowed::push_text(&mut txt, parser);
let mut txt_path = md_path;
txt_path.set_extension("txt");
if txt_path.exists() {
let expected = fs::read_to_string(&txt_path)?;
assert_eq!(txt, expected)
} else {
fs::write(&txt_path, txt)?;
Ok(Completion::ignored_with("WIP"))
}
}
fn main() -> ExitCode {
let args = Arguments::from_args();
let mut tests = Vec::new();
let dir = concat!(env!("CARGO_MANIFEST_DIR"), "/tests/");
for entry in fs::read_dir(dir).unwrap() {
let entry = entry.unwrap();
let path = entry.path();
if path
.extension()
.is_some_and(|e| e.eq_ignore_ascii_case("md"))
{
let name = path.file_name().unwrap();
tests.push(Trial::ignorable_test(
name.to_string_lossy().into_owned(),
move || test(path)
));
}
}
libtest::run(&args, tests).exit_code()
}