use crate::astro::apparent::CorrectionPolicy;
use crate::event::altitude::{CrossingDirection, SearchOpts};
use crate::qtty::*;
use crate::time::{Interval, ModifiedJulianDate};
pub use crate::event::altitude::CrossingDirection as AzimuthCrossingDirection;
#[derive(Debug, Clone, Copy)]
pub struct AzimuthCrossingEvent {
pub mjd: ModifiedJulianDate,
pub direction: CrossingDirection,
}
impl std::fmt::Display for AzimuthCrossingEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Azimuth {} at {}", self.direction, self.mjd)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AzimuthExtremumKind {
Max,
Min,
}
impl std::fmt::Display for AzimuthExtremumKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Max => write!(f, "Max Azimuth"),
Self::Min => write!(f, "Min Azimuth"),
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct AzimuthExtremum {
pub mjd: ModifiedJulianDate,
pub azimuth: Degrees,
pub kind: AzimuthExtremumKind,
}
impl std::fmt::Display for AzimuthExtremum {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} at {} (az: {})", self.kind, self.mjd, self.azimuth)
}
}
#[derive(Debug, Clone, Copy)]
pub struct AzimuthQuery {
pub observer: crate::coordinates::centers::Geodetic<crate::coordinates::frames::ECEF>,
pub window: Interval<ModifiedJulianDate>,
pub min_azimuth: Degrees,
pub max_azimuth: Degrees,
pub opts: SearchOpts,
pub correction_policy: CorrectionPolicy,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn azimuth_crossing_event_display() {
let event = AzimuthCrossingEvent {
mjd: ModifiedJulianDate::new(60_000.0),
direction: CrossingDirection::Setting,
};
let text = event.to_string();
assert!(text.contains("Azimuth"));
assert!(text.contains("Setting"));
}
#[test]
fn azimuth_extremum_kind_display() {
assert_eq!(AzimuthExtremumKind::Max.to_string(), "Max Azimuth");
assert_eq!(AzimuthExtremumKind::Min.to_string(), "Min Azimuth");
}
#[test]
fn azimuth_extremum_display_includes_kind_and_azimuth() {
let event = AzimuthExtremum {
mjd: ModifiedJulianDate::new(60_002.0),
azimuth: Degrees::new(180.0),
kind: AzimuthExtremumKind::Min,
};
let text = event.to_string();
assert!(text.contains("Min Azimuth"));
assert!(text.contains("180"));
}
}