#![cfg(feature = "std")]
use conduyt::transports::MockTransport;
use conduyt::wire::{wire_encode, make_packet};
use conduyt::constants::*;
use conduyt::device::Device;
fn make_hello_resp_payload() -> Vec<u8> {
let mut buf = Vec::new();
let mut name = [0u8; 16];
name[..4].copy_from_slice(b"Mock");
buf.extend_from_slice(&name);
buf.extend_from_slice(&[1, 0, 0]);
buf.extend_from_slice(&[0xDE, 0xAD, 0xBE, 0xEF, 0x01, 0x02, 0x03, 0x04]);
buf.push(0x00);
buf.push(4);
for _ in 0..4 {
buf.push(0x0F);
}
buf.extend_from_slice(&[1, 0, 1]);
buf.extend_from_slice(&[0x00, 0x01]);
buf.push(0);
buf.push(0);
buf
}
fn make_response(evt_type: u8, seq: u8, payload: &[u8]) -> Vec<u8> {
wire_encode(&make_packet(evt_type, seq, payload))
}
#[test]
fn test_connect() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
let mut device = Device::new(mock);
let resp = device.connect().expect("connect should succeed");
assert!(!resp.is_empty(), "hello response payload should not be empty");
assert_eq!(&resp[0..4], b"Mock");
}
#[test]
fn test_ping() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
mock.inject(make_response(EVT_PONG, 1, &[]));
let mut device = Device::new(mock);
device.connect().expect("connect should succeed");
device.ping().expect("ping should succeed");
}
#[test]
fn test_pin_mode() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
mock.inject(make_response(EVT_ACK, 1, &[]));
let mut device = Device::new(mock);
device.connect().expect("connect should succeed");
device.pin_mode(13, 0x01).expect("pin_mode should succeed");
}
#[test]
fn test_pin_write() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
mock.inject(make_response(EVT_ACK, 1, &[]));
let mut device = Device::new(mock);
device.connect().expect("connect should succeed");
device.pin_write(13, 1).expect("pin_write should succeed");
}
#[test]
fn test_pin_read() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
let read_payload = vec![13, 0x00, 0x02];
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
mock.inject(make_response(EVT_PIN_READ_RESP, 1, &read_payload));
let mut device = Device::new(mock);
device.connect().expect("connect should succeed");
let val = device.pin_read(13).expect("pin_read should succeed");
assert_eq!(val, 512, "expected pin read value 512, got {}", val);
}
#[test]
fn test_close() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
let mut device = Device::new(mock);
device.connect().expect("connect should succeed");
device.close().expect("close should succeed");
}
#[test]
fn test_not_connected() {
let mock = MockTransport::new();
let mut device = Device::new(mock);
let result = device.ping();
assert!(result.is_err(), "ping without connect should fail");
let err_msg = format!("{}", result.unwrap_err());
assert!(
err_msg.contains("not connected"),
"error should mention 'not connected', got: {}",
err_msg
);
}
#[test]
fn test_nak_error() {
let mut mock = MockTransport::new();
let hello_payload = make_hello_resp_payload();
mock.inject(make_response(EVT_HELLO_RESP, 0, &hello_payload));
mock.inject(make_response(EVT_NAK, 1, &[ERR_UNKNOWN_TYPE]));
let mut device = Device::new(mock);
device.connect().expect("connect should succeed");
let result = device.ping();
assert!(result.is_err(), "ping should fail with NAK");
let err_msg = format!("{}", result.unwrap_err());
assert!(
err_msg.contains("NAK"),
"error should mention NAK, got: {}",
err_msg
);
}