libtest2-harness 0.0.3

An experimental replacement for the core of libtest
Documentation
use super::Event;
use super::MessageKind;
use super::FAILED;
use super::IGNORED;
use super::OK;

#[derive(Debug)]
pub(crate) struct TerseListNotifier<W> {
    writer: W,
    tests: usize,
}

impl<W: std::io::Write> TerseListNotifier<W> {
    pub(crate) fn new(writer: W) -> Self {
        Self { writer, tests: 0 }
    }
}

impl<W: std::io::Write> super::Notifier for TerseListNotifier<W> {
    fn notify(&mut self, event: Event) -> std::io::Result<()> {
        match event {
            Event::DiscoverStart(_) => {}
            Event::DiscoverCase(inner) => {
                if inner.selected {
                    let name = &inner.name;
                    let mode = inner.mode.as_str();
                    writeln!(self.writer, "{name}: {mode}")?;
                    self.tests += 1;
                }
            }
            Event::DiscoverComplete(_) => {
                writeln!(self.writer)?;
                writeln!(self.writer, "{} tests", self.tests)?;
                writeln!(self.writer)?;
            }
            Event::RunStart(_) => {}
            Event::CaseStart(_) => {}
            Event::CaseMessage(_) => {}
            Event::CaseComplete(_) => {}
            Event::RunComplete(_) => {}
        }
        Ok(())
    }
}

#[derive(Debug)]
pub(crate) struct TerseRunNotifier<W> {
    writer: W,
    summary: super::Summary,
}

impl<W: std::io::Write> TerseRunNotifier<W> {
    pub(crate) fn new(writer: W) -> Self {
        Self {
            writer,
            summary: Default::default(),
        }
    }
}

impl<W: std::io::Write> super::Notifier for TerseRunNotifier<W> {
    fn notify(&mut self, event: Event) -> std::io::Result<()> {
        self.summary.notify(event.clone())?;
        match event {
            Event::DiscoverStart(_) => {}
            Event::DiscoverCase(_) => {}
            Event::DiscoverComplete(_) => {}
            Event::RunStart(_) => {
                self.summary.write_start(&mut self.writer)?;
            }
            Event::CaseStart(_) => {}
            Event::CaseMessage(_) => {}
            Event::CaseComplete(inner) => {
                let status = self.summary.get_kind(&inner.name);
                let (c, style) = match status {
                    Some(MessageKind::Ignored) => ('i', IGNORED),
                    Some(MessageKind::Error) => ('F', FAILED),
                    None => ('.', OK),
                };
                write!(self.writer, "{style}{c}{style:#}")?;
                self.writer.flush()?;
            }
            Event::RunComplete(_) => {
                self.summary.write_complete(&mut self.writer)?;
            }
        }
        Ok(())
    }
}