use super::*;
mod unit_tests {
use super::*;
#[inline]
fn iv(start: i128, end_excl: i128) -> I128CO {
I128CO::try_new(start, end_excl).unwrap()
}
mod contains_point_tests {
use super::*;
#[test]
fn empty_set() {
let set = I128COBatchSet::default();
assert!(!set.contains_point(0));
assert!(!set.contains_point(42));
assert!(!set.contains_point(127));
}
#[test]
fn single_interval_basic() {
let set = I128COBatchSet::from([iv(3, 7)]);
assert!(!set.contains_point(2));
assert!(set.contains_point(3));
assert!(set.contains_point(4));
assert!(set.contains_point(6));
assert!(!set.contains_point(7));
}
#[test]
fn multi_interval_with_gaps() {
let set = I128COBatchSet::from([iv(1, 3), iv(5, 8), iv(10, 11)]);
assert!(!set.contains_point(0));
assert!(set.contains_point(1));
assert!(set.contains_point(2));
assert!(!set.contains_point(3));
assert!(!set.contains_point(4));
assert!(set.contains_point(5));
assert!(set.contains_point(7));
assert!(!set.contains_point(8));
assert!(!set.contains_point(9));
assert!(set.contains_point(10));
assert!(!set.contains_point(11));
}
}
mod contains_interval_tests {
use super::*;
#[test]
fn empty_set() {
let set = I128COBatchSet::default();
assert!(!set.contains_interval(iv(0, 1)));
assert!(!set.contains_interval(iv(10, 20)));
}
#[test]
fn single_interval_basic() {
let set = I128COBatchSet::from([iv(3, 9)]);
assert!(set.contains_interval(iv(3, 4)));
assert!(set.contains_interval(iv(3, 9)));
assert!(set.contains_interval(iv(4, 8)));
assert!(set.contains_interval(iv(8, 9)));
assert!(!set.contains_interval(iv(2, 4)));
assert!(!set.contains_interval(iv(3, 10)));
assert!(!set.contains_interval(iv(2, 10)));
}
#[test]
fn multi_interval_does_not_bridge_gap() {
let set = I128COBatchSet::from([iv(1, 4), iv(6, 9)]);
assert!(set.contains_interval(iv(1, 4)));
assert!(set.contains_interval(iv(2, 3)));
assert!(set.contains_interval(iv(6, 8)));
assert!(!set.contains_interval(iv(3, 6)));
assert!(!set.contains_interval(iv(2, 7)));
assert!(!set.contains_interval(iv(4, 6)));
}
}
mod interval_containing_point_tests {
use super::*;
#[test]
fn empty_set() {
let set = I128COBatchSet::default();
assert_eq!(set.interval_containing_point(0), None);
assert_eq!(set.interval_containing_point(123), None);
}
#[test]
fn single_interval() {
let set = I128COBatchSet::from([iv(10, 15)]);
assert_eq!(set.interval_containing_point(9), None);
assert_eq!(set.interval_containing_point(10), Some(iv(10, 15)));
assert_eq!(set.interval_containing_point(12), Some(iv(10, 15)));
assert_eq!(set.interval_containing_point(14), Some(iv(10, 15)));
assert_eq!(set.interval_containing_point(15), None);
}
#[test]
fn multi_interval() {
let set = I128COBatchSet::from([iv(0, 2), iv(4, 7), iv(9, 10)]);
assert_eq!(set.interval_containing_point(0), Some(iv(0, 2)));
assert_eq!(set.interval_containing_point(1), Some(iv(0, 2)));
assert_eq!(set.interval_containing_point(2), None);
assert_eq!(set.interval_containing_point(4), Some(iv(4, 7)));
assert_eq!(set.interval_containing_point(6), Some(iv(4, 7)));
assert_eq!(set.interval_containing_point(7), None);
assert_eq!(set.interval_containing_point(8), None);
assert_eq!(set.interval_containing_point(9), Some(iv(9, 10)));
assert_eq!(set.interval_containing_point(10), None);
}
}
mod intersects_tests {
use super::*;
#[test]
fn empty_set() {
let set = I128COBatchSet::default();
assert!(!set.intersects(iv(0, 1)));
assert!(!set.intersects(iv(10, 20)));
}
#[test]
fn single_interval_basic() {
let set = I128COBatchSet::from([iv(5, 10)]);
assert!(!set.intersects(iv(0, 5)));
assert!(set.intersects(iv(0, 6)));
assert!(set.intersects(iv(5, 6)));
assert!(set.intersects(iv(6, 9)));
assert!(set.intersects(iv(9, 12)));
assert!(!set.intersects(iv(10, 12)));
}
#[test]
fn multi_interval_hits_predecessor_and_successor_regions() {
let set = I128COBatchSet::from([iv(2, 4), iv(7, 9), iv(12, 15)]);
assert!(set.intersects(iv(3, 5)));
assert!(set.intersects(iv(6, 8)));
assert!(set.intersects(iv(8, 13)));
assert!(set.intersects(iv(14, 16)));
assert!(!set.intersects(iv(4, 7)));
assert!(!set.intersects(iv(9, 12)));
assert!(!set.intersects(iv(0, 2)));
assert!(!set.intersects(iv(15, 20)));
}
#[test]
fn query_covering_multiple_segments_and_gaps() {
let set = I128COBatchSet::from([iv(1, 3), iv(5, 7), iv(9, 11)]);
assert!(set.intersects(iv(2, 10)));
assert!(set.intersects(iv(3, 6)));
assert!(set.intersects(iv(7, 10)));
assert!(!set.intersects(iv(3, 5)));
assert!(!set.intersects(iv(7, 9)));
}
}
mod normalized_behavior_tests {
use super::*;
#[test]
fn normalized_set_behaves_correctly_for_membership_queries() {
let set = I128COBatchSet::from([iv(5, 7), iv(1, 3), iv(3, 5), iv(10, 12)]);
assert!(set.contains_point(1));
assert!(set.contains_point(6));
assert!(!set.contains_point(7));
assert!(set.contains_interval(iv(1, 7)));
assert!(set.contains_interval(iv(2, 6)));
assert!(!set.contains_interval(iv(6, 10)));
assert_eq!(set.interval_containing_point(4), Some(iv(1, 7)));
assert_eq!(set.interval_containing_point(8), None);
assert!(set.intersects(iv(6, 11)));
assert!(!set.intersects(iv(7, 10)));
}
}
}