summaryrefslogtreecommitdiff
path: root/tests/src/tests.rs
diff options
context:
space:
mode:
authorIan Wrzesinski <wrzian@umich.edu>2024-09-22 17:38:38 -0400
committerIan Wrzesinski <wrzian@umich.edu>2024-10-31 18:26:12 -0400
commitda83f33c4c015f927920b437610153c029c8291b (patch)
tree2346a04cc7415a0b58a6952cbdbfad7562499182 /tests/src/tests.rs
parent1261d176b0d0eebe8aef117fb5929209f018f1fa (diff)
1. Add test-runner option to compare parser output
Diffstat (limited to 'tests/src/tests.rs')
-rw-r--r--tests/src/tests.rs62
1 files changed, 60 insertions, 2 deletions
diff --git a/tests/src/tests.rs b/tests/src/tests.rs
index 940c9e3c..eb2cfd79 100644
--- a/tests/src/tests.rs
+++ b/tests/src/tests.rs
@@ -7,7 +7,7 @@ mod logger;
mod run;
mod world;
-use std::path::Path;
+use std::path::{Path, PathBuf};
use std::sync::LazyLock;
use std::time::Duration;
@@ -16,7 +16,9 @@ use parking_lot::Mutex;
use rayon::iter::{ParallelBridge, ParallelIterator};
use crate::args::{CliArguments, Command};
+use crate::collect::Test;
use crate::logger::Logger;
+use crate::run::TestResult;
/// The parsed command line arguments.
static ARGS: LazyLock<CliArguments> = LazyLock::new(CliArguments::parse);
@@ -27,6 +29,9 @@ const SUITE_PATH: &str = "tests/suite";
/// The directory where the full test results are stored.
const STORE_PATH: &str = "tests/store";
+/// The directory where syntax trees are stored.
+const SYNTAX_PATH: &str = "tests/store/syntax";
+
/// The directory where the reference images are stored.
const REF_PATH: &str = "tests/ref";
@@ -89,6 +94,16 @@ fn test() {
return;
}
+ let parser_dirs = ARGS.parser_compare.clone().map(create_syntax_store);
+
+ let runner = |test: &Test| {
+ if let Some((live_path, ref_path)) = &parser_dirs {
+ run_parser_test(test, live_path, ref_path)
+ } else {
+ run::run(test)
+ }
+ };
+
// Run the tests.
let logger = Mutex::new(Logger::new(selected, skipped));
std::thread::scope(|scope| {
@@ -112,7 +127,7 @@ fn test() {
// to `typst::utils::Deferred` yielding.
tests.iter().par_bridge().for_each(|test| {
logger.lock().start(test);
- let result = std::panic::catch_unwind(|| run::run(test));
+ let result = std::panic::catch_unwind(|| runner(test));
logger.lock().end(test, result);
});
@@ -142,3 +157,46 @@ fn undangle() {
}
}
}
+
+fn create_syntax_store(ref_path: Option<PathBuf>) -> (&'static Path, Option<PathBuf>) {
+ if ref_path.as_ref().is_some_and(|p| !p.exists()) {
+ eprintln!("syntax reference path doesn't exist");
+ std::process::exit(1);
+ }
+
+ let live_path = Path::new(SYNTAX_PATH);
+ std::fs::remove_dir_all(live_path).ok();
+ std::fs::create_dir_all(live_path).unwrap();
+ (live_path, ref_path)
+}
+
+fn run_parser_test(
+ test: &Test,
+ live_path: &Path,
+ ref_path: &Option<PathBuf>,
+) -> TestResult {
+ let mut result = TestResult {
+ errors: String::new(),
+ infos: String::new(),
+ mismatched_image: false,
+ };
+
+ let syntax_file = live_path.join(format!("{}.syntax", test.name));
+ let tree = format!("{:#?}\n", test.source.root());
+ std::fs::write(syntax_file, &tree).unwrap();
+
+ let Some(ref_path) = ref_path else { return result };
+ let ref_file = ref_path.join(format!("{}.syntax", test.name));
+ match std::fs::read_to_string(&ref_file) {
+ Ok(ref_tree) => {
+ if tree != ref_tree {
+ result.errors = "differs".to_string();
+ }
+ }
+ Err(_) => {
+ result.errors = format!("missing reference: {}", ref_file.display());
+ }
+ }
+
+ result
+}