use std::sync::mpsc;
use super::{Poller, build};
use crate::backend::Sink;
use crate::click::{ClickTiming, Holds};
use crate::device::{Device, Start};
use crate::error::{Error, Result};
pub struct MockPoller(Poller);
impl MockPoller {
pub fn tick(&mut self) {
self.0.tick();
}
}
impl Device {
pub fn mock_medius(mock: medius::MockBox, click_timing: ClickTiming) -> Result<Device> {
let (device, poller) = Self::mock_medius_manual(mock, click_timing)?;
poller.0.spawn()?;
Ok(device)
}
pub fn mock_medius_manual(
mock: medius::MockBox,
click_timing: ClickTiming,
) -> Result<(Device, MockPoller)> {
let crate_device = medius::Device::open_mock(mock)
.map_err(|error| Error::Io(std::io::Error::other(error)))?;
let (signals, incoming) = mpsc::channel();
let (backend, snapshot, poller) = build(crate_device, Sink(signals.clone()))?;
let device = Device::start(Start {
backend: Box::new(backend),
snapshot,
signals,
incoming,
click_timing,
holds: Holds::from_clock(),
port: "mock box".into(),
})?;
Ok((device, MockPoller(poller)))
}
}