200 lines
5.5 KiB
Rust
200 lines
5.5 KiB
Rust
use super::*;
|
|
|
|
#[test]
|
|
fn insert_collapses() {
|
|
let mut set = IntervalSet::<u32>::new(10000);
|
|
set.insert_range(9831..=9837);
|
|
set.insert_range(43..=9830);
|
|
assert_eq!(set.iter_intervals().collect::<Vec<_>>(), [43..9838]);
|
|
}
|
|
|
|
#[test]
|
|
fn contains() {
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert(0u32);
|
|
assert!(set.contains(0));
|
|
set.insert_range(0..10);
|
|
assert!(set.contains(9));
|
|
assert!(!set.contains(10));
|
|
set.insert_range(10..11);
|
|
assert!(set.contains(10));
|
|
}
|
|
|
|
#[test]
|
|
fn insert() {
|
|
for i in 0..30usize {
|
|
let mut set = IntervalSet::new(300);
|
|
for j in i..30usize {
|
|
set.insert(j);
|
|
for k in i..j {
|
|
assert!(set.contains(k));
|
|
}
|
|
}
|
|
}
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(0..1u32);
|
|
assert!(set.contains(0), "{:?}", set.map);
|
|
assert!(!set.contains(1));
|
|
set.insert_range(1..1);
|
|
assert!(set.contains(0));
|
|
assert!(!set.contains(1));
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(4..5u32);
|
|
set.insert_range(5..10);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [4, 5, 6, 7, 8, 9]);
|
|
set.insert_range(3..7);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [3, 4, 5, 6, 7, 8, 9]);
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(0..10u32);
|
|
set.insert_range(3..5);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(0..10u32);
|
|
set.insert_range(0..3);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(0..10u32);
|
|
set.insert_range(0..10);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(0..10u32);
|
|
set.insert_range(5..10);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(0..10u32);
|
|
set.insert_range(5..13);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
|
|
}
|
|
|
|
#[test]
|
|
fn insert_range() {
|
|
#[track_caller]
|
|
fn check<R>(range: R)
|
|
where
|
|
R: RangeBounds<usize> + Clone + IntoIterator<Item = usize> + std::fmt::Debug,
|
|
{
|
|
let mut set = IntervalSet::new(300);
|
|
set.insert_range(range.clone());
|
|
for i in set.iter() {
|
|
assert!(range.contains(&i));
|
|
}
|
|
for i in range.clone() {
|
|
assert!(set.contains(i), "A: {} in {:?}, inserted {:?}", i, set, range);
|
|
}
|
|
set.insert_range(range.clone());
|
|
for i in set.iter() {
|
|
assert!(range.contains(&i), "{} in {:?}", i, set);
|
|
}
|
|
for i in range.clone() {
|
|
assert!(set.contains(i), "B: {} in {:?}, inserted {:?}", i, set, range);
|
|
}
|
|
}
|
|
check(10..10);
|
|
check(10..100);
|
|
check(10..30);
|
|
check(0..5);
|
|
check(0..250);
|
|
check(200..250);
|
|
|
|
check(10..=10);
|
|
check(10..=100);
|
|
check(10..=30);
|
|
check(0..=5);
|
|
check(0..=250);
|
|
check(200..=250);
|
|
|
|
for i in 0..30 {
|
|
for j in i..30 {
|
|
check(i..j);
|
|
check(i..=j);
|
|
}
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn insert_range_dual() {
|
|
let mut set = IntervalSet::<u32>::new(300);
|
|
set.insert_range(0..3);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2]);
|
|
set.insert_range(5..7);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 5, 6]);
|
|
set.insert_range(3..4);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 5, 6]);
|
|
set.insert_range(3..5);
|
|
assert_eq!(set.iter().collect::<Vec<_>>(), [0, 1, 2, 3, 4, 5, 6]);
|
|
}
|
|
|
|
#[test]
|
|
fn last_set_before_adjacent() {
|
|
let mut set = IntervalSet::<u32>::new(300);
|
|
set.insert_range(0..3);
|
|
set.insert_range(3..5);
|
|
assert_eq!(set.last_set_in(0..3), Some(2));
|
|
assert_eq!(set.last_set_in(0..5), Some(4));
|
|
assert_eq!(set.last_set_in(3..5), Some(4));
|
|
set.insert_range(2..5);
|
|
assert_eq!(set.last_set_in(0..3), Some(2));
|
|
assert_eq!(set.last_set_in(0..5), Some(4));
|
|
assert_eq!(set.last_set_in(3..5), Some(4));
|
|
}
|
|
|
|
#[test]
|
|
fn last_set_in() {
|
|
fn easy(set: &IntervalSet<usize>, needle: impl RangeBounds<usize>) -> Option<usize> {
|
|
let mut last_leq = None;
|
|
for e in set.iter() {
|
|
if needle.contains(&e) {
|
|
last_leq = Some(e);
|
|
}
|
|
}
|
|
last_leq
|
|
}
|
|
|
|
#[track_caller]
|
|
fn cmp(set: &IntervalSet<usize>, needle: impl RangeBounds<usize> + Clone + std::fmt::Debug) {
|
|
assert_eq!(
|
|
set.last_set_in(needle.clone()),
|
|
easy(set, needle.clone()),
|
|
"{:?} in {:?}",
|
|
needle,
|
|
set
|
|
);
|
|
}
|
|
let mut set = IntervalSet::new(300);
|
|
cmp(&set, 50..=50);
|
|
set.insert(64);
|
|
cmp(&set, 64..=64);
|
|
set.insert(64 - 1);
|
|
cmp(&set, 0..=64 - 1);
|
|
cmp(&set, 0..=5);
|
|
cmp(&set, 10..100);
|
|
set.insert(100);
|
|
cmp(&set, 100..110);
|
|
cmp(&set, 99..100);
|
|
cmp(&set, 99..=100);
|
|
|
|
for i in 0..=30 {
|
|
for j in i..=30 {
|
|
for k in 0..30 {
|
|
let mut set = IntervalSet::new(100);
|
|
cmp(&set, ..j);
|
|
cmp(&set, i..);
|
|
cmp(&set, i..j);
|
|
cmp(&set, i..=j);
|
|
set.insert(k);
|
|
cmp(&set, ..j);
|
|
cmp(&set, i..);
|
|
cmp(&set, i..j);
|
|
cmp(&set, i..=j);
|
|
}
|
|
}
|
|
}
|
|
}
|