any-range 0.1.4

AnyRange<T> enum can hold any Range*<T> type
Documentation
use any_range::AnyRange;
use std::ops::Bound;

#[test]
fn test() {
    let range: AnyRange<usize> = (3..5).into();
    let range_from: AnyRange<usize> = (3..).into();
    let range_full: AnyRange<usize> = (..).into();
    let range_inclusive: AnyRange<usize> = (3..=5).into();
    let range_to: AnyRange<usize> = (..5).into();
    let range_to_inclusive: AnyRange<usize> = (..=5).into();

    let range_clone = range.clone();
    assert_eq!(range, range_clone);

    assert_eq!(Bound::Included(&3), range.start_bound());
    assert_eq!(Bound::Included(&3), range_from.start_bound());
    assert_eq!(Bound::Unbounded, range_full.start_bound());
    assert_eq!(Bound::Included(&3), range_inclusive.start_bound());
    assert_eq!(Bound::Unbounded, range_to.start_bound());
    assert_eq!(Bound::Unbounded, range_to_inclusive.start_bound());

    assert_eq!(Bound::Excluded(&5), range.end_bound());
    assert_eq!(Bound::Unbounded, range_from.end_bound());
    assert_eq!(Bound::Unbounded, range_full.end_bound());
    assert_eq!(Bound::Included(&5), range_inclusive.end_bound());
    assert_eq!(Bound::Excluded(&5), range_to.end_bound());
    assert_eq!(Bound::Included(&5), range_to_inclusive.end_bound());

    assert!(range.contains(&3));
    assert!(range.contains(&4));
    assert!(!range.contains(&5));
    assert!(range_from.contains(&3));
    assert!(range_from.contains(&100));
    assert!(range_full.contains(&0));
    assert!(range_full.contains(&100));
    assert!(range_inclusive.contains(&3));
    assert!(range_inclusive.contains(&4));
    assert!(range_inclusive.contains(&5));
    assert!(!range_inclusive.contains(&6));
    assert!(range_to.contains(&0));
    assert!(range_to.contains(&4));
    assert!(!range_to.contains(&5));
    assert!(range_to_inclusive.contains(&0));
    assert!(range_to_inclusive.contains(&4));
    assert!(range_to_inclusive.contains(&5));
    assert!(!range_to_inclusive.contains(&6));

    assert_eq!("AnyRange(3..5)", &format!("{range:?}"));
    assert_eq!("AnyRange(3..)", &format!("{range_from:?}"));
    assert_eq!("AnyRange(..)", &format!("{range_full:?}"));
    assert_eq!("AnyRange(3..=5)", &format!("{range_inclusive:?}"));
    assert_eq!("AnyRange(..5)", &format!("{range_to:?}"));
    assert_eq!("AnyRange(..=5)", &format!("{range_to_inclusive:?}"));

    assert_eq!(AnyRange::Range(0..2), AnyRange::Range(0..2));
    assert!(AnyRange::Range(0..1) < AnyRange::Range(0..2));
    assert!(AnyRange::Range(0..2) < AnyRange::Range(1..2));
    assert_eq!(AnyRange::RangeFrom(0..), AnyRange::RangeFrom(0..));
    assert!(AnyRange::RangeFrom(0..) < AnyRange::RangeFrom(1..));
    assert_eq!(AnyRange::RangeFull::<usize>(..), AnyRange::RangeFull(..));
    assert_eq!(
        AnyRange::RangeInclusive(0..=2),
        AnyRange::RangeInclusive(0..=2)
    );
    assert!(AnyRange::RangeInclusive(0..=1) < AnyRange::RangeInclusive(0..=2));
    assert!(AnyRange::RangeInclusive(0..=2) < AnyRange::RangeInclusive(1..=2));
    assert_eq!(AnyRange::RangeTo(..0), AnyRange::RangeTo(..0));
    assert!(AnyRange::RangeTo(..0) < AnyRange::RangeTo(..1));
    assert_eq!(
        AnyRange::RangeToInclusive(..=0),
        AnyRange::RangeToInclusive(..=0)
    );
    assert!(AnyRange::RangeToInclusive(..=0) < AnyRange::RangeToInclusive(..=1));
    assert!(range < range_from);
    assert!(range_from < range_full);
    assert!(range_full < range_inclusive);
    assert!(range_inclusive < range_to);
    assert!(range_to < range_to_inclusive);
    assert_eq!("34", &"0123456789"[range.bounds()]);
    assert_eq!("3456789", &"0123456789"[range_from.bounds()]);
    assert_eq!("0123456789", &"0123456789"[range_full.bounds()]);
    assert_eq!("345", &"0123456789"[range_inclusive.bounds()]);
    assert_eq!("01234", &"0123456789"[range_to.bounds()]);
    assert_eq!("012345", &"0123456789"[range_to_inclusive.bounds()]);
}