• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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) -> bool18 fn 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])24 pub 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