use std::fmt::Display;
use rstest::*;
use instrumentrs::{InstrumentInterface, LoopbackInterface};
fn crt_lbk<T: AsRef<[u8]> + Display + PartialEq>(
input: Vec<T>,
output: Vec<T>,
) -> LoopbackInterface<T> {
LoopbackInterface::new(input, output, "\n")
}
#[fixture]
fn emp_lbk() -> LoopbackInterface<String> {
crt_lbk(vec![], vec![])
}
#[rstest]
fn check_acknowledgment() {
let mut lbk = crt_lbk(vec!["cmd1"], vec!["ACK"]);
lbk.sendcmd("cmd1").unwrap();
lbk.check_acknowledgment("ACK").unwrap();
}
#[rstest]
fn check_acknowledgment_fail() {
let mut lbk = crt_lbk(vec![], vec!["NACK"]);
assert!(lbk.check_acknowledgment("ACK").is_err());
}
#[rstest]
fn finalize_test(mut emp_lbk: LoopbackInterface<String>) {
emp_lbk.finalize();
}
#[rstest]
#[case(vec!["cmd"], vec![])]
#[case(vec![], vec!["resp"])]
#[case(vec!["cmd"], vec!["resp"])]
#[should_panic]
fn finalize_test_panic(#[case] from_host: Vec<&str>, #[case] from_inst: Vec<&str>) {
let _ = crt_lbk(from_host, from_inst);
}
#[rstest]
fn sendcmd() {
let mut lbk = crt_lbk(vec!["cmd1", "cmd2"], vec![]);
lbk.sendcmd("cmd1").unwrap();
lbk.sendcmd("cmd2").unwrap();
}
#[rstest]
#[should_panic]
fn sendcmd_mismatch() {
let mut lbk = crt_lbk(vec!["cmd1"], vec![]);
assert!(lbk.sendcmd("cmd3").is_err());
}
#[rstest]
fn query() {
let mut lbk = crt_lbk(vec!["cmd1", "cmd2"], vec!["resp1", "resp2"]);
let resp1 = lbk.query("cmd1").unwrap();
assert_eq!(resp1, "resp1");
let resp2 = lbk.query("cmd2").unwrap();
assert_eq!(resp2, "resp2");
}