1 | use std::io; |
2 | use std::io::prelude::Write; |
3 | |
4 | use crate::console::{ConsoleTestDiscoveryState, ConsoleTestState}; |
5 | use crate::test_result::TestResult; |
6 | use crate::time; |
7 | use crate::types::{TestDesc, TestName}; |
8 | |
9 | mod json; |
10 | mod junit; |
11 | mod pretty; |
12 | mod terse; |
13 | |
14 | pub(crate) use self::json::JsonFormatter; |
15 | pub(crate) use self::junit::JunitFormatter; |
16 | pub(crate) use self::pretty::PrettyFormatter; |
17 | pub(crate) use self::terse::TerseFormatter; |
18 | |
19 | pub(crate) trait OutputFormatter { |
20 | fn write_discovery_start(&mut self) -> io::Result<()>; |
21 | fn write_test_discovered(&mut self, desc: &TestDesc, test_type: &str) -> io::Result<()>; |
22 | fn write_discovery_finish(&mut self, state: &ConsoleTestDiscoveryState) -> io::Result<()>; |
23 | |
24 | fn write_run_start(&mut self, test_count: usize, shuffle_seed: Option<u64>) -> io::Result<()>; |
25 | fn write_test_start(&mut self, desc: &TestDesc) -> io::Result<()>; |
26 | fn write_timeout(&mut self, desc: &TestDesc) -> io::Result<()>; |
27 | fn write_result( |
28 | &mut self, |
29 | desc: &TestDesc, |
30 | result: &TestResult, |
31 | exec_time: Option<&time::TestExecTime>, |
32 | stdout: &[u8], |
33 | state: &ConsoleTestState, |
34 | ) -> io::Result<()>; |
35 | fn write_run_finish(&mut self, state: &ConsoleTestState) -> io::Result<bool>; |
36 | } |
37 | |
38 | pub(crate) fn write_stderr_delimiter(test_output: &mut Vec<u8>, test_name: &TestName) { |
39 | match test_output.last() { |
40 | Some(b' \n' ) => (), |
41 | Some(_) => test_output.push(b' \n' ), |
42 | None => (), |
43 | } |
44 | writeln!(test_output, "---- {test_name} stderr ----" ).unwrap(); |
45 | } |
46 | |