Skip to content

Commit 398e7ef

Browse files
committed
Add more tests
1 parent ee2146b commit 398e7ef

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

src/lib.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ impl<T> PacketBuffer<T> {
104104
/// Retain only the elements in the given index range.
105105
pub fn retain_range<R: std::ops::RangeBounds<u64>>(&mut self, range: R) {
106106
let (min1, max1) = self.clip_bounds(range);
107+
if min1 >= max1 {
108+
self.data.clear();
109+
self.min = 0;
110+
self.max = 0;
111+
self.check_invariants();
112+
return;
113+
}
107114
let base = base(self.min, self.max);
108115
for i in self.min..min1 {
109116
self.data[(i - base) as usize] = None;
@@ -410,6 +417,61 @@ mod tests {
410417
assert!(pb.is_empty());
411418
}
412419

420+
#[test]
421+
fn test_range_iterators() {
422+
let mut pb = PacketBuffer::default();
423+
for i in 0..100 {
424+
pb.insert(i, i * 10);
425+
}
426+
427+
// Test keys_range
428+
let keys: Vec<_> = pb.keys_range(10..20).collect();
429+
assert_eq!(keys, (10..20).collect::<Vec<_>>());
430+
431+
// Test reverse
432+
let keys_rev: Vec<_> = pb.keys_range(10..20).rev().collect();
433+
assert_eq!(keys_rev, (10..20).rev().collect::<Vec<_>>());
434+
435+
// Test values_range
436+
let values: Vec<_> = pb.values_range(10..20).cloned().collect();
437+
assert_eq!(values, (10..20).map(|i| i * 10).collect::<Vec<_>>());
438+
439+
// Test iter_range
440+
let pairs: Vec<_> = pb.iter_range(10..20).map(|(k, v)| (k, *v)).collect();
441+
assert_eq!(pairs, (10..20).map(|i| (i, i * 10)).collect::<Vec<_>>());
442+
}
443+
444+
#[test]
445+
fn test_retain_range() {
446+
let mut pb = PacketBuffer::default();
447+
for i in 0..100 {
448+
pb.insert(i, i * 10);
449+
}
450+
451+
pb.retain_range(20..80);
452+
453+
assert_eq!(pb.keys().next(), Some(20));
454+
assert_eq!(pb.keys().next_back(), Some(79));
455+
assert_eq!(pb.keys().count(), 60);
456+
for i in 20..80 {
457+
assert_eq!(pb.get(i), Some(&(i * 10)));
458+
}
459+
pb.check_invariants_expensive();
460+
461+
// Retain with range outside current bounds -> empty
462+
pb.retain_range(200..300);
463+
assert!(pb.is_empty());
464+
pb.check_invariants_expensive();
465+
466+
// Rebuild and retain with superset range -> no-op
467+
for i in 10..20 {
468+
pb.insert(i, i * 10);
469+
}
470+
pb.retain_range(0..100);
471+
assert_eq!(pb.keys().count(), 10);
472+
pb.check_invariants_expensive();
473+
}
474+
413475
fn assert_same<I1, I2, T>(iter1: I1, iter2: I2)
414476
where
415477
I1: Iterator<Item = T>,

0 commit comments

Comments
 (0)