use std::error::Error;
use jiff::{SignedDuration, Zoned};
use super::intersect::*;
use crate::intervals::absolute::{AbsBoundPair, AbsFiniteBoundPos, AbsStartBound};
use crate::intervals::meta::BoundInclusivity;
use crate::intervals::relative::{RelBoundPair, RelFiniteBoundPos, RelStartBound};
use crate::iter::intervals::bounds::{AbsBoundsIteratorDispatcher, RelBoundsIteratorDispatcher};
use crate::iter::intervals::layered_bounds::{
LayeredBoundsState,
LayeredBoundsStateChangeAtAbsBound,
LayeredBoundsStateChangeAtRelBound,
};
mod abs {
use super::*;
#[test]
fn create() -> Result<(), Box<dyn Error>> {
let data = [
LayeredBoundsStateChangeAtAbsBound::new(
LayeredBoundsState::NoLayers,
LayeredBoundsState::FirstLayer,
None,
Some(AbsStartBound::InfinitePast),
),
LayeredBoundsStateChangeAtAbsBound::new(
LayeredBoundsState::FirstLayer,
LayeredBoundsState::SecondLayer,
Some(
AbsFiniteBoundPos::new("2025-01-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
Some(
AbsFiniteBoundPos::new_with_incl(
"2025-01-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp(),
BoundInclusivity::Exclusive,
)
.to_start_bound(),
),
),
LayeredBoundsStateChangeAtAbsBound::new(
LayeredBoundsState::SecondLayer,
LayeredBoundsState::NoLayers,
Some(
AbsFiniteBoundPos::new_with_incl(
"2025-05-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp(),
BoundInclusivity::Exclusive,
)
.to_end_bound(),
),
Some(
AbsFiniteBoundPos::new("2025-05-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
),
),
];
let _ = LayeredAbsBoundsIntersection::new(data.into_iter());
Ok(())
}
#[test]
fn run() -> Result<(), Box<dyn Error>> {
let first_layer_data = [
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new("2025-01-05 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-11 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new("2025-01-15 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-20 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new_with_incl(
"2025-02-10 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp(),
BoundInclusivity::Exclusive,
)
.to_end_bound(),
),
];
let second_layer_data = [
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-05 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new("2025-01-10 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-20 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new("2025-01-22 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
AbsBoundPair::new(
AbsFiniteBoundPos::new_with_incl(
"2025-02-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp(),
BoundInclusivity::Exclusive,
)
.to_start_bound(),
AbsFiniteBoundPos::new("2025-02-15 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
];
assert_eq!(
first_layer_data
.abs_bounds_iter()
.unite_bounds()
.layer(second_layer_data.abs_bounds_iter().unite_bounds())
.abs_intersect_layered()
.collect::<Vec<_>>(),
vec![
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-05 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new("2025-01-05 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
AbsBoundPair::new(
AbsFiniteBoundPos::new("2025-01-20 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_start_bound(),
AbsFiniteBoundPos::new("2025-01-22 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp())
.to_end_bound(),
),
AbsBoundPair::new(
AbsFiniteBoundPos::new_with_incl(
"2025-02-01 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp(),
BoundInclusivity::Exclusive,
)
.to_start_bound(),
AbsFiniteBoundPos::new_with_incl(
"2025-02-10 00:00:00[Europe/Oslo]".parse::<Zoned>()?.timestamp(),
BoundInclusivity::Exclusive,
)
.to_end_bound(),
),
],
);
Ok(())
}
}
mod rel {
use super::*;
#[test]
fn create() {
let data = [
LayeredBoundsStateChangeAtRelBound::new(
LayeredBoundsState::NoLayers,
LayeredBoundsState::FirstLayer,
None,
Some(RelStartBound::InfinitePast),
),
LayeredBoundsStateChangeAtRelBound::new(
LayeredBoundsState::FirstLayer,
LayeredBoundsState::SecondLayer,
Some(RelFiniteBoundPos::new(SignedDuration::from_hours(101)).to_end_bound()),
Some(
RelFiniteBoundPos::new_with_incl(
SignedDuration::from_hours(101),
BoundInclusivity::Exclusive,
)
.to_start_bound(),
),
),
LayeredBoundsStateChangeAtRelBound::new(
LayeredBoundsState::SecondLayer,
LayeredBoundsState::NoLayers,
Some(
RelFiniteBoundPos::new_with_incl(
SignedDuration::from_hours(501),
BoundInclusivity::Exclusive,
)
.to_end_bound(),
),
Some(RelFiniteBoundPos::new(SignedDuration::from_hours(501)).to_start_bound()),
),
];
let _ = LayeredRelBoundsIntersection::new(data.into_iter());
}
#[test]
fn run() {
let first_layer_data = [
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(101)).to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(105)).to_end_bound(),
),
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(111)).to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(115)).to_end_bound(),
),
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(120)).to_start_bound(),
RelFiniteBoundPos::new_with_incl(
SignedDuration::from_hours(210),
BoundInclusivity::Exclusive,
)
.to_end_bound(),
),
];
let second_layer_data = [
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(105)).to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(110)).to_end_bound(),
),
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(120)).to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(122)).to_end_bound(),
),
RelBoundPair::new(
RelFiniteBoundPos::new_with_incl(
SignedDuration::from_hours(201),
BoundInclusivity::Exclusive,
)
.to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(215)).to_end_bound(),
),
];
assert_eq!(
first_layer_data
.rel_bounds_iter()
.unite_bounds()
.layer(second_layer_data.rel_bounds_iter().unite_bounds())
.rel_intersect_layered()
.collect::<Vec<_>>(),
vec![
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(105)).to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(105)).to_end_bound(),
),
RelBoundPair::new(
RelFiniteBoundPos::new(SignedDuration::from_hours(120)).to_start_bound(),
RelFiniteBoundPos::new(SignedDuration::from_hours(122)).to_end_bound(),
),
RelBoundPair::new(
RelFiniteBoundPos::new_with_incl(
SignedDuration::from_hours(201),
BoundInclusivity::Exclusive,
)
.to_start_bound(),
RelFiniteBoundPos::new_with_incl(
SignedDuration::from_hours(210),
BoundInclusivity::Exclusive,
)
.to_end_bound(),
),
],
);
}
}