use std::sync::Arc;
use chrono::{DateTime, Utc};
use crossbeam_channel::{Receiver, Sender, unbounded};
use rite_model::StepId;
use crate::clock::{Clock, SystemClock};
use crate::protocol::{ExecEvent, UiCommand};
use crate::reporter::Reporter;
use crate::transcript_sink::InMemorySink;
use rite_model::StepFact;
pub struct ReporterHarness {
sink: InMemorySink,
event_tx: Sender<ExecEvent>,
_event_rx: Receiver<ExecEvent>,
_cmd_tx: Sender<UiCommand>,
cmd_rx: Receiver<UiCommand>,
}
impl ReporterHarness {
#[must_use]
pub fn new() -> Self {
let (event_tx, event_rx) = unbounded();
let (cmd_tx, cmd_rx) = unbounded();
Self {
sink: InMemorySink::new(),
event_tx,
_event_rx: event_rx,
_cmd_tx: cmd_tx,
cmd_rx,
}
}
pub fn reporter(&mut self, step: StepId) -> Reporter<'_> {
let mut reporter = Reporter::new(
&self.event_tx,
&self.cmd_rx,
&mut self.sink,
Arc::new(SystemClock),
);
reporter.set_current_step(Some(step));
reporter.seed_entropy(b"rite-test-harness-seed");
reporter
}
#[must_use]
pub fn facts(&self) -> &[StepFact] {
self.sink.facts()
}
}
impl Default for ReporterHarness {
fn default() -> Self {
Self::new()
}
}
#[must_use]
pub fn fixed_test_time() -> DateTime<Utc> {
DateTime::from_timestamp_nanos(1_700_000_000_000_000_000)
}
#[must_use]
pub fn fact_event(fact: StepFact) -> ExecEvent {
ExecEvent::Fact {
at: fixed_test_time(),
fact,
}
}
pub struct FixedClock(pub DateTime<Utc>);
impl Clock for FixedClock {
fn now(&self) -> DateTime<Utc> {
self.0
}
}