aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/proto.rs94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/proto.rs b/src/proto.rs
index f91ffc7..bf82e47 100644
--- a/src/proto.rs
+++ b/src/proto.rs
@@ -204,3 +204,97 @@ pub(crate) trait RecvLoop: Sync + 'static {
}
}
}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+
+ #[test]
+ fn test_priority_queue() {
+ let i1 = SendQueueItem {
+ id: 1,
+ prio: PRIO_NORMAL,
+ data: vec![],
+ cursor: 0,
+ };
+ let i2 = SendQueueItem {
+ id: 2,
+ prio: PRIO_HIGH,
+ data: vec![],
+ cursor: 0,
+ };
+ let i2bis = SendQueueItem {
+ id: 20,
+ prio: PRIO_HIGH,
+ data: vec![],
+ cursor: 0,
+ };
+ let i3 = SendQueueItem {
+ id: 3,
+ prio: PRIO_HIGH | PRIO_SECONDARY,
+ data: vec![],
+ cursor: 0,
+ };
+ let i4 = SendQueueItem {
+ id: 4,
+ prio: PRIO_BACKGROUND | PRIO_SECONDARY,
+ data: vec![],
+ cursor: 0,
+ };
+ let i5 = SendQueueItem {
+ id: 5,
+ prio: PRIO_BACKGROUND | PRIO_PRIMARY,
+ data: vec![],
+ cursor: 0,
+ };
+
+ let mut q = SendQueue::new();
+
+ q.push(i1); // 1
+ let a = q.pop().unwrap(); // empty -> 1
+ assert_eq!(a.id, 1);
+ assert!(q.pop().is_none());
+
+ q.push(a); // 1
+ q.push(i2); // 2 1
+ q.push(i2bis); // [2 20] 1
+ let a = q.pop().unwrap(); // 20 1 -> 2
+ assert_eq!(a.id, 2);
+ let b = q.pop().unwrap(); // 1 -> 20
+ assert_eq!(b.id, 20);
+ let c = q.pop().unwrap(); // empty -> 1
+ assert_eq!(c.id, 1);
+ assert!(q.pop().is_none());
+
+ q.push(a); // 2
+ q.push(b); // [2 20]
+ q.push(c); // [2 20] 1
+ q.push(i3); // [2 20] 3 1
+ q.push(i4); // [2 20] 3 1 4
+ q.push(i5); // [2 20] 3 1 5 4
+
+ let a = q.pop().unwrap(); // 20 3 1 5 4 -> 2
+ assert_eq!(a.id, 2);
+ q.push(a); // [20 2] 3 1 5 4
+
+ let a = q.pop().unwrap(); // 2 3 1 5 4 -> 20
+ assert_eq!(a.id, 20);
+ let b = q.pop().unwrap(); // 3 1 5 4 -> 2
+ assert_eq!(b.id, 2);
+ q.push(b); // 2 3 1 5 4
+ let b = q.pop().unwrap(); // 3 1 5 4 -> 2
+ assert_eq!(b.id, 2);
+ let c = q.pop().unwrap(); // 1 5 4 -> 3
+ assert_eq!(c.id, 3);
+ q.push(b); // 2 1 5 4
+ let b = q.pop().unwrap(); // 1 5 4 -> 2
+ assert_eq!(b.id, 2);
+ let e = q.pop().unwrap(); // 5 4 -> 1
+ assert_eq!(e.id, 1);
+ let f = q.pop().unwrap(); // 4 -> 5
+ assert_eq!(f.id, 5);
+ let g = q.pop().unwrap(); // empty -> 4
+ assert_eq!(g.id, 4);
+ assert!(q.pop().is_none());
+ }
+}