diff --git a/src/integration_test.rs b/src/integration_test.rs index 0807131..822bef8 100644 --- a/src/integration_test.rs +++ b/src/integration_test.rs @@ -4,7 +4,6 @@ mod tests { use crate::ast::types::Value; use crate::ast::nodes::UntypedKind; use crate::ast::environment::Environment; - use std::fs; #[test] fn test_parse_integer_constant() { @@ -83,31 +82,9 @@ mod tests { #[test] fn test_examples() { - let entries = fs::read_dir("examples").expect("Could not read examples directory"); - for entry in entries { - let entry = entry.expect("Invalid entry"); - let path = entry.path(); - if path.extension().is_some_and(|ext| ext == "myc") { - let content = fs::read_to_string(&path).expect("Could not read file"); - - // Find expected output tag: ;; Output: - let expected_output = content.lines() - .find(|line| line.starts_with(";; Output:")) - .map(|line| line.replace(";; Output:", "").trim().to_string()); - - if let Some(expected) = expected_output { - let env = Environment::new(); - let result = env.run_script(&content); - - match result { - Ok(val) => { - let val_str = format!("{}", val); - assert_eq!(val_str, expected, "Example {:?} failed: expected {}, got {}", path, expected, val_str); - } - Err(e) => panic!("Example {:?} failed with error: {}", path, e), - } - } - } + let results = crate::utils::tester::run_functional_tests(); + for res in results { + assert!(res.success, "Example {} failed: {}", res.name, res.message); } } diff --git a/src/utils/tester.rs b/src/utils/tester.rs index fd22687..9e9f2bd 100644 --- a/src/utils/tester.rs +++ b/src/utils/tester.rs @@ -103,14 +103,14 @@ pub fn run_benchmarks(update: bool) -> Vec { } }; - // Helper to measure sum of VM execution times over N fresh environments + // Helper to measure sum of VM execution times over N executions in one environment let measure_sum = |n: u32, node: &crate::ast::compiler::TypedNode| -> Result { + let env = Environment::new(); + // Link once per sample + let linked = env.link(node.clone()); let mut total = Duration::ZERO; for _ in 0..n { - let env = Environment::new(); - // Link is still required per environment as it populates registries - let linked = env.link(node.clone()); let start = Instant::now(); let _ = env.run(&linked)?; total += start.elapsed(); @@ -234,7 +234,7 @@ pub fn run_benchmarks(update: bool) -> Vec { let diff = (median_single.as_nanos() as f64 / baseline.as_nanos() as f64) - 1.0; - let threshold = if is_release { 0.10 } else { 0.25 }; + let threshold = if is_release { 0.15 } else { 0.30 }; let status = if median_single > baseline && diff > threshold { "FAILED" } else { @@ -296,19 +296,11 @@ mod tests { #[cfg(not(debug_assertions))] fn benchmark_regression_test() { use super::*; - let mut success = false; - let mut last_failures = String::new(); + let results = run_benchmarks(false); + let failures: Vec<_> = results.iter().filter(|r| r.status == "FAILED").collect(); - for _ in 0..5 { - let results = run_benchmarks(false); - let failures: Vec<_> = results.iter().filter(|r| r.status == "FAILED").collect(); - - if failures.is_empty() { - success = true; - break; - } - - last_failures = failures + if !failures.is_empty() { + let error_msg = failures .iter() .map(|r| { format!( @@ -320,21 +312,9 @@ mod tests { ) }) .collect::>() - .join( - " -", - ); + .join("\n"); - // Give the system a tiny bit of breath between retries - std::thread::sleep(std::time::Duration::from_millis(50)); - } - - if !success { - panic!( - "Performance regression detected after 5 attempts: -{}", - last_failures - ); + panic!("Performance regression detected:\n{}", error_msg); } } }