1 | //! Various data structures used for carrying information about test success or failure |
2 | |
3 | use crate::{status_emitter::TestStatus, AbortCheck, Error}; |
4 | use bstr::ByteSlice; |
5 | use color_eyre::eyre::Result; |
6 | |
7 | /// The possible non-failure results a single test can have. |
8 | #[derive (Debug)] |
9 | pub enum TestOk { |
10 | /// The test passed |
11 | Ok, |
12 | /// The test was ignored due to a rule (`//@only-*` or `//@ignore-*`) |
13 | Ignored, |
14 | } |
15 | |
16 | /// The possible results a single test can have. |
17 | pub type TestResult = Result<TestOk, Errored>; |
18 | |
19 | /// Information about a test failure. |
20 | pub struct Errored { |
21 | /// Command that failed |
22 | pub(crate) command: String, |
23 | /// The errors that were encountered. |
24 | pub(crate) errors: Vec<Error>, |
25 | /// The full stderr of the test run. |
26 | pub(crate) stderr: Vec<u8>, |
27 | /// The full stdout of the test run. |
28 | pub(crate) stdout: Vec<u8>, |
29 | } |
30 | |
31 | impl std::fmt::Debug for Errored { |
32 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
33 | writeln!(f, "command: {}" , self.command)?; |
34 | writeln!(f, "errors: {:#?}" , self.errors)?; |
35 | writeln!(f, "stderr: {}" , self.stderr.to_str_lossy())?; |
36 | writeln!(f, "stdout: {}" , self.stdout.to_str_lossy())?; |
37 | Ok(()) |
38 | } |
39 | } |
40 | |
41 | impl Errored { |
42 | /// If no command was executed for this error, use a message instead. |
43 | pub fn new(errors: Vec<Error>, message: &str) -> Self { |
44 | Self { |
45 | errors, |
46 | stderr: vec![], |
47 | stdout: vec![], |
48 | command: message.into(), |
49 | } |
50 | } |
51 | |
52 | pub(crate) fn aborted() -> Errored { |
53 | Self::new(errors:vec![], message:"aborted" ) |
54 | } |
55 | } |
56 | |
57 | /// Result of an actual test or sub-test (revision, fixed, run, ...) including its status. |
58 | pub struct TestRun { |
59 | /// Actual test run output. |
60 | pub result: TestResult, |
61 | /// Usually created via `for_revsion` or `for_path` |
62 | pub status: Box<dyn TestStatus>, |
63 | /// Whether the run was aborted prematurely |
64 | pub abort_check: AbortCheck, |
65 | } |
66 | |