use crate::error::AsynResult;
use crate::port::{PortDriver, PortDriverBase, PortFlags};
use crate::user::AsynUser;
pub struct NullOctetPort {
base: PortDriverBase,
}
impl NullOctetPort {
pub fn new(port_name: &str) -> Self {
let mut base = PortDriverBase::new(
port_name,
1,
PortFlags {
multi_device: false,
can_block: true,
destructible: true,
},
);
base.init_connected(false);
base.auto_connect = false;
Self { base }
}
}
impl PortDriver for NullOctetPort {
fn base(&self) -> &PortDriverBase {
&self.base
}
fn base_mut(&mut self) -> &mut PortDriverBase {
&mut self.base
}
fn capabilities(&self) -> Vec<crate::interfaces::Capability> {
crate::interfaces::octet_transport_capabilities()
}
fn connect(&mut self, _user: &AsynUser) -> AsynResult<()> {
Ok(())
}
fn read_octet(&mut self, _user: &AsynUser, _buf: &mut [u8]) -> AsynResult<usize> {
Ok(0)
}
fn write_octet(&mut self, _user: &mut AsynUser, data: &[u8]) -> AsynResult<usize> {
Ok(data.len())
}
}
#[cfg(test)]
mod tests {
use super::NullOctetPort;
use crate::interfaces::Capability;
use crate::port::PortDriver;
use crate::user::AsynUser;
#[test]
fn starts_disconnected_and_no_auto_connect() {
let drv = NullOctetPort::new("ORACLEASYN");
assert_eq!(drv.base().port_name, "ORACLEASYN");
assert!(
!drv.base().is_connected(),
"null port must start disconnected"
);
assert!(
!drv.base().is_auto_connect(),
"null port must be noAutoConnect"
);
}
#[test]
fn connect_leaves_port_disconnected() {
let mut drv = NullOctetPort::new("ORACLEASYN");
let user = AsynUser::new(0);
drv.connect(&user).expect("null connect is a no-op Ok");
assert!(
!drv.base().is_connected(),
"null port stays disconnected after a connect request"
);
}
#[test]
fn capabilities_are_confirmed_octet_transport() {
let drv = NullOctetPort::new("ORACLEASYN");
let caps = drv.capabilities();
assert!(caps.contains(&Capability::OctetRead));
assert!(caps.contains(&Capability::OctetWrite));
assert!(caps.contains(&Capability::Option));
assert!(!caps.contains(&Capability::Gpib));
assert!(!caps.contains(&Capability::Int32Read));
assert!(!caps.contains(&Capability::UInt32DigitalRead));
assert!(!caps.contains(&Capability::Float64Read));
}
}