use embedded_hal_mock::i2c::Transaction as I2cTrans; use max44009::{ ConfigurationMode as CM, CurrentDivisionRatio as CDR, Error, IntegrationTime as IT, MeasurementMode as MM, }; mod common; use crate::common::{destroy, new, Register, DEV_BASE_ADDR}; fn assert_operation_not_available_error(result: Result>) { match result { Err(Error::OperationNotAvailable) => (), _ => panic!("Did not return Error::OperationNotAvailable."), } } #[test] fn can_enable_interrupt() { let mut dev = new(&[I2cTrans::write( DEV_BASE_ADDR, vec![Register::INT_ENABLE, 1], )]); dev.enable_interrupt().unwrap(); destroy(dev); } #[test] fn can_disable_interrupt() { let mut dev = new(&[I2cTrans::write( DEV_BASE_ADDR, vec![Register::INT_ENABLE, 0], )]); dev.disable_interrupt().unwrap(); destroy(dev); } macro_rules! set_mode_test { ($test_name:ident, $method:ident, $enum:ident::$variant:ident, $expected:expr) => { #[test] fn $test_name() { let mut dev = new(&[I2cTrans::write( DEV_BASE_ADDR, vec![Register::CONFIGURATION, $expected], )]); dev.$method($enum::$variant).unwrap(); destroy(dev); } }; } set_mode_test!( can_set_measurement_mode_once_every_800ms, set_measurement_mode, MM::OnceEvery800ms, 0 ); set_mode_test!( can_set_measurement_mode_continuous, set_measurement_mode, MM::Continuous, 0b1000_0000 ); set_mode_test!( can_set_automatic_mode, set_configuration_mode, CM::Automatic, 0b0000_0000 ); set_mode_test!( can_set_manual_mode, set_configuration_mode, CM::Manual, 0b0100_0000 ); #[test] fn cannot_set_current_division_ratio_in_automatic_mode() { let mut dev = new(&[]); assert_operation_not_available_error(dev.set_current_division_ratio(CDR::One)); destroy(dev); } #[test] fn cannot_set_integration_time_in_automatic_mode() { let mut dev = new(&[]); assert_operation_not_available_error(dev.set_integration_time(IT::_100ms)); destroy(dev); } macro_rules! set_param_test { ($test_name:ident, $method:ident, $enum:ident::$variant:ident, $expected:expr) => { #[test] fn $test_name() { let mut dev = new(&[ I2cTrans::write(DEV_BASE_ADDR, vec![Register::CONFIGURATION, 0b0100_0000]), I2cTrans::write( DEV_BASE_ADDR, vec![Register::CONFIGURATION, 0b0100_0000 | $expected], ), ]); dev.set_configuration_mode(CM::Manual).unwrap(); dev.$method($enum::$variant).unwrap(); destroy(dev); } }; } set_param_test!(can_set_cdr_one, set_current_division_ratio, CDR::One, 0); set_param_test!( can_set_cdr_one_eighth, set_current_division_ratio, CDR::OneEighth, 8 ); set_param_test!(can_set_it_800ms, set_integration_time, IT::_800ms, 0); set_param_test!(can_set_it_400ms, set_integration_time, IT::_400ms, 1); set_param_test!(can_set_it_200ms, set_integration_time, IT::_200ms, 2); set_param_test!(can_set_it_100ms, set_integration_time, IT::_100ms, 3); set_param_test!(can_set_it_50ms, set_integration_time, IT::_50ms, 4); set_param_test!(can_set_it_25ms, set_integration_time, IT::_25ms, 5); set_param_test!(can_set_it_12_5ms, set_integration_time, IT::_12_5ms, 6); set_param_test!(can_set_it_6_25ms, set_integration_time, IT::_6_25ms, 7);