| 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); | |
| } | |
| } | |
| } | |
| } |