1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
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<Box<dyn Testable>> {
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);
}
}
|