use crate::astro::apparent::CorrectionPolicy;
use crate::qtty::*;
use crate::time::{Interval, ModifiedJulianDate};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CrossingDirection {
Rising,
Setting,
}
impl std::fmt::Display for CrossingDirection {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Rising => write!(f, "Rising"),
Self::Setting => write!(f, "Setting"),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct CrossingEvent {
pub mjd: ModifiedJulianDate,
pub direction: CrossingDirection,
}
impl std::fmt::Display for CrossingEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} at {}", self.direction, self.mjd)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CulminationKind {
Max,
Min,
}
impl std::fmt::Display for CulminationKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Max => write!(f, "Upper Transit"),
Self::Min => write!(f, "Lower Transit"),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct CulminationEvent {
pub mjd: ModifiedJulianDate,
pub altitude: Degrees,
pub kind: CulminationKind,
}
impl std::fmt::Display for CulminationEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} at {} (alt: {})", self.kind, self.mjd, self.altitude)
}
}
#[derive(Debug, Clone, Copy)]
pub struct AltitudeQuery {
pub observer: crate::coordinates::centers::Geodetic<crate::coordinates::frames::ECEF>,
pub window: Interval<ModifiedJulianDate>,
pub min_altitude: Degrees,
pub max_altitude: Degrees,
pub correction_policy: CorrectionPolicy,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::qtty::Degrees;
#[test]
fn crossing_direction_display() {
assert_eq!(CrossingDirection::Rising.to_string(), "Rising");
assert_eq!(CrossingDirection::Setting.to_string(), "Setting");
}
#[test]
fn crossing_event_display_includes_direction_and_mjd() {
let event = CrossingEvent {
mjd: ModifiedJulianDate::new(60_000.0),
direction: CrossingDirection::Rising,
};
let text = event.to_string();
assert!(text.contains("Rising"));
assert!(text.contains("60000"));
}
#[test]
fn culmination_kind_display() {
assert_eq!(CulminationKind::Max.to_string(), "Upper Transit");
assert_eq!(CulminationKind::Min.to_string(), "Lower Transit");
}
#[test]
fn culmination_event_display_includes_kind_altitude_and_mjd() {
let event = CulminationEvent {
mjd: ModifiedJulianDate::new(60_001.5),
altitude: Degrees::new(45.0),
kind: CulminationKind::Max,
};
let text = event.to_string();
assert!(text.contains("Upper Transit"));
assert!(text.contains("45"));
assert!(text.contains("60001.5"));
}
}