libtest2_harness/notify/
pretty.rs

1use super::Event;
2use super::MessageKind;
3use super::FAILED;
4use super::IGNORED;
5use super::OK;
6
7#[derive(Debug)]
8pub(crate) struct PrettyRunNotifier<W> {
9    writer: W,
10    is_multithreaded: bool,
11    summary: super::Summary,
12    name_width: usize,
13}
14
15impl<W: std::io::Write> PrettyRunNotifier<W> {
16    pub(crate) fn new(writer: W) -> Self {
17        Self {
18            writer,
19            is_multithreaded: false,
20            summary: Default::default(),
21            name_width: 0,
22        }
23    }
24}
25
26impl<W: std::io::Write> super::Notifier for PrettyRunNotifier<W> {
27    fn threaded(&mut self, yes: bool) {
28        self.is_multithreaded = yes;
29    }
30
31    fn notify(&mut self, event: Event) -> std::io::Result<()> {
32        self.summary.notify(event.clone())?;
33        match event {
34            Event::DiscoverStart(_) => {}
35            Event::DiscoverCase(inner) => {
36                if inner.selected {
37                    self.name_width = inner.name.len().max(self.name_width);
38                }
39            }
40            Event::DiscoverComplete(_) => {}
41            Event::RunStart(_) => {
42                self.summary.write_start(&mut self.writer)?;
43            }
44            Event::CaseStart(inner) => {
45                if !self.is_multithreaded {
46                    write!(
47                        self.writer,
48                        "test {: <1$} ... ",
49                        inner.name, self.name_width
50                    )?;
51                    self.writer.flush()?;
52                }
53            }
54            Event::CaseMessage(_) => {}
55            Event::CaseComplete(inner) => {
56                let status = self.summary.get_kind(&inner.name);
57                let (s, style) = match status {
58                    Some(MessageKind::Ignored) => ("ignored", IGNORED),
59                    Some(MessageKind::Error) => ("FAILED", FAILED),
60                    None => ("ok", OK),
61                };
62
63                if self.is_multithreaded {
64                    write!(
65                        self.writer,
66                        "test {: <1$} ... ",
67                        inner.name, self.name_width
68                    )?;
69                }
70                writeln!(self.writer, "{style}{s}{style:#}")?;
71            }
72            Event::RunComplete(_) => {
73                self.summary.write_complete(&mut self.writer)?;
74            }
75        }
76        Ok(())
77    }
78}