use std::process::exit; pub trait Testable { // Name of the test fn name(&self) -> String; // Tests pass by default fn run(&self) -> bool { true } // A test can generate subtests fn subtests(&self) -> Vec> { vec![] } } fn run_test(t: &dyn Testable) -> bool { let success = t.subtests().into_iter().all(|sub_t| run_test(&*sub_t)) && t.run(); println!("{}...{}", t.name(), if success { "SUCCESS" } else { "FAIL" }); success } pub fn runner(tests: &[&dyn Testable]) { let mut failed = false; for t in tests { if !run_test(*t) { failed = true; } } if failed { exit(1); } }