use planetsfactory::config::parameters::*;
use planetsfactory::engine::orbits::OrbitalElements;
use planetsfactory::types::gas_giant::*;
use planetsfactory::types::ice_giant::*;
use planetsfactory::types::lava_world::*;
use planetsfactory::types::ocean_world::*;
use planetsfactory::types::rogue::*;
use planetsfactory::types::sub_neptune::*;
use planetsfactory::types::super_earth::*;
use planetsfactory::types::terrestrial::*;
fn orbit_1au() -> OrbitalElements {
OrbitalElements::from_au_deg(1.0, 0.017, 0.0, 0.0, 0.0, 0.0)
}
fn orbit_au(a: f64) -> OrbitalElements {
OrbitalElements::from_au_deg(a, 0.02, 1.0, 0.0, 0.0, 0.0)
}
#[test]
fn terrestrial_mass_earth_units() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
assert!((t.mass_earth() - 1.0).abs() < 0.01);
}
#[test]
fn terrestrial_surface_gravity_positive() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
let g = t.surface_gravity();
assert!(g > 9.0 && g < 10.5);
}
#[test]
fn terrestrial_escape_velocity() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
let v = t.escape_velocity();
assert!(v > 1.1e4 && v < 1.2e4);
}
#[test]
fn terrestrial_density() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
let rho = t.mean_density();
assert!(rho > 5400.0 && rho < 5600.0);
}
#[test]
fn terrestrial_core_radius_positive() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
assert!(t.core_radius() > 0.0 && t.core_radius() < t.radius);
}
#[test]
fn terrestrial_magnetic_moment_positive() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
assert!(t.magnetic_moment_estimate() > 0.0);
}
#[test]
fn terrestrial_period_one_year() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
let p = t.period(SOLAR_MASS);
assert!((p / YEAR - 1.0).abs() < 0.01);
}
#[test]
fn terrestrial_with_surface_albedo() {
let t = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
)
.with_surface(0.77, 0.32);
assert!((t.albedo - 0.77).abs() < 1e-10);
}
#[test]
fn gas_giant_mass_jupiter_units() {
let g = GasGiant::new(
"G1",
"Star",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
orbit_au(5.2),
);
assert!((g.mass_jupiter() - 1.0).abs() < 0.01);
}
#[test]
fn gas_giant_surface_gravity() {
let g = GasGiant::new(
"G1",
"Star",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
orbit_au(5.2),
);
let sg = g.surface_gravity();
assert!(sg > 23.0 && sg < 26.0);
}
#[test]
fn gas_giant_density_low() {
let g = GasGiant::new(
"G1",
"Star",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
orbit_au(5.2),
);
let rho = g.mean_density();
assert!(rho > 1200.0 && rho < 1400.0);
}
#[test]
fn gas_giant_oblateness_positive() {
let g = GasGiant::new(
"G1",
"Star",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
orbit_au(5.2),
);
assert!(g.oblateness() > 0.0);
}
#[test]
fn gas_giant_kh_timescale_positive() {
let g = GasGiant::new(
"G1",
"Star",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
orbit_au(5.2),
);
assert!(g.kelvin_helmholtz_timescale() > 0.0);
}
#[test]
fn gas_giant_ring_roche_limit() {
let g = GasGiant::new(
"G1",
"Star",
5.683_4e26,
6.026_8e7,
1.63e-2,
0.47,
orbit_au(9.5),
)
.with_details(0.34, 6.63e7, 1.365e8, 0.45);
let rl = g.ring_roche_limit(900.0);
assert!(rl > g.radius);
}
#[test]
fn gas_giant_with_details_metallic_h() {
let g = GasGiant::new(
"HJ",
"Star",
JUPITER_MASS,
JUPITER_RADIUS * 1.3,
1e-2,
0.0,
orbit_au(0.05),
)
.with_details(0.05, 0.0, 0.0, 0.85);
assert!(g.metallic_hydrogen_pressure() > 1e11);
}
#[test]
fn ice_giant_mass_in_range() {
let ig = IceGiant::new(
"I1",
"Star",
14.5 * EARTH_MASS,
2.56e7,
3.3e-3,
1.71,
orbit_au(19.2),
);
assert!(ig.mass_earth() > 14.0 && ig.mass_earth() < 15.0);
}
#[test]
fn ice_giant_ice_fraction_reasonable() {
let ig = IceGiant::new(
"I1",
"Star",
14.5 * EARTH_MASS,
2.56e7,
3.3e-3,
1.71,
orbit_au(19.2),
)
.with_details(0.30, 0.60, 1.03);
assert!(ig.ice_mass_fraction > 0.5 && ig.ice_mass_fraction < 0.8);
}
#[test]
fn ice_giant_wind_speed_positive() {
let ig = IceGiant::new(
"I1",
"Star",
17.1 * EARTH_MASS,
2.48e7,
3.4e-3,
0.49,
orbit_au(30.1),
);
assert!(ig.wind_speed_estimate() > 0.0);
}
#[test]
fn ice_giant_internal_heat_depends_on_mass() {
let light = IceGiant::new(
"U",
"Star",
14.5 * EARTH_MASS,
2.56e7,
3.3e-3,
1.71,
orbit_au(19.2),
);
let heavy = IceGiant::new(
"N",
"Star",
17.1 * EARTH_MASS,
2.48e7,
3.4e-3,
0.49,
orbit_au(30.1),
);
assert!(heavy.internal_heat_ratio() > light.internal_heat_ratio());
}
#[test]
fn super_earth_mass_in_range() {
let se = SuperEarth::new(
"SE1",
"Star",
5.0 * EARTH_MASS,
radius_from_mass(5.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(0.8),
);
assert!(se.mass_earth() > 4.9 && se.mass_earth() < 5.1);
}
#[test]
fn super_earth_gravity_higher_than_earth() {
let se = SuperEarth::new(
"SE1",
"Star",
5.0 * EARTH_MASS,
radius_from_mass(5.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(0.8),
);
let te = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au(),
);
assert!(se.surface_gravity() > te.surface_gravity());
}
#[test]
fn super_earth_plate_tectonics() {
let se = SuperEarth::new(
"SE1",
"Star",
3.0 * EARTH_MASS,
radius_from_mass(3.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(0.8),
);
let likelihood = se.plate_tectonics_likelihood();
assert!(likelihood > 0.0 && likelihood <= 1.0);
}
#[test]
fn super_earth_surface_pressure_positive() {
let se = SuperEarth::new(
"SE1",
"Star",
5.0 * EARTH_MASS,
radius_from_mass(5.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(0.8),
);
assert!(se.surface_pressure_estimate() > 0.0);
}
#[test]
fn sub_neptune_envelope_mass() {
let sn = SubNeptune::new(
"SN1",
"Star",
8.0 * EARTH_MASS,
radius_from_mass(8.0 * EARTH_MASS),
2e-3,
0.2,
orbit_au(0.5),
)
.with_envelope(0.30, 0.05, 0.50);
assert!(sn.envelope_mass() > 0.0);
assert!(sn.envelope_mass() < sn.mass);
}
#[test]
fn sub_neptune_core_radius_less_than_total() {
let sn = SubNeptune::new(
"SN1",
"Star",
8.0 * EARTH_MASS,
radius_from_mass(8.0 * EARTH_MASS),
2e-3,
0.2,
orbit_au(0.5),
);
assert!(sn.core_radius_estimate() < sn.radius);
}
#[test]
fn sub_neptune_photoevaporation_timescale_positive() {
let sn = SubNeptune::new(
"SN1",
"Star",
8.0 * EARTH_MASS,
radius_from_mass(8.0 * EARTH_MASS),
2e-3,
0.2,
orbit_au(0.5),
);
let tau = sn.photoevaporation_timescale(1e-3);
assert!(tau > 0.0);
}
#[test]
fn sub_neptune_radius_gap_side() {
let small = SubNeptune::new(
"SN1",
"Star",
3.0 * EARTH_MASS,
1.5 * EARTH_RADIUS,
2e-3,
0.2,
orbit_au(0.3),
);
let big = SubNeptune::new(
"SN2",
"Star",
12.0 * EARTH_MASS,
3.0 * EARTH_RADIUS,
2e-3,
0.2,
orbit_au(0.5),
);
assert_eq!(small.radius_gap_side(), "below");
assert_eq!(big.radius_gap_side(), "above");
}
#[test]
fn lava_world_high_temperature() {
let lw = LavaWorld::new(
"LW1",
"Star",
2.0 * EARTH_MASS,
radius_from_mass(2.0 * EARTH_MASS),
1e-3,
0.0,
orbit_au(0.02),
);
assert!(lw.dayside_temperature > 2000.0);
}
#[test]
fn lava_world_nightside_cooler() {
let lw = LavaWorld::new(
"LW1",
"Star",
2.0 * EARTH_MASS,
radius_from_mass(2.0 * EARTH_MASS),
1e-3,
0.0,
orbit_au(0.02),
);
assert!(lw.nightside_temperature() < lw.dayside_temperature);
}
#[test]
fn lava_world_thermal_emission_positive() {
let lw = LavaWorld::new(
"LW1",
"Star",
2.0 * EARTH_MASS,
radius_from_mass(2.0 * EARTH_MASS),
1e-3,
0.0,
orbit_au(0.02),
);
assert!(lw.thermal_emission() > 0.0);
}
#[test]
fn lava_world_tidal_heating() {
let lw = LavaWorld::new(
"LW1",
"Star",
2.0 * EARTH_MASS,
radius_from_mass(2.0 * EARTH_MASS),
1e-3,
0.0,
OrbitalElements::from_au_deg(0.02, 0.05, 0.0, 0.0, 0.0, 0.0),
)
.with_surface(0.10, 2500.0, 200.0e3);
let h = lw.tidal_heating(SOLAR_MASS);
assert!(h > 0.0);
}
#[test]
fn ocean_world_water_mass_positive() {
let ow = OceanWorld::new(
"OW1",
"Star",
3.0 * EARTH_MASS,
radius_from_mass(3.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(1.2),
)
.with_hydrosphere(0.35, 0.10, 0.0);
assert!(ow.water_mass() > 0.0);
assert!(ow.water_mass() < ow.mass);
}
#[test]
fn ocean_world_depth_positive() {
let ow = OceanWorld::new(
"OW1",
"Star",
3.0 * EARTH_MASS,
radius_from_mass(3.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(1.2),
);
assert!(ow.ocean_depth() > 0.0);
}
#[test]
fn ocean_world_high_pressure_ice_for_deep_water() {
let ow = OceanWorld::new(
"OW1",
"Star",
5.0 * EARTH_MASS,
radius_from_mass(5.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(1.2),
)
.with_hydrosphere(0.35, 0.50, 0.0);
assert!(ow.high_pressure_ice());
}
#[test]
fn rogue_planet_surface_temperature_positive() {
let rp = RoguePlanet::new("R1", EARTH_MASS, EARTH_RADIUS, 4.5e9 * YEAR);
assert!(rp.surface_temperature() > 0.0);
}
#[test]
fn rogue_planet_radiogenic_heating_decreases_with_age() {
let young = RoguePlanet::new("R1", EARTH_MASS, EARTH_RADIUS, 1e9 * YEAR);
let old = RoguePlanet::new("R2", EARTH_MASS, EARTH_RADIUS, 8e9 * YEAR);
assert!(young.radiogenic_heating() > old.radiogenic_heating());
}
#[test]
fn rogue_planet_kinetic_energy_positive() {
let rp = RoguePlanet::new("R1", EARTH_MASS, EARTH_RADIUS, 4.5e9 * YEAR);
assert!(rp.kinetic_energy() > 0.0);
}
#[test]
fn rogue_planet_capture_velocity() {
let v = RoguePlanet::capture_velocity(SOLAR_MASS, AU);
assert!(v > 4.0e4);
}
#[test]
fn mass_ordering_across_types() {
let t = TerrestrialPlanet::new(
"T",
"S",
0.5 * EARTH_MASS,
radius_from_mass(0.5 * EARTH_MASS),
1e-3,
0.3,
orbit_au(1.0),
);
let se = SuperEarth::new(
"SE",
"S",
5.0 * EARTH_MASS,
radius_from_mass(5.0 * EARTH_MASS),
1e-3,
0.3,
orbit_au(0.8),
);
let sn = SubNeptune::new(
"SN",
"S",
15.0 * EARTH_MASS,
radius_from_mass(15.0 * EARTH_MASS),
2e-3,
0.2,
orbit_au(0.5),
);
let ig = IceGiant::new(
"IG",
"S",
30.0 * EARTH_MASS,
2.5e7,
3.3e-3,
0.5,
orbit_au(20.0),
);
let gg = GasGiant::new(
"GG",
"S",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
orbit_au(5.2),
);
assert!(t.mass < se.mass);
assert!(se.mass < sn.mass);
assert!(sn.mass < ig.mass);
assert!(ig.mass < gg.mass);
}