2023-09-08 17:10:28 +03:00
|
|
|
use hvm_core::show_lnet;
|
2023-09-01 17:52:58 +03:00
|
|
|
use hvm_lang::{
|
2023-09-12 22:04:39 +03:00
|
|
|
compile_book,
|
2023-09-08 19:31:32 +03:00
|
|
|
loader::display_err_for_text,
|
2023-09-01 17:52:58 +03:00
|
|
|
parser::{parse_definition_book, parse_term},
|
2023-09-07 22:26:20 +03:00
|
|
|
run_book,
|
2023-09-12 22:04:39 +03:00
|
|
|
to_core::term_to_hvm_core,
|
2023-09-01 17:52:58 +03:00
|
|
|
};
|
2023-09-08 19:31:32 +03:00
|
|
|
use itertools::Itertools;
|
2023-08-31 23:11:19 +03:00
|
|
|
use pretty_assertions::assert_eq;
|
2023-09-09 11:45:51 +03:00
|
|
|
use std::{collections::HashSet, fs, io::Write, path::Path};
|
2023-08-31 23:11:19 +03:00
|
|
|
use walkdir::WalkDir;
|
|
|
|
|
2023-09-01 17:52:58 +03:00
|
|
|
fn run_single_golden_test(
|
|
|
|
path: &Path,
|
|
|
|
run: &dyn Fn(&Path, &str) -> anyhow::Result<String>,
|
|
|
|
) -> anyhow::Result<()> {
|
2023-08-31 23:11:19 +03:00
|
|
|
let code = fs::read_to_string(path)?;
|
2023-09-05 21:23:23 +03:00
|
|
|
let result = match run(path, &code) {
|
|
|
|
Ok(res) => res,
|
|
|
|
Err(err) => err.to_string(),
|
|
|
|
};
|
2023-08-31 23:11:19 +03:00
|
|
|
let golden_path = path.with_extension("golden");
|
|
|
|
if let Ok(to_check) = fs::read_to_string(&golden_path) {
|
|
|
|
assert_eq!(result, to_check, "Testing file '{}'", path.display());
|
|
|
|
Ok(())
|
|
|
|
} else {
|
|
|
|
let mut file = fs::File::create(golden_path)?;
|
|
|
|
file.write_all(result.as_bytes())?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn run_golden_test_dir(root: &Path, run: &dyn Fn(&Path, &str) -> anyhow::Result<String>) {
|
|
|
|
for entry in WalkDir::new(root).follow_links(true) {
|
|
|
|
let entry = entry.unwrap();
|
|
|
|
let path = entry.path();
|
|
|
|
if path.is_file() && path.extension().map(|x| x == "hvm").unwrap_or(false) {
|
|
|
|
eprintln!("running {}", path.display());
|
|
|
|
run_single_golden_test(path, run).unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2023-09-05 21:23:23 +03:00
|
|
|
fn compile_single_terms() {
|
|
|
|
let root = format!("{}/tests/golden_tests/compile_single_terms", env!("CARGO_MANIFEST_DIR"));
|
2023-09-08 19:31:32 +03:00
|
|
|
run_golden_test_dir(Path::new(&root), &|_, code| {
|
2023-08-31 23:11:19 +03:00
|
|
|
let term = parse_term(code).map_err(|errs| {
|
2023-09-08 19:31:32 +03:00
|
|
|
let msg = errs.into_iter().map(|e| display_err_for_text(e)).join("\n");
|
|
|
|
anyhow::anyhow!(msg)
|
2023-08-31 23:11:19 +03:00
|
|
|
})?;
|
2023-09-12 22:04:39 +03:00
|
|
|
let term = term.try_into_affine(&HashSet::new())?;
|
|
|
|
let net = term_to_hvm_core(&term)?;
|
2023-09-04 19:39:22 +03:00
|
|
|
Ok(show_lnet(&net))
|
2023-08-31 23:11:19 +03:00
|
|
|
})
|
|
|
|
}
|
2023-09-01 17:52:58 +03:00
|
|
|
|
|
|
|
#[test]
|
2023-09-05 21:23:23 +03:00
|
|
|
fn compile_single_files() {
|
|
|
|
let root = format!("{}/tests/golden_tests/compile_single_files", env!("CARGO_MANIFEST_DIR"));
|
2023-09-08 19:31:32 +03:00
|
|
|
run_golden_test_dir(Path::new(&root), &|_, code| {
|
2023-09-01 17:52:58 +03:00
|
|
|
let book = parse_definition_book(code).map_err(|errs| {
|
2023-09-08 19:31:32 +03:00
|
|
|
let msg = errs.into_iter().map(|e| display_err_for_text(e)).join("\n");
|
|
|
|
anyhow::anyhow!(msg)
|
2023-09-01 17:52:58 +03:00
|
|
|
})?;
|
2023-09-12 22:04:39 +03:00
|
|
|
let core_book = compile_book(book)?;
|
2023-09-05 21:23:23 +03:00
|
|
|
Ok(core_book.to_string())
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn run_single_files() {
|
|
|
|
let root = format!("{}/tests/golden_tests/run_single_files", env!("CARGO_MANIFEST_DIR"));
|
2023-09-08 19:31:32 +03:00
|
|
|
run_golden_test_dir(Path::new(&root), &|_, code| {
|
2023-09-05 21:23:23 +03:00
|
|
|
let book = parse_definition_book(code).map_err(|errs| {
|
2023-09-08 19:31:32 +03:00
|
|
|
let msg = errs.into_iter().map(|e| display_err_for_text(e)).join("\n");
|
|
|
|
anyhow::anyhow!(msg)
|
2023-09-05 21:23:23 +03:00
|
|
|
})?;
|
2023-09-12 22:04:39 +03:00
|
|
|
let (res, _) = run_book(book)?;
|
2023-09-07 22:26:20 +03:00
|
|
|
Ok(res.to_string())
|
2023-09-01 17:52:58 +03:00
|
|
|
})
|
|
|
|
}
|