eeprom24x 0.7.2

Platform-agnostic Rust driver for the 24x series serial EEPROMs.
Documentation
use eeprom24x::{Eeprom24x, Error, Storage};
use embedded_hal_mock::eh1::{
    delay::NoopDelay,
    i2c::{Mock as I2cMock, Transaction as I2cTrans},
};
use embedded_storage::{ReadStorage, Storage as _};
mod common;
use crate::common::{
    destroy, new_24csx01, new_24csx02, new_24csx04, new_24csx08, new_24csx16, new_24csx32,
    new_24csx64, new_24x00, new_24x01, new_24x02, new_24x04, new_24x08, new_24x128, new_24x16,
    new_24x256, new_24x32, new_24x512, new_24x64, new_24xm01, new_24xm02, new_m24x01, new_m24x02,
    DEV_ADDR,
};

fn storage_new<PS, AS, SN>(
    eeprom: Eeprom24x<I2cMock, PS, AS, SN>,
) -> Storage<I2cMock, PS, AS, SN, NoopDelay> {
    Storage::new(eeprom, NoopDelay)
}

macro_rules! can_query_capacity {
    ($name:ident, $create:ident, $capacity:expr) => {
        #[test]
        fn $name() {
            let storage = storage_new($create(&[]));
            let capacity = storage.capacity();
            assert_eq!(capacity, $capacity);
            destroy(storage.eeprom);
        }
    };
}
for_all_ics_with_capacity!(can_query_capacity);

macro_rules! can_read_byte_1byte_addr {
    ($name:ident, $create:ident) => {
        #[test]
        fn $name() {
            let trans = [I2cTrans::write_read(DEV_ADDR, vec![0xF], vec![0xAB])];
            let mut storage = storage_new($create(&trans));
            let mut data = [0u8; 1];
            storage.read(0xF, &mut data).unwrap();
            assert_eq!(0xAB, data[0]);
            destroy(storage.eeprom);
        }
    };
}
for_all_ics_with_1b_addr!(can_read_byte_1byte_addr);

macro_rules! can_read_byte_2byte_addr {
    ($name:ident, $create:ident) => {
        #[test]
        fn $name() {
            let trans = [I2cTrans::write_read(DEV_ADDR, vec![0xF, 0x34], vec![0xAB])];
            let mut storage = storage_new($create(&trans));
            let mut data = [0u8; 1];
            storage.read(0xF34, &mut data).unwrap();
            assert_eq!(0xAB, data[0]);
            destroy(storage.eeprom);
        }
    };
}
for_all_ics_with_2b_addr!(can_read_byte_2byte_addr);

macro_rules! can_write_array_1byte_addr {
    ($name:ident, $create:ident, $_page_size:expr) => {
        #[test]
        fn $name() {
            let trans = [I2cTrans::write(DEV_ADDR, vec![0x34, 0xAB, 0xCD, 0xEF])];
            let mut storage = storage_new($create(&trans));
            storage.write(0x34, &[0xAB, 0xCD, 0xEF]).unwrap();
            destroy(storage.eeprom);
        }
    };
}
for_all_ics_with_1b_addr_and_page_size!(can_write_array_1byte_addr);

macro_rules! can_write_array_2byte_addr {
    ($name:ident, $create:ident, $_page_size:expr) => {
        #[test]
        fn $name() {
            let trans = [I2cTrans::write(DEV_ADDR, vec![0xF, 0x34, 0xAB, 0xCD, 0xEF])];
            let mut storage = storage_new($create(&trans));
            storage.write(0xF34, &[0xAB, 0xCD, 0xEF]).unwrap();
            destroy(storage.eeprom);
        }
    };
}
for_all_ics_with_2b_addr_and_page_size!(can_write_array_2byte_addr);

macro_rules! cannot_write_too_much_data {
    ($name:ident, $create:ident, $capacity:expr) => {
        #[test]
        fn $name() {
            let mut storage = storage_new($create(&[]));
            match storage.write(0x34, &[0xAB; 1 + $capacity]) {
                Err(Error::TooMuchData) => (),
                _ => panic!("Error::TooMuchData not returned."),
            }
            destroy(storage.eeprom);
        }
    };
}
for_all_writestorage_ics_with_capacity!(cannot_write_too_much_data);