use embedded_hal_mock::eh1::spi::{Mock, Transaction};
use ic_md::IcMd;
#[test]
fn test_default_icmd_and_counter_read() {
let expectations = [
Transaction::transaction_start(), Transaction::write(0x00),
Transaction::write(0x02),
Transaction::transaction_end(),
Transaction::transaction_start(), Transaction::write(0x80 | 0x08),
Transaction::read_vec(vec![0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x40]),
Transaction::transaction_end(),
Transaction::transaction_start(), Transaction::write(0x48 | 0x80),
Transaction::read(0x8C), Transaction::transaction_end(),
Transaction::transaction_start(), Transaction::write(0x49 | 0x80),
Transaction::read(0x00), Transaction::transaction_end(),
Transaction::transaction_start(), Transaction::write(0x4A | 0x80),
Transaction::read(0x00), Transaction::transaction_end(),
];
let mut spi_device = Mock::new(&expectations);
let mut icmd = IcMd::new(&mut spi_device);
icmd.init().unwrap();
let counter_value = icmd.read_counter().unwrap();
let cnt_0 = counter_value
.get_cnt0()
.expect("Counter 0 should always be set up");
assert_eq!(cnt_0, 42);
assert!(!icmd.get_device_status().is_ok());
let full_status = icmd
.get_full_device_status()
.expect("Device status should be available");
assert!(full_status.cnt0_aberr == ic_md::DecodificationStatus::DecodificationError);
assert!(full_status.cnt0_overflow == ic_md::OverflowStatus::Ok);
assert!(full_status.cnt1_overflow == ic_md::OverflowStatus::Ok);
assert!(full_status.cnt2_overflow == ic_md::OverflowStatus::Ok);
assert!(full_status.cnt1_aberr == ic_md::DecodificationStatus::Ok);
assert!(full_status.cnt2_aberr == ic_md::DecodificationStatus::Ok);
assert!(full_status.cnt0_zero == ic_md::ZeroStatus::NotZero);
assert!(full_status.cnt1_zero == ic_md::ZeroStatus::NotZero);
assert!(full_status.cnt2_zero == ic_md::ZeroStatus::NotZero);
assert!(full_status.power_status == ic_md::UndervoltageStatus::Ok);
assert!(full_status.ref_reg_status == ic_md::RegisterStatus::Ok);
assert!(full_status.upd_reg_status == ic_md::RegisterStatus::Ok);
assert!(full_status.ref_cnt_status == ic_md::OverflowStatus::Ok);
assert!(full_status.ext_err_status == ic_md::ErrorStatus::Ok);
assert!(full_status.ext_warn_status == ic_md::WarningStatus::Ok);
assert!(full_status.comm_status == ic_md::CommunicationStatus::Ok);
assert!(full_status.tp_status == ic_md::TouchProbeStatus::NotUpdated);
assert!(full_status.tpi_status == ic_md::PinStatus::Low);
assert!(full_status.ssi_enabled == ic_md::InterfaceStatus::Disabled);
spi_device.done();
}