use embedded_hal_mock::i2c::{Mock as I2cMock, Transaction as I2cTrans}; use si4703::{ic, Si4703}; pub const DEV_ADDR: u8 = 0x10; pub struct BitFlags; #[allow(unused)] impl BitFlags { pub const DSMUTE: u16 = 1 << 15; pub const DMUTE: u16 = 1 << 14; pub const MONO: u16 = 1 << 13; pub const SKMODE: u16 = 1 << 10; pub const SEEKUP: u16 = 1 << 9; pub const SEEK: u16 = 1 << 8; pub const DISABLE: u16 = 1 << 6; pub const ENABLE: u16 = 1; pub const DE: u16 = 1 << 11; pub const RDSIEN: u16 = 1 << 15; pub const STCIEN: u16 = 1 << 14; pub const RDSR: u16 = 1 << 15; pub const STC: u16 = 1 << 14; pub const SF_BL: u16 = 1 << 13; pub const AFCRL: u16 = 1 << 12; pub const RDSS: u16 = 1 << 11; pub const ST: u16 = 1 << 8; pub const RDS: u16 = 1 << 12; pub const AGCD: u16 = 1 << 10; pub const RDSM: u16 = 1 << 11; pub const VOLEXT: u16 = 1 << 8; pub const XOSCEN: u16 = 1 << 15; pub const AHIZEN: u16 = 1 << 14; pub const TUNE: u16 = 1 << 15; pub const BLERA1: u16 = 1 << 10; pub const BLERA0: u16 = 1 << 9; pub const BLERB1: u16 = 1 << 15; pub const BLERB0: u16 = 1 << 14; pub const BLERC1: u16 = 1 << 13; pub const BLERC0: u16 = 1 << 12; pub const BLERD1: u16 = 1 << 11; pub const BLERD0: u16 = 1 << 10; } #[allow(unused)] pub fn new_si4703(transactions: &[I2cTrans]) -> Si4703 { Si4703::new(I2cMock::new(transactions)) } pub fn destroy(dev: Si4703) { dev.destroy().done(); } #[macro_export] macro_rules! assert_error { ($result:expr, $error:ident::$variant:ident) => { match $result { Err($error::$variant) => (), _ => panic!("Error not returned."), } }; } #[macro_export] macro_rules! set_invalid_test { ($name:ident, $create_method:ident, $error:ident::$variant:ident, $method:ident $(, $value:expr)*) => { #[test] fn $name() { let mut dev = $create_method(&[]); assert_error!(dev.$method($($value),*), $error::$variant); destroy(dev); } }; } #[macro_export] macro_rules! write_test { ($name:ident, $value:expr, $read_reg_count:expr, $write_reg_count:expr, $method:ident $(, $arg:expr)*) => { #[test] fn $name() { let mut write = [0; $write_reg_count*2]; write[($write_reg_count-1)*2] = ($value >> 8) as u8; write[($write_reg_count-1)*2+1] = $value as u8; let transactions = [ I2cTrans::read(DEV_ADDR, [0;$read_reg_count*2].to_vec()), I2cTrans::write(DEV_ADDR, write.to_vec())]; let mut dev = new_si4703(&transactions); dev.$method($($arg),*).unwrap(); destroy(dev); } }; ($name:ident, $read_reg_count:expr, $first_write_reg_index:expr, $first_write_reg_value:expr, $second_write_reg_index:expr, $second_write_reg_value:expr, $method:ident $(, $arg:expr)*) => { #[test] fn $name() { let mut write = [0; ($second_write_reg_index+1)*2]; write[$first_write_reg_index*2] = ($first_write_reg_value >> 8) as u8; write[$first_write_reg_index*2+1] = $first_write_reg_value as u8; write[$second_write_reg_index*2] = ($second_write_reg_value >> 8) as u8; write[$second_write_reg_index*2+1] = $second_write_reg_value as u8; let transactions = [ I2cTrans::read(DEV_ADDR, [0;$read_reg_count*2].to_vec()), I2cTrans::write(DEV_ADDR, write.to_vec())]; let mut dev = new_si4703(&transactions); dev.$method($($arg),*).unwrap(); destroy(dev); } }; } #[macro_export] macro_rules! write_powercfg_test { ($name:ident, $value:expr, $method:ident $(, $arg:expr)*) => { write_test!($name, $value, 9, 1, $method $(, $arg)*); }; } #[macro_export] macro_rules! read_test { ($name:ident, $value:expr, $read_reg_count:expr, $expected:expr, $method:ident $(, $arg:expr)*) => { #[test] fn $name() { let mut read = [0; $read_reg_count*2]; read[0] = ($value >> 8) as u8; read[1] = $value as u8; let transactions = [ I2cTrans::read(DEV_ADDR, read.to_vec())]; let mut dev = new_si4703(&transactions); assert_eq!($expected, dev.$method($($arg),*).unwrap()); destroy(dev); } }; }