use canlink_hal::queue::{BoundedQueue, QueueOverflowPolicy};
use canlink_hal::{CanMessage, QueueError};
use std::time::Duration;
#[test]
fn test_drop_oldest_policy() {
let mut queue = BoundedQueue::with_policy(3, QueueOverflowPolicy::DropOldest);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
let msg3 = CanMessage::new_standard(0x300, &[3]).unwrap();
assert!(queue.push(msg1).is_ok());
assert!(queue.push(msg2).is_ok());
assert!(queue.push(msg3).is_ok());
assert_eq!(queue.len(), 3);
let msg4 = CanMessage::new_standard(0x400, &[4]).unwrap();
assert!(queue.push(msg4).is_ok());
assert_eq!(queue.len(), 3);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 2);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 3);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 4);
assert!(queue.pop().is_none());
}
#[test]
fn test_drop_newest_policy() {
let mut queue = BoundedQueue::with_policy(3, QueueOverflowPolicy::DropNewest);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
let msg3 = CanMessage::new_standard(0x300, &[3]).unwrap();
assert!(queue.push(msg1).is_ok());
assert!(queue.push(msg2).is_ok());
assert!(queue.push(msg3).is_ok());
assert_eq!(queue.len(), 3);
let msg4 = CanMessage::new_standard(0x400, &[4]).unwrap();
let result = queue.push(msg4);
assert!(result.is_err());
match result {
Err(QueueError::MessageDropped { id, .. }) => {
assert_eq!(id, 0x400);
}
_ => panic!("Expected MessageDropped error"),
}
assert_eq!(queue.len(), 3);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 1);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 2);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 3);
assert!(queue.pop().is_none());
}
#[test]
fn test_block_policy_immediate_space() {
let mut queue = BoundedQueue::with_policy(
3,
QueueOverflowPolicy::Block {
timeout: Duration::from_millis(100),
},
);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
assert!(queue.push(msg1).is_ok());
assert_eq!(queue.len(), 1);
}
#[test]
fn test_block_policy_returns_queue_full() {
let mut queue = BoundedQueue::with_policy(
1,
QueueOverflowPolicy::Block {
timeout: Duration::from_millis(100),
},
);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
assert!(queue.push(msg1).is_ok());
assert_eq!(queue.len(), 1);
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
let result = queue.push(msg2);
match result {
Err(QueueError::QueueFull { capacity }) => {
assert_eq!(capacity, 1);
}
_ => panic!("Expected QueueFull error"),
}
}
#[test]
fn test_policy_default_is_drop_oldest() {
let queue = BoundedQueue::new(10);
assert_eq!(queue.policy(), QueueOverflowPolicy::DropOldest);
}
#[test]
fn test_policy_statistics_tracking() {
let mut queue = BoundedQueue::with_policy(2, QueueOverflowPolicy::DropOldest);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
let msg3 = CanMessage::new_standard(0x300, &[3]).unwrap();
let msg4 = CanMessage::new_standard(0x400, &[4]).unwrap();
queue.push(msg1).unwrap();
queue.push(msg2).unwrap();
queue.push(msg3).unwrap(); queue.push(msg4).unwrap();
let stats = queue.stats();
assert_eq!(stats.enqueued, 4);
assert_eq!(stats.dropped, 2);
assert_eq!(stats.overflow_count, 2);
}
#[test]
fn test_drop_oldest_with_single_capacity() {
let mut queue = BoundedQueue::with_policy(1, QueueOverflowPolicy::DropOldest);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
queue.push(msg1).unwrap();
queue.push(msg2).unwrap();
assert_eq!(queue.len(), 1);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 2); }
#[test]
fn test_drop_newest_with_single_capacity() {
let mut queue = BoundedQueue::with_policy(1, QueueOverflowPolicy::DropNewest);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
queue.push(msg1).unwrap();
let result = queue.push(msg2);
assert!(result.is_err());
assert_eq!(queue.len(), 1);
let popped = queue.pop().unwrap();
assert_eq!(popped.data()[0], 1); }
#[test]
fn test_drop_newest_statistics() {
let mut queue = BoundedQueue::with_policy(2, QueueOverflowPolicy::DropNewest);
let msg1 = CanMessage::new_standard(0x100, &[1]).unwrap();
let msg2 = CanMessage::new_standard(0x200, &[2]).unwrap();
let msg3 = CanMessage::new_standard(0x300, &[3]).unwrap();
queue.push(msg1).unwrap();
queue.push(msg2).unwrap();
let _ = queue.push(msg3);
let stats = queue.stats();
assert_eq!(stats.enqueued, 2); assert_eq!(stats.dropped, 1);
assert_eq!(stats.overflow_count, 1);
}
#[test]
fn test_policy_equality() {
assert_eq!(
QueueOverflowPolicy::DropOldest,
QueueOverflowPolicy::DropOldest
);
assert_eq!(
QueueOverflowPolicy::DropNewest,
QueueOverflowPolicy::DropNewest
);
assert_eq!(
QueueOverflowPolicy::Block {
timeout: Duration::from_millis(100)
},
QueueOverflowPolicy::Block {
timeout: Duration::from_millis(100)
}
);
assert_ne!(
QueueOverflowPolicy::Block {
timeout: Duration::from_millis(100)
},
QueueOverflowPolicy::Block {
timeout: Duration::from_millis(200)
}
);
assert_ne!(
QueueOverflowPolicy::DropOldest,
QueueOverflowPolicy::DropNewest
);
}
#[test]
fn test_policy_helper_methods() {
let drop_oldest = QueueOverflowPolicy::drop_oldest();
assert_eq!(drop_oldest, QueueOverflowPolicy::DropOldest);
assert!(!drop_oldest.may_block());
assert!(drop_oldest.timeout().is_none());
let drop_newest = QueueOverflowPolicy::drop_newest();
assert_eq!(drop_newest, QueueOverflowPolicy::DropNewest);
assert!(!drop_newest.may_block());
assert!(drop_newest.timeout().is_none());
let block = QueueOverflowPolicy::block(Duration::from_millis(500));
assert!(block.may_block());
assert_eq!(block.timeout(), Some(Duration::from_millis(500)));
}