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}