extern crate gluon_base as base; extern crate gluon_format as format; use std::{ env, fs::File, io::{Read, Write}, path::{Path, PathBuf}, }; use difference::assert_diff; use gluon::{RootedThread, ThreadExt, VmBuilder}; type Error = Box; fn new_vm() -> RootedThread { VmBuilder::new() .import_paths(Some(vec![".".into(), "..".into()])) .build() } fn test_format(name: &str) { let _ = env_logger::try_init(); let mut contents = String::new(); File::open(Path::new("../").join(name)) .or_else(|_| File::open(name)) .unwrap() .read_to_string(&mut contents) .unwrap(); let thread = new_vm(); let out_str = thread .format_expr(&mut format::Formatter::default(), name, &contents) .unwrap_or_else(|err| panic!("{}", err)); if contents != out_str { let args: Vec<_> = env::args().collect(); let out_path = Path::new(&args[0][..]) .parent() .and_then(|p| p.parent()) .expect("folder") .join(Path::new(name).file_name().unwrap()); File::create(out_path) .unwrap() .write_all(out_str.as_bytes()) .unwrap(); assert_diff!(&contents, &out_str, "\n", 0); } } fn test_files(path: &str) -> Result, Error> { let paths: Vec<_> = walkdir::WalkDir::new(path) .into_iter() .filter_map(|f| { f.ok().and_then(|f| { let path = f.path(); if path.extension().and_then(|e| e.to_str()) == Some("glu") { Some(path.to_owned()) } else { None } }) }) .collect(); assert!(!paths.is_empty(), "Expected test files"); Ok(paths) } #[tokio::main] async fn main() { if let Err(err) = main_().await { eprintln!("{}", err); std::process::exit(1); } } async fn main_() -> Result<(), Error> { let files = test_files("../std")?; let report = tensile::tokio_console_runner( tensile::group( "fmt", files .into_iter() .chain(Some(PathBuf::from("../repl/src/repl.glu"))) .map(|file| { let name = file.display().to_string(); tensile::test(name.clone(), move || test_format(&name)) }) .collect(), ), &Default::default(), ) .await?; if !report.passes() { return Err("Some tests failed".into()); } Ok(()) }