mod model;
pub use model::*;
#[cfg(test)]
mod tests {
use super::*;
use crate::errors::MbusError;
#[test]
fn test_extended_object_id() {
assert!(ExtendedObjectId::new(0x7F).is_none()); assert!(ExtendedObjectId::new(0x80).is_some()); assert!(ExtendedObjectId::new(0xFF).is_some()); assert_eq!(ExtendedObjectId::new(0x80).unwrap().value(), 0x80);
}
#[test]
fn test_read_device_id_code() {
assert_eq!(
ReadDeviceIdCode::try_from(0x01).unwrap(),
ReadDeviceIdCode::Basic
);
assert_eq!(
ReadDeviceIdCode::try_from(0x02).unwrap(),
ReadDeviceIdCode::Regular
);
assert_eq!(
ReadDeviceIdCode::try_from(0x03).unwrap(),
ReadDeviceIdCode::Extended
);
assert_eq!(
ReadDeviceIdCode::try_from(0x04).unwrap(),
ReadDeviceIdCode::Specific
);
assert_eq!(
ReadDeviceIdCode::try_from(0x05).unwrap_err(),
MbusError::InvalidDeviceIdCode
);
}
#[test]
fn test_conformity_level() {
assert_eq!(
ConformityLevel::try_from(0x01).unwrap(),
ConformityLevel::BasicStreamOnly
);
assert_eq!(
ConformityLevel::try_from(0x81).unwrap(),
ConformityLevel::BasicStreamAndIndividual
);
assert_eq!(
ConformityLevel::try_from(0x04).unwrap_err(),
MbusError::ParseError
);
}
#[test]
fn test_device_id_object_iterator_valid_parse() {
let mut objects_data = [0u8; crate::data_unit::common::MAX_PDU_DATA_LEN];
objects_data[0] = 0x00;
objects_data[1] = 0x03;
objects_data[2..5].copy_from_slice(b"Foo");
objects_data[5] = 0x01;
objects_data[6] = 0x03;
objects_data[7..10].copy_from_slice(b"Bar");
let response = DeviceIdentificationResponse {
read_device_id_code: ReadDeviceIdCode::Basic,
conformity_level: ConformityLevel::BasicStreamAndIndividual,
more_follows: false,
next_object_id: ObjectId::from(0x00),
objects_data,
number_of_objects: 2,
};
let mut iterator = response.objects();
let obj1 = iterator.next().expect("Should yield first object").unwrap();
assert_eq!(obj1.object_id, ObjectId::Basic(BasicObjectId::VendorName));
assert_eq!(obj1.value.as_slice(), b"Foo");
let obj2 = iterator
.next()
.expect("Should yield second object")
.unwrap();
assert_eq!(obj2.object_id, ObjectId::Basic(BasicObjectId::ProductCode));
assert_eq!(obj2.value.as_slice(), b"Bar");
assert!(iterator.next().is_none());
}
#[test]
fn test_device_id_object_iterator_invalid_length() {
let mut objects_data = [0u8; crate::data_unit::common::MAX_PDU_DATA_LEN];
objects_data[0] = 0x00;
objects_data[1] = 0xFF; objects_data[2] = b'F';
let response = DeviceIdentificationResponse {
read_device_id_code: ReadDeviceIdCode::Basic,
conformity_level: ConformityLevel::BasicStreamAndIndividual,
more_follows: false,
next_object_id: ObjectId::from(0x00),
objects_data,
number_of_objects: 1,
};
let mut iterator = response.objects();
let res = iterator
.next()
.expect("Should return error instead of None");
assert_eq!(res.unwrap_err(), MbusError::InvalidPduLength);
}
}