use std::io; use std::io::prelude::Write; use crate::console::{ConsoleTestDiscoveryState, ConsoleTestState}; use crate::test_result::TestResult; use crate::time; use crate::types::{TestDesc, TestName}; mod json; mod junit; mod pretty; mod terse; pub(crate) use self::json::JsonFormatter; pub(crate) use self::junit::JunitFormatter; pub(crate) use self::pretty::PrettyFormatter; pub(crate) use self::terse::TerseFormatter; pub(crate) trait OutputFormatter { fn write_discovery_start(&mut self) -> io::Result<()>; fn write_test_discovered(&mut self, desc: &TestDesc, test_type: &str) -> io::Result<()>; fn write_discovery_finish(&mut self, state: &ConsoleTestDiscoveryState) -> io::Result<()>; fn write_run_start(&mut self, test_count: usize, shuffle_seed: Option) -> io::Result<()>; fn write_test_start(&mut self, desc: &TestDesc) -> io::Result<()>; fn write_timeout(&mut self, desc: &TestDesc) -> io::Result<()>; fn write_result( &mut self, desc: &TestDesc, result: &TestResult, exec_time: Option<&time::TestExecTime>, stdout: &[u8], state: &ConsoleTestState, ) -> io::Result<()>; fn write_run_finish(&mut self, state: &ConsoleTestState) -> io::Result; fn write_merged_doctests_times( &mut self, total_time: f64, compilation_time: f64, ) -> io::Result<()>; } pub(crate) fn write_stderr_delimiter(test_output: &mut Vec, test_name: &TestName) { match test_output.last() { Some(b'\n') => (), Some(_) => test_output.push(b'\n'), None => (), } writeln!(test_output, "---- {test_name} stderr ----").unwrap(); }