int-interval-set 0.1.0

Integer half-open interval set structures built on top of int-interval.
Documentation
// -----------------------------------------------------------------------------
// @generated by xtask/codegen (--batch --signed)
// DO NOT EDIT MANUALLY.
// Changes will be overwritten.
// -----------------------------------------------------------------------------

use super::*;

mod unit_tests {
    use super::*;

    #[inline]
    fn iv(start: i64, end_excl: i64) -> I64CO {
        I64CO::try_new(start, end_excl).unwrap()
    }

    mod contains_point_tests {
        use super::*;

        #[test]
        fn empty_set() {
            let set = I64COBatchSet::default();

            assert!(!set.contains_point(0));
            assert!(!set.contains_point(42));
            assert!(!set.contains_point(127));
        }

        #[test]
        fn single_interval_basic() {
            let set = I64COBatchSet::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 = I64COBatchSet::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 = I64COBatchSet::default();

            assert!(!set.contains_interval(iv(0, 1)));
            assert!(!set.contains_interval(iv(10, 20)));
        }

        #[test]
        fn single_interval_basic() {
            let set = I64COBatchSet::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 = I64COBatchSet::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 = I64COBatchSet::default();

            assert_eq!(set.interval_containing_point(0), None);
            assert_eq!(set.interval_containing_point(123), None);
        }

        #[test]
        fn single_interval() {
            let set = I64COBatchSet::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 = I64COBatchSet::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 = I64COBatchSet::default();

            assert!(!set.intersects(iv(0, 1)));
            assert!(!set.intersects(iv(10, 20)));
        }

        #[test]
        fn single_interval_basic() {
            let set = I64COBatchSet::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 = I64COBatchSet::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 = I64COBatchSet::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 = I64COBatchSet::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)));
        }
    }
}