periodical 0.3.0

Management of all kinds of time intervals, use it to manage schedules, find overlaps, and more!
Documentation
use std::cmp::Ordering;

use super::finite_end_bound::*;
use crate::intervals::absolute::{AbsBound, AbsEndBound, AbsFiniteBound, AbsFiniteBoundPos};
use crate::intervals::meta::BoundInclusivity;
use crate::test_utils::date_timestamp;

#[test]
fn new() {
    let _ = AbsFiniteEndBound::new(AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1)));
}

#[test]
fn pos() {
    let pos = AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1));
    let finite_end = AbsFiniteEndBound::new(pos);

    assert_eq!(finite_end.pos(), pos);
}

#[test]
fn pos_mut() {
    let mut finite_end = AbsFiniteEndBound::new(AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1)));
    let _ = finite_end.pos_mut();
}

#[test]
fn opposite() {
    let time = date_timestamp(2026, 1, 1);

    assert_eq!(
        AbsFiniteBoundPos::new(time).to_finite_end_bound().opposite(),
        AbsFiniteBoundPos::new_with_incl(time, BoundInclusivity::Exclusive).to_finite_start_bound(),
    );
}

#[test]
fn to_end_bound() {
    let finite_end = AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1)).to_finite_end_bound();
    assert_eq!(finite_end.to_end_bound(), AbsEndBound::Finite(finite_end));
}

#[test]
fn to_finite_bound() {
    let finite_end = AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1)).to_finite_end_bound();
    assert_eq!(finite_end.to_finite_bound(), AbsFiniteBound::End(finite_end));
}

#[test]
fn to_bound() {
    let finite_end = AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1)).to_finite_end_bound();
    assert_eq!(finite_end.to_bound(), AbsBound::End(finite_end.to_end_bound()));
}

mod ord {
    use super::*;

    #[test]
    fn less() {
        assert_eq!(
            AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1))
                .to_finite_end_bound()
                .cmp(&AbsFiniteBoundPos::new(date_timestamp(2026, 1, 2)).to_finite_end_bound()),
            Ordering::Less
        );
    }

    mod equal {
        use super::*;

        #[test]
        fn inclusive_inclusive() {
            assert_eq!(
                AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Inclusive)
                    .to_finite_end_bound()
                    .cmp(
                        &AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Inclusive)
                            .to_finite_end_bound()
                    ),
                Ordering::Equal
            );
        }

        #[test]
        fn inclusive_exclusive() {
            assert_eq!(
                AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Inclusive)
                    .to_finite_end_bound()
                    .cmp(
                        &AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Exclusive)
                            .to_finite_end_bound()
                    ),
                Ordering::Greater
            );
        }

        #[test]
        fn exclusive_inclusive() {
            assert_eq!(
                AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Exclusive)
                    .to_finite_end_bound()
                    .cmp(
                        &AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Inclusive)
                            .to_finite_end_bound()
                    ),
                Ordering::Less
            );
        }

        #[test]
        fn exclusive_exclusive() {
            assert_eq!(
                AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Exclusive)
                    .to_finite_end_bound()
                    .cmp(
                        &AbsFiniteBoundPos::new_with_incl(date_timestamp(2026, 1, 1), BoundInclusivity::Exclusive)
                            .to_finite_end_bound()
                    ),
                Ordering::Equal
            );
        }
    }

    #[test]
    fn greater() {
        assert_eq!(
            AbsFiniteBoundPos::new(date_timestamp(2026, 1, 2))
                .to_finite_end_bound()
                .cmp(&AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1)).to_finite_end_bound()),
            Ordering::Greater
        );
    }
}

#[test]
fn from_finite_bound_pos() {
    let pos = AbsFiniteBoundPos::new(date_timestamp(2026, 1, 1));
    assert_eq!(AbsFiniteEndBound::from(pos), AbsFiniteEndBound::new(pos));
}