use ordmask::{OrdMask, ordmask};
macro_rules! assert_mask_eq {
($left:expr, $right:expr, $msg:expr) => {
assert_eq!(
$left, $right,
"{}: left={:?}, right={:?}",
$msg, $left, $right
);
};
}
#[test]
fn test_intersection_basic() {
let test_cases: Vec<((Vec<i32>, bool), (Vec<i32>, bool), (Vec<i32>, bool))> = vec![
(
(vec![0, 10], false),
(vec![5, 15], false),
(vec![5, 10], false),
),
(
(vec![0, 5], false),
(vec![10, 15], false),
(vec![], false),
),
(
(vec![0, 20], false),
(vec![5, 10], false),
(vec![5, 10], false),
),
(
(vec![0, 10], false),
(vec![0, 10], false),
(vec![0, 10], false),
),
(
(vec![0, 5], false),
(vec![5, 10], false),
(vec![], false), ),
];
for ((kp1, rev1), (kp2, rev2), (expected_kp, expected_rev)) in test_cases {
let mask1: OrdMask<i32> = unsafe { OrdMask::with_checked(kp1, rev1) };
let mask2: OrdMask<i32> = unsafe { OrdMask::with_checked(kp2, rev2) };
let expected: OrdMask<i32> = unsafe { OrdMask::with_checked(expected_kp, expected_rev) };
let result = OrdMask::intersection(&[&mask1, &mask2]);
assert_mask_eq!(result, expected, "intersection basic test failed");
}
}
#[test]
fn test_intersection_with_empty() {
let empty = ordmask![];
let mask = ordmask![0, 10];
let universal = ordmask![..];
assert_eq!(OrdMask::intersection(&[&empty, &mask]), empty);
assert_eq!(OrdMask::intersection(&[&mask, &empty]), empty);
assert_eq!(OrdMask::intersection(&[&empty, &empty]), empty);
assert_eq!(OrdMask::intersection(&[&empty, &universal]), empty);
}
#[test]
fn test_intersection_with_universal() {
let universal = ordmask![..];
let mask = ordmask![0, 10];
let empty = ordmask![];
assert_eq!(OrdMask::intersection(&[&universal, &mask]), mask);
assert_eq!(OrdMask::intersection(&[&mask, &universal]), mask);
assert_eq!(OrdMask::intersection(&[&universal, &universal]), universal);
assert_eq!(OrdMask::intersection(&[&universal, &empty]), empty);
}
#[test]
fn test_intersection_with_reversed() {
let reversed1 = ordmask![.., 0, 10]; let reversed2 = ordmask![.., 5, 15]; let normal = ordmask![0, 10];
let result = OrdMask::intersection(&[&reversed1, &reversed2]);
assert_eq!(result, ordmask![.., 0, 15]);
let result = OrdMask::intersection(&[&reversed1, &normal]);
assert_eq!(result, ordmask![]);
let result = OrdMask::intersection(&[&reversed2, &normal]);
assert_eq!(result, ordmask![0, 5]);
}
#[test]
fn test_intersection_with_infinite() {
let inf_right = ordmask![0]; let inf_left = ordmask![.., 10]; let finite = ordmask![5, 15];
let result = OrdMask::intersection(&[&inf_right, &inf_left]);
assert_eq!(result, ordmask![0, 10]);
let result = OrdMask::intersection(&[&inf_right, &finite]);
assert_eq!(result, ordmask![5, 15]);
let result = OrdMask::intersection(&[&inf_left, &finite]);
assert_eq!(result, ordmask![5, 10]);
}
#[test]
fn test_intersection_at_edge() {
let a = ordmask![.., 0]; let b = ordmask![u32::MAX]; let c = ordmask![0, 10]; let d = ordmask![100, u32::MAX]; let e = ordmask![5, 15];
assert_eq!(OrdMask::intersection(&[&a, &b]), a);
assert_eq!(OrdMask::intersection(&[&b, &a]), a);
assert_eq!(OrdMask::intersection(&[&a, &c]), a);
assert_eq!(OrdMask::intersection(&[&c, &a]), a);
assert_eq!(OrdMask::intersection(&[&a, &d]), a);
assert_eq!(OrdMask::intersection(&[&d, &a]), a);
assert_eq!(OrdMask::intersection(&[&a, &e]), a);
assert_eq!(OrdMask::intersection(&[&e, &a]), a);
assert_eq!(OrdMask::intersection(&[&b, &c]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&c, &b]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&b, &d]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&d, &b]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&b, &e]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&e, &b]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&c, &d]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&d, &c]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&c, &e]), ordmask![5, 10]);
assert_eq!(OrdMask::intersection(&[&e, &c]), ordmask![5, 10]);
assert_eq!(OrdMask::intersection(&[&d, &e]), ordmask![]);
assert_eq!(OrdMask::intersection(&[&e, &d]), ordmask![]);
}
#[test]
fn test_intersection_operator() {
let mask1 = ordmask![0, 10];
let mask2 = ordmask![5, 15];
let expected = ordmask![5, 10];
assert_eq!(&mask1 & &mask2, expected);
assert_eq!(mask1.clone() & mask2.clone(), expected);
assert_eq!(&mask1 & mask2.clone(), expected);
assert_eq!(mask1.clone() & &mask2, expected);
assert_eq!(mask1 & mask2, expected);
}
#[test]
fn test_intersection_multiple() {
let mask1 = ordmask![0, 20];
let mask2 = ordmask![5, 15];
let mask3 = ordmask![10, 25];
let result = OrdMask::intersection(&[&mask1, &mask2, &mask3]);
assert_eq!(result, ordmask![10, 15]);
let mask1 = ordmask![0, 5];
let mask2 = ordmask![10, 15];
let mask3 = ordmask![20, 25];
let result = OrdMask::intersection(&[&mask1, &mask2, &mask3]);
assert_eq!(result, ordmask![]);
}
#[test]
fn test_intersection_complex_ranges() {
let mask1 = ordmask![0, 5, 10, 15, 20, 25];
let mask2 = ordmask![3, 7, 12, 18, 22, 30];
let result = OrdMask::intersection(&[&mask1, &mask2]);
assert_eq!(result, ordmask![3, 5, 12, 15, 22, 25]);
}