planetsfactory 0.0.1

Planet factory — classify, build and catalogue planets for any star system: Solar System, TRAPPIST-1, Kepler-90, Proxima Centauri, or fully custom worlds.
Documentation
use planetsfactory::config::parameters::*;
use planetsfactory::types::gas_giant::*;
use planetsfactory::types::ice_giant::*;
use planetsfactory::types::terrestrial::*;

#[test]
fn terrestrial_earth_mass_is_one() {
    let e = TerrestrialPlanet::earth();
    assert!((e.mass_earth() - 1.0).abs() < 0.01);
}

#[test]
fn terrestrial_mercury_mass_less_than_earth() {
    let m = TerrestrialPlanet::mercury();
    let e = TerrestrialPlanet::earth();
    assert!(m.mass < e.mass);
}

#[test]
fn terrestrial_venus_mass_close_to_earth() {
    let v = TerrestrialPlanet::venus();
    assert!(v.mass_earth() > 0.8 && v.mass_earth() < 0.9);
}

#[test]
fn terrestrial_mars_surface_gravity_lower() {
    let m = TerrestrialPlanet::mars();
    let e = TerrestrialPlanet::earth();
    assert!(m.surface_gravity() < e.surface_gravity());
}

#[test]
fn terrestrial_earth_escape_velocity() {
    let e = TerrestrialPlanet::earth();
    let v = e.escape_velocity();
    assert!(v > 1.1e4 && v < 1.2e4);
}

#[test]
fn terrestrial_earth_density() {
    let e = TerrestrialPlanet::earth();
    let rho = e.mean_density();
    assert!(rho > 5400.0 && rho < 5600.0);
}

#[test]
fn terrestrial_core_radius_positive() {
    let e = TerrestrialPlanet::earth();
    assert!(e.core_radius() > 0.0 && e.core_radius() < e.radius);
}

#[test]
fn terrestrial_magnetic_moment_positive() {
    let e = TerrestrialPlanet::earth();
    assert!(e.magnetic_moment_estimate() > 0.0);
}

#[test]
fn terrestrial_period_earth_one_year() {
    let e = TerrestrialPlanet::earth();
    let p = e.period(SOLAR_MASS);
    assert!((p / YEAR - 1.0).abs() < 0.01);
}

#[test]
fn gas_giant_jupiter_mass_is_one() {
    let j = GasGiant::jupiter();
    assert!((j.mass_jupiter() - 1.0).abs() < 0.01);
}

#[test]
fn gas_giant_saturn_lighter_than_jupiter() {
    let j = GasGiant::jupiter();
    let s = GasGiant::saturn();
    assert!(s.mass < j.mass);
}

#[test]
fn gas_giant_jupiter_surface_gravity() {
    let j = GasGiant::jupiter();
    let g = j.surface_gravity();
    assert!(g > 23.0 && g < 26.0);
}

#[test]
fn gas_giant_jupiter_density_low() {
    let j = GasGiant::jupiter();
    let rho = j.mean_density();
    assert!(rho > 1200.0 && rho < 1400.0);
}

#[test]
fn gas_giant_oblateness_positive() {
    let j = GasGiant::jupiter();
    assert!(j.oblateness() > 0.0);
}

#[test]
fn gas_giant_kh_timescale_positive() {
    let j = GasGiant::jupiter();
    assert!(j.kelvin_helmholtz_timescale() > 0.0);
}

#[test]
fn gas_giant_ring_roche_limit() {
    let s = GasGiant::saturn();
    let rl = s.ring_roche_limit(900.0);
    assert!(rl > s.radius);
}

#[test]
fn gas_giant_hot_jupiter_inflated() {
    let hj = GasGiant::hot_jupiter("51 Peg b", "51 Peg", 0.47, 0.052);
    let cold = GasGiant::jupiter();
    assert!(hj.radius_jupiter() > cold.mass_jupiter() * 0.1);
}

#[test]
fn ice_giant_uranus_mass_in_range() {
    let u = IceGiant::uranus();
    assert!(u.mass_earth() > 14.0 && u.mass_earth() < 15.0);
}

#[test]
fn ice_giant_neptune_mass_in_range() {
    let n = IceGiant::neptune();
    assert!(n.mass_earth() > 17.0 && n.mass_earth() < 18.0);
}

#[test]
fn ice_giant_neptune_denser_than_uranus() {
    let u = IceGiant::uranus();
    let n = IceGiant::neptune();
    assert!(n.mean_density() > u.mean_density());
}

#[test]
fn ice_giant_ice_mass_fraction_reasonable() {
    let u = IceGiant::uranus();
    assert!(u.ice_mass_fraction > 0.5 && u.ice_mass_fraction < 0.8);
}

#[test]
fn ice_giant_wind_speed_positive() {
    let n = IceGiant::neptune();
    assert!(n.wind_speed_estimate() > 0.0);
}

#[test]
fn ice_giant_internal_heat_neptune_higher() {
    let n = IceGiant::neptune();
    let u = IceGiant::uranus();
    assert!(n.internal_heat_ratio() > u.internal_heat_ratio());
}

#[test]
fn mass_ordering_correct() {
    let m = TerrestrialPlanet::mercury();
    let e = TerrestrialPlanet::earth();
    let u = IceGiant::uranus();
    let s = GasGiant::saturn();
    let j = GasGiant::jupiter();
    assert!(m.mass < e.mass);
    assert!(e.mass < u.mass);
    assert!(u.mass < s.mass);
    assert!(s.mass < j.mass);
}