libtest2_harness/notify/
pretty.rs1use 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}