aerocontext-core 0.1.0

Provider-neutral aeronautical-context model and the pluggable ContextProvider contract
Documentation
use chrono::NaiveDate;

use super::*;

fn date(year: i32, month: u32, day: u32) -> NaiveDate {
    NaiveDate::from_ymd_opt(year, month, day).expect("test date is valid")
}

#[test]
fn faa_nasr_cycle_spans_28_days() {
    let cycle = NavDataCycle::faa_nasr(date(2026, 5, 14)).expect("cycle builds");
    assert_eq!(cycle.authority, NavDataAuthority::FaaNasr);
    assert_eq!(cycle.effective_on, date(2026, 5, 14));
    assert_eq!(cycle.next_effective_on, date(2026, 6, 11));
    assert!(cycle.contains(date(2026, 5, 14)));
    assert!(cycle.contains(date(2026, 6, 10)));
    assert!(!cycle.contains(date(2026, 6, 11)));
}

#[test]
fn snapshot_resolves_identifiers_case_insensitively() {
    let snapshot = NavDataSnapshot::new(
        NavDataCycle::faa_nasr(date(2026, 5, 14)).expect("cycle builds"),
        vec![
            NavPoint::new(
                "KSFO",
                NavPointKind::Airport,
                GeoPoint {
                    lat: 37.6188056,
                    lon: -122.3754167,
                },
            )
            .with_name(Some("San Francisco International".to_owned())),
            NavPoint::new(
                "DUMBA",
                NavPointKind::Waypoint,
                GeoPoint {
                    lat: 37.4201667,
                    lon: -122.102,
                },
            ),
        ],
    );

    let airport = snapshot.resolve(" ksfo ").expect("airport resolves");
    assert_eq!(airport.kind, NavPointKind::Airport);
    assert_eq!(airport.name.as_deref(), Some("San Francisco International"));
    assert!(snapshot.resolve("missing").is_none());
    assert!(snapshot.contains(date(2026, 6, 1)));
}

#[test]
fn snapshot_round_trips_through_serde() {
    let snapshot = NavDataSnapshot::new(
        NavDataCycle::faa_nasr(date(2026, 5, 14)).expect("cycle builds"),
        vec![NavPoint::new(
            "OSI",
            NavPointKind::Navaid,
            GeoPoint {
                lat: 37.3925,
                lon: -122.281,
            },
        )],
    );

    let json = serde_json::to_string(&snapshot).expect("snapshot serializes");
    let decoded: NavDataSnapshot = serde_json::from_str(&json).expect("snapshot deserializes");
    assert_eq!(decoded, snapshot);
}