libtest_json/
event.rs

1#[derive(Clone, Debug)]
2#[cfg_attr(feature = "unstable-schema", derive(schemars::JsonSchema))]
3#[cfg_attr(feature = "serde", derive(serde::Serialize))]
4#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
5#[cfg_attr(feature = "serde", serde(tag = "event"))]
6pub enum Event {
7    DiscoverStart,
8    DiscoverCase {
9        name: String,
10        mode: RunMode,
11        run: bool,
12    },
13    DiscoverComplete {
14        #[allow(dead_code)]
15        elapsed_s: Elapsed,
16    },
17    SuiteStart,
18    CaseStart {
19        name: String,
20    },
21    CaseComplete {
22        name: String,
23        #[allow(dead_code)]
24        mode: RunMode,
25        status: Option<RunStatus>,
26        message: Option<String>,
27        #[allow(dead_code)]
28        elapsed_s: Option<Elapsed>,
29    },
30    SuiteComplete {
31        elapsed_s: Elapsed,
32    },
33}
34
35impl Event {
36    #[cfg(feature = "json")]
37    pub fn to_jsonline(&self) -> String {
38        serde_json::to_string(self).expect("always valid json")
39    }
40}
41
42#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]
43#[cfg_attr(feature = "unstable-schema", derive(schemars::JsonSchema))]
44#[cfg_attr(feature = "serde", derive(serde::Serialize))]
45#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
46pub enum RunMode {
47    #[default]
48    Test,
49    Bench,
50}
51
52impl RunMode {
53    pub fn as_str(&self) -> &str {
54        match self {
55            Self::Test => "test",
56            Self::Bench => "bench",
57        }
58    }
59}
60
61#[derive(Copy, Clone, Debug, PartialEq, Eq)]
62#[cfg_attr(feature = "unstable-schema", derive(schemars::JsonSchema))]
63#[cfg_attr(feature = "serde", derive(serde::Serialize))]
64#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
65pub enum RunStatus {
66    Ignored,
67    Failed,
68}
69
70#[derive(Copy, Clone, Default, Debug, PartialEq, Eq)]
71#[cfg_attr(feature = "unstable-schema", derive(schemars::JsonSchema))]
72#[cfg_attr(feature = "serde", derive(serde::Serialize))]
73#[cfg_attr(feature = "serde", serde(into = "String"))]
74pub struct Elapsed(pub std::time::Duration);
75
76impl std::fmt::Display for Elapsed {
77    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
78        write!(f, "{:.3}s", self.0.as_secs_f64())
79    }
80}
81
82impl From<Elapsed> for String {
83    fn from(elapsed: Elapsed) -> Self {
84        elapsed.0.as_secs_f64().to_string()
85    }
86}
87
88#[cfg(feature = "unstable-schema")]
89#[test]
90fn dump_event_schema() {
91    let schema = schemars::schema_for!(Event);
92    let dump = serde_json::to_string_pretty(&schema).unwrap();
93    snapbox::assert_data_eq!(dump, snapbox::file!("../event.schema.json").raw());
94}