1 use std::process::exit; 2 3 pub trait Testable { 4 // Name of the test name(&self) -> String5 fn name(&self) -> String; 6 7 // Tests pass by default run(&self) -> bool8 fn run(&self) -> bool { 9 true 10 } 11 12 // A test can generate subtests subtests(&self) -> Vec<Box<dyn Testable>>13 fn subtests(&self) -> Vec<Box<dyn Testable>> { 14 vec![] 15 } 16 } 17 run_test(t: &dyn Testable) -> bool18fn run_test(t: &dyn Testable) -> bool { 19 let success = t.subtests().into_iter().all(|sub_t| run_test(&*sub_t)) && t.run(); 20 println!("{}...{}", t.name(), if success { "SUCCESS" } else { "FAIL" }); 21 success 22 } 23 runner(tests: &[&dyn Testable])24pub fn runner(tests: &[&dyn Testable]) { 25 let mut failed = false; 26 for t in tests { 27 if !run_test(*t) { 28 failed = true; 29 } 30 } 31 32 if failed { 33 exit(1); 34 } 35 } 36