tap.rs (1350B)
1 use std::sync::atomic::{AtomicUsize, Ordering}; 2 3 static LEVEL: AtomicUsize = AtomicUsize::new(0); 4 5 fn print_leveled<S: ToString>(s: S) { 6 println!( 7 "{}{}", 8 " ".repeat(LEVEL.load(Ordering::Relaxed)), 9 s.to_string() 10 ); 11 } 12 13 pub fn header() { 14 println!("TAP version 14"); 15 } 16 17 pub fn enter_subtest<S: ToString>(desc: Option<S>) { 18 if let Some(desc) = desc { 19 print_leveled(format!("# Subtest: {}", desc.to_string())) 20 } else { 21 print_leveled("# Subtest") 22 } 23 24 LEVEL.fetch_add(1, Ordering::Relaxed); 25 } 26 27 pub fn exit_subtest() { 28 LEVEL.fetch_sub(1, Ordering::Relaxed); 29 } 30 31 pub fn plan(tests: usize) { 32 print_leveled(format!("1..{tests}")) 33 } 34 35 pub fn bail<S: ToString>(desc: Option<S>) { 36 if let Some(desc) = desc { 37 print_leveled(format!("Bail out! {}", desc.to_string())) 38 } else { 39 print_leveled("Bail out!"); 40 } 41 } 42 43 pub fn ok<S: ToString>(test: usize, desc: Option<S>) { 44 if let Some(desc) = desc { 45 print_leveled(format!("ok {test} - {}", desc.to_string())); 46 } else { 47 print_leveled(format!("ok {test}")); 48 } 49 } 50 51 pub fn not_ok<S: ToString>(test: usize, desc: Option<S>) { 52 if let Some(desc) = desc { 53 print_leveled(format!("not ok {test} - {}", desc.to_string())); 54 } else { 55 print_leveled(format!("not ok {test}")); 56 } 57 }