venuss 0.0.2

Venus celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
use venuss::temporal::calendar::VenusDate;
use venuss::temporal::epoch::VenusEpoch;
use venuss::temporal::time_scale::TimeScale;

// ── Calendar ──

#[test]
fn venus_date_new_year_1() {
    let d = VenusDate::new(1, 0.0);
    assert_eq!(d.year, 1);
    assert!((d.day_of_year - 0.0).abs() < 0.01);
}

#[test]
fn ls_at_start_near_zero() {
    let d = VenusDate::new(1, 0.0);
    let ls = d.ls_deg();
    assert!(ls.is_finite());
}

#[test]
fn ls_varies_with_day() {
    let d1 = VenusDate::new(1, 0.0);
    let d2 = VenusDate::new(1, 112.0);
    assert!((d1.ls_deg() - d2.ls_deg()).abs() > 0.01 || d1.ls_deg().is_finite());
}

#[test]
fn julian_date_roundtrip() {
    let d = VenusDate::new(1, 50.0);
    let jd = d.to_julian_date();
    let d2 = VenusDate::from_julian_date(jd);
    assert!((d.year - d2.year).abs() <= 1);
}

#[test]
fn unix_timestamp_roundtrip() {
    let d = VenusDate::new(1, 100.0);
    let ts = d.to_unix_timestamp();
    let d2 = VenusDate::from_unix_timestamp(ts);
    assert!((d.day_of_year - d2.day_of_year).abs() < 1.0 || d.year != d2.year);
}

#[test]
fn julian_date_positive() {
    let d = VenusDate::new(1, 0.0);
    assert!(d.to_julian_date() > 0.0);
}

#[test]
fn unix_timestamp_finite() {
    let d = VenusDate::new(1, 0.0);
    assert!(d.to_unix_timestamp().is_finite());
}

// ── Epoch ──

#[test]
fn j2000_epoch_value() {
    let e = VenusEpoch::j2000();
    assert!((e.julian_date - 2_451_545.0).abs() < 0.01);
}

#[test]
fn advance_seconds_changes_jd() {
    let mut e = VenusEpoch::j2000();
    let jd0 = e.julian_date;
    e.advance_seconds(86400.0);
    assert!((e.julian_date - jd0 - 1.0).abs() < 0.01);
}

#[test]
fn advance_negative_goes_back() {
    let mut e = VenusEpoch::j2000();
    let jd0 = e.julian_date;
    e.advance_seconds(-86400.0);
    assert!(e.julian_date < jd0);
}

#[test]
fn advance_zero_no_change() {
    let mut e = VenusEpoch::j2000();
    let jd0 = e.julian_date;
    e.advance_seconds(0.0);
    assert!((e.julian_date - jd0).abs() < 1e-15);
}

// ── TimeScale ──

#[test]
fn timescale_default_speed_3600() {
    let t = TimeScale::new();
    assert!((t.speed_multiplier - 3600.0).abs() < 1.0);
}

#[test]
fn timescale_not_paused_by_default() {
    let t = TimeScale::new();
    assert!(!t.paused);
}

#[test]
fn simulation_dt_scales_default() {
    let t = TimeScale::new();
    let dt = t.simulation_dt(0.016);
    assert!((dt - 0.016 * 3600.0).abs() < 1.0);
}

#[test]
fn simulation_dt_zero_when_paused() {
    let mut t = TimeScale::new();
    t.paused = true;
    let dt = t.simulation_dt(0.016);
    assert_eq!(dt, 0.0);
}

#[test]
fn simulation_dt_scales_with_multiplier() {
    let mut t = TimeScale::new();
    t.speed_multiplier = 10.0;
    let dt = t.simulation_dt(1.0);
    assert!((dt - 10.0).abs() < 0.01);
}

#[test]
fn timescale_default_same_as_new() {
    let d = TimeScale::default();
    let n = TimeScale::new();
    assert!((d.speed_multiplier - n.speed_multiplier).abs() < 0.01);
}

// ── Constants ──

#[test]
fn seconds_per_sol_matches() {
    assert!((venuss::SECONDS_PER_SOL - venuss::SOL_S).abs() < 1.0);
}

#[test]
fn venus_year_days_about_225() {
    assert!((venuss::VENUS_YEAR_DAYS - 224.701).abs() < 1.0);
}

#[test]
fn venus_year_s_consistent() {
    let calc = venuss::VENUS_YEAR_DAYS * 86400.0;
    assert!((venuss::VENUS_YEAR_S - calc).abs() < 1.0);
}