periodical 0.3.0

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

use jiff::SignedDuration;

use super::finite_bound_position::*;
use crate::intervals::meta::{BoundInclusivity, HasBoundInclusivity};
use crate::intervals::relative::{RelEndBound, RelStartBound};

#[test]
fn new() {
    let offset = SignedDuration::from_hours(1);
    let rel_finite_bound_position = RelFiniteBoundPos::new(offset);

    assert_eq!(rel_finite_bound_position.offset(), offset);
    assert_eq!(rel_finite_bound_position.inclusivity(), BoundInclusivity::Inclusive);
}

#[test]
fn new_with_inclusivity() {
    let offset = SignedDuration::from_hours(1);
    let rel_finite_bound_position = RelFiniteBoundPos::new_with_incl(offset, BoundInclusivity::Exclusive);

    assert_eq!(rel_finite_bound_position.offset(), offset);
    assert_eq!(rel_finite_bound_position.inclusivity(), BoundInclusivity::Exclusive);
}

#[test]
fn offset() {
    let offset = SignedDuration::from_hours(1);
    let interval = RelFiniteBoundPos::new_with_incl(offset, BoundInclusivity::Exclusive);

    assert_eq!(interval.offset(), offset);
}

#[test]
fn set_offset() {
    let mut rel_finite_bound_position = RelFiniteBoundPos::new(SignedDuration::from_hours(1));

    rel_finite_bound_position.set_offset(SignedDuration::from_hours(5));

    assert_eq!(rel_finite_bound_position.offset(), SignedDuration::from_hours(5));
}

#[test]
fn set_inclusivity() {
    let mut rel_finite_bound_position =
        RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive);

    rel_finite_bound_position.set_inclusivity(BoundInclusivity::Inclusive);

    assert_eq!(rel_finite_bound_position.inclusivity(), BoundInclusivity::Inclusive);
}

#[test]
fn to_start_bound() {
    assert_eq!(
        RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive).to_start_bound(),
        RelStartBound::Finite(
            RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive)
                .to_finite_start_bound()
        )
    );
}

#[test]
fn to_end_bound() {
    assert_eq!(
        RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive).to_end_bound(),
        RelEndBound::Finite(
            RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive)
                .to_finite_end_bound()
        )
    );
}

#[test]
fn inclusivity() {
    let inclusive = RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Inclusive);
    let exclusive = RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive);

    assert_eq!(inclusive.inclusivity(), BoundInclusivity::Inclusive);
    assert_eq!(exclusive.inclusivity(), BoundInclusivity::Exclusive);
}

#[test]
fn from_signed_duration() {
    assert_eq!(
        RelFiniteBoundPos::from(SignedDuration::from_hours(1)),
        RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Inclusive),
    );
}

#[test]
fn from_signed_duration_inclusivity_pair() {
    assert_eq!(
        RelFiniteBoundPos::from((SignedDuration::from_hours(1), BoundInclusivity::Exclusive)),
        RelFiniteBoundPos::new_with_incl(SignedDuration::from_hours(1), BoundInclusivity::Exclusive),
    );
}

#[test]
fn try_from_bound() {
    assert_eq!(
        RelFiniteBoundPos::try_from(Bound::Included(SignedDuration::from_hours(1))),
        Ok(RelFiniteBoundPos::new_with_incl(
            SignedDuration::from_hours(1),
            BoundInclusivity::Inclusive
        )),
    );
    assert_eq!(
        RelFiniteBoundPos::try_from(Bound::Excluded(SignedDuration::from_hours(1))),
        Ok(RelFiniteBoundPos::new_with_incl(
            SignedDuration::from_hours(1),
            BoundInclusivity::Exclusive
        )),
    );
    assert_eq!(
        RelFiniteBoundPos::try_from(Bound::Unbounded),
        Err(RelFiniteBoundPosTryFromBoundError),
    );
}