bacnet-objects 0.13.0

BACnet object model: traits, database, and standard object types
Documentation
use super::receipt::{
    contains, insert, CompletedAuditReceipt, ConfirmedAuditNotificationOutcome,
    COMPLETED_AUDIT_RECEIPT_RETENTION_MILLIS, MAX_COMPLETED_AUDIT_RECEIPTS,
};

fn completed(index: usize, at: u64) -> CompletedAuditReceipt {
    CompletedAuditReceipt::new(index.to_be_bytes().to_vec(), at).unwrap()
}

#[test]
fn retention_boundary_and_future_timestamp_fail_open() {
    let retained = completed(1, 10_000);
    let mut receipts = vec![retained.clone(), completed(2, 80_000)];
    assert!(contains(
        &receipts,
        retained.key(),
        10_000 + COMPLETED_AUDIT_RECEIPT_RETENTION_MILLIS - 1
    )
    .unwrap());
    assert!(!contains(
        &receipts,
        retained.key(),
        10_000 + COMPLETED_AUDIT_RECEIPT_RETENTION_MILLIS
    )
    .unwrap());
    assert!(!contains(&receipts, completed(2, 0).key(), 70_000).unwrap());

    assert_eq!(
        insert(&mut receipts, completed(3, 70_000)).unwrap(),
        ConfirmedAuditNotificationOutcome::Stored
    );
    assert_eq!(receipts.len(), 1);
    assert_eq!(receipts[0].key(), completed(3, 0).key());
}

#[test]
fn full_receipt_list_evicts_oldest_completion_then_oldest_tie() {
    let mut receipts = (0..MAX_COMPLETED_AUDIT_RECEIPTS)
        .map(|index| completed(index, 100))
        .collect::<Vec<_>>();
    let first_key = receipts[0].key().to_vec();
    let second_key = receipts[1].key().to_vec();

    assert_eq!(
        insert(&mut receipts, completed(MAX_COMPLETED_AUDIT_RECEIPTS, 100)).unwrap(),
        ConfirmedAuditNotificationOutcome::Stored
    );
    assert_eq!(receipts.len(), MAX_COMPLETED_AUDIT_RECEIPTS);
    assert!(!contains(&receipts, &first_key, 100).unwrap());
    assert!(contains(&receipts, &second_key, 100).unwrap());
}