use super::super::*;
use bacnet_objects::analog::AnalogInputObject;
use bacnet_objects::event_enrollment::EventEnrollmentObject;
use bacnet_objects::traits::BACnetObject;
use bacnet_types::constructed::{BACnetDeviceObjectPropertyReference, BACnetEventParameter};
use bacnet_types::enums::EngineeringUnits;
fn setup(detection_enabled: bool) -> (ObjectDatabase, ObjectIdentifier) {
let mut db = ObjectDatabase::new();
let mut ai = AnalogInputObject::new(20, "AI-20", EngineeringUnits::DEGREES_CELSIUS).unwrap();
ai.set_present_value(85.0); let ai_oid = ai.object_identifier();
db.add(Box::new(ai)).unwrap();
let mut ee = EventEnrollmentObject::new(20, "EE-det", EventType::OUT_OF_RANGE).unwrap();
ee.set_object_property_reference(Some(BACnetDeviceObjectPropertyReference::new_local(
ai_oid,
PropertyIdentifier::PRESENT_VALUE.to_raw(),
)))
.unwrap();
ee.set_event_parameters(BACnetEventParameter::OutOfRange {
time_delay: 0,
low_limit: 20.0,
high_limit: 80.0,
deadband: 2.0,
});
ee.set_event_enable(EventTransitionBits::all());
if !detection_enabled {
ee.write_property(
PropertyIdentifier::EVENT_DETECTION_ENABLE,
None,
PropertyValue::Boolean(false),
None,
)
.unwrap();
}
let ee_oid = ee.object_identifier();
db.add(Box::new(ee)).unwrap();
(db, ee_oid)
}
#[test]
fn detection_enabled_evaluates_normally() {
let (mut db, _ee_oid) = setup(true);
let transitions = evaluate_event_enrollments(&mut db, 1);
assert_eq!(transitions.len(), 1);
assert_eq!(transitions[0].change.to, EventState::HIGH_LIMIT);
}
#[test]
fn detection_disabled_yields_no_transitions() {
let (mut db, _ee_oid) = setup(false);
assert!(
evaluate_event_enrollments(&mut db, 1).is_empty(),
"no transition may occur while Event_Detection_Enable is FALSE"
);
}
#[test]
fn detection_disabled_holds_event_state_at_normal() {
let (mut db, ee_oid) = setup(false);
evaluate_event_enrollments(&mut db, 1);
let obj = db.get(&ee_oid).unwrap();
assert_eq!(
obj.read_property(PropertyIdentifier::EVENT_STATE, None)
.unwrap(),
PropertyValue::Enumerated(EventState::NORMAL.to_raw())
);
}
#[test]
fn re_enabling_detection_resumes_evaluation() {
let (mut db, ee_oid) = setup(false);
assert!(evaluate_event_enrollments(&mut db, 1).is_empty());
db.get_mut(&ee_oid)
.unwrap()
.write_property(
PropertyIdentifier::EVENT_DETECTION_ENABLE,
None,
PropertyValue::Boolean(true),
None,
)
.unwrap();
let transitions = evaluate_event_enrollments(&mut db, 1);
assert_eq!(transitions.len(), 1, "detection resumes once re-enabled");
assert_eq!(transitions[0].change.from, EventState::NORMAL);
assert_eq!(transitions[0].change.to, EventState::HIGH_LIMIT);
}