pub mod builtin;
pub mod event;
pub mod scenario;
pub mod session;
pub use builtin::*;
pub use event::{EventTimeline, MockEvent};
pub use scenario::{Scenario, ScenarioBuilder, ScenarioStep};
pub use session::{MockSession, MockTransport};
#[must_use]
pub fn simple_mock(output: &str) -> MockTransport {
let transport = MockTransport::new();
transport.queue_output_str(output);
transport
}
#[must_use]
pub fn login_mock() -> MockTransport {
MockTransport::from_scenario(&builtin::login_scenario("user", "pass"))
}
#[must_use]
pub fn shell_mock(prompt: &str) -> MockTransport {
MockTransport::from_scenario(&builtin::shell_scenario(prompt))
}
pub struct MockBuilder {
events: Vec<MockEvent>,
}
impl MockBuilder {
#[must_use]
pub const fn new() -> Self {
Self { events: Vec::new() }
}
#[must_use]
pub fn output(mut self, data: &str) -> Self {
self.events.push(MockEvent::output_str(data));
self
}
#[must_use]
pub fn delay_ms(mut self, ms: u64) -> Self {
self.events.push(MockEvent::delay_ms(ms));
self
}
#[must_use]
pub fn eof(mut self) -> Self {
self.events.push(MockEvent::eof());
self
}
#[must_use]
pub fn exit(mut self, code: i32) -> Self {
self.events.push(MockEvent::exit(code));
self
}
#[must_use]
pub fn build(self) -> MockTransport {
MockTransport::from_timeline(EventTimeline::from_events(self.events))
}
}
impl Default for MockBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn simple_mock_creates_transport() {
let transport = simple_mock("test");
assert!(!transport.is_eof());
}
#[test]
fn mock_builder_works() {
let transport = MockBuilder::new()
.output("Hello\n")
.delay_ms(100)
.output("World\n")
.exit(0)
.build();
assert!(!transport.is_eof());
}
}