use crate::i128::tests::{
set::test_support::build,
test_support::{MID_VALUE, build_from_vec, interval_pair, iv},
};
#[test]
fn predicates_contains_point_respects_half_open_bounds() {
let set = build([(10, 20)]);
assert!(!set.contains_point(9));
assert!(set.contains_point(10));
assert!(set.contains_point(19));
assert!(!set.contains_point(20));
}
#[test]
fn predicates_contains_point_works_across_multiple_intervals() {
let set = build([(-50, -40), (-10, 10), (30, 40)]);
assert!(set.contains_point(-50));
assert!(set.contains_point(0));
assert!(set.contains_point(39));
assert!(!set.contains_point(-51));
assert!(!set.contains_point(-40));
assert!(!set.contains_point(10));
assert!(!set.contains_point(i128::MAX));
}
#[test]
fn predicates_contains_point_works_on_empty_set() {
let set = build([]);
assert!(!set.contains_point(i128::MIN));
assert!(!set.contains_point(MID_VALUE));
assert!(!set.contains_point(i128::MAX));
}
#[test]
fn predicates_contains_interval_accepts_fully_covered_query() {
let set = build([(10, 20), (30, 40)]);
assert!(set.contains_interval(iv(10, 20)));
assert!(set.contains_interval(iv(12, 18)));
assert!(set.contains_interval(iv(30, 40)));
}
#[test]
fn predicates_contains_interval_rejects_partial_or_gap_crossing_query() {
let set = build([(10, 20), (30, 40)]);
assert!(!set.contains_interval(iv(9, 11)));
assert!(!set.contains_interval(iv(18, 22)));
assert!(!set.contains_interval(iv(20, 30)));
assert!(!set.contains_interval(iv(18, 32)));
assert!(!set.contains_interval(iv(25, 35)));
}
#[test]
fn predicates_contains_interval_works_after_canonical_merge() {
let set = build([(-20, -10), (-10, 0), (5, 15), (10, 20)]);
assert_eq!(set.as_slice(), &[iv(-20, 0), iv(5, 20)]);
assert!(set.contains_interval(iv(-20, 0)));
assert!(set.contains_interval(iv(5, 20)));
assert!(set.contains_interval(iv(8, 18)));
assert!(!set.contains_interval(iv(-1, 6)));
assert!(!set.contains_interval(iv(0, 5)));
}
#[test]
fn predicates_contains_interval_works_on_empty_set() {
let set = build([]);
assert!(!set.contains_interval(iv(0, 1)));
assert!(!set.contains_interval(iv(100, 101)));
assert!(!set.contains_interval(iv(i128::MAX - 1, i128::MAX)));
}
#[test]
fn predicates_intersects_interval_accepts_overlap_on_left_middle_and_right() {
let set = build([(10, 20), (30, 40)]);
assert!(set.intersects_interval(iv(5, 11)));
assert!(set.intersects_interval(iv(12, 18)));
assert!(set.intersects_interval(iv(19, 25)));
assert!(set.intersects_interval(iv(25, 31)));
assert!(set.intersects_interval(iv(35, 38)));
assert!(set.intersects_interval(iv(39, 45)));
}
#[test]
fn predicates_intersects_interval_rejects_adjacent_or_disjoint_query() {
let set = build([(10, 20), (30, 40)]);
assert!(!set.intersects_interval(iv(0, 10)));
assert!(!set.intersects_interval(iv(20, 30)));
assert!(!set.intersects_interval(iv(40, 50)));
assert!(!set.intersects_interval(iv(50, 60)));
}
#[test]
fn predicates_intersects_interval_accepts_query_spanning_gap() {
let set = build([(10, 20), (30, 40)]);
assert!(set.intersects_interval(iv(15, 35)));
assert!(set.intersects_interval(iv(9, 41)));
}
#[test]
fn predicates_intersects_interval_works_on_empty_set() {
let set = build([]);
assert!(!set.intersects_interval(iv(0, 1)));
assert!(!set.intersects_interval(iv(100, 101)));
assert!(!set.intersects_interval(iv(i128::MAX - 1, i128::MAX)));
}
#[test]
fn predicates_handle_domain_edges() {
let set = build([(i128::MIN, i128::MIN + 1), (i128::MAX - 1, i128::MAX)]);
assert!(set.contains_point(i128::MIN));
assert!(!set.contains_point(i128::MIN + 1));
assert!(set.contains_point(i128::MAX - 1));
assert!(!set.contains_point(i128::MAX));
assert!(set.contains_interval(iv(i128::MIN, i128::MIN + 1)));
assert!(set.contains_interval(iv(i128::MAX - 1, i128::MAX)));
assert!(set.intersects_interval(iv(i128::MIN, i128::MIN + 1)));
assert!(set.intersects_interval(iv(i128::MAX - 1, i128::MAX)));
}
use proptest::prelude::*;
proptest! {
#[test]
fn prop_contains_point_matches_point_search(
xs in prop::collection::vec(interval_pair(), 0..64),
x in any::<i128>(),
) {
let set = build_from_vec(xs);
prop_assert_eq!(
set.contains_point(x),
set.interval_containing_point(x).is_some()
);
}
#[test]
fn prop_intersects_interval_matches_interval_search(
xs in prop::collection::vec(interval_pair(), 0..64),
query in interval_pair(),
) {
let set = build_from_vec(xs);
let query = iv(query.0, query.1);
prop_assert_eq!(
set.intersects_interval(query),
set.intervals_intersecting(query).next().is_some()
);
}
#[test]
fn prop_contains_interval_implies_intersects_interval(
xs in prop::collection::vec(interval_pair(), 0..64),
query in interval_pair(),
) {
let set = build_from_vec(xs);
let query = iv(query.0, query.1);
if set.contains_interval(query) {
prop_assert!(set.intersects_interval(query));
}
}
}