1//! Various data structures used for carrying information about test success or failure
2
3use crate::{status_emitter::TestStatus, AbortCheck, Error};
4use bstr::ByteSlice;
5use color_eyre::eyre::Result;
6
7/// The possible non-failure results a single test can have.
8#[derive(Debug)]
9pub 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.
17pub type TestResult = Result<TestOk, Errored>;
18
19/// Information about a test failure.
20pub 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
31impl 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
41impl 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.
58pub 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