use planetsfactory::config::parameters::*;
use planetsfactory::engine::evolution::*;
use planetsfactory::engine::formation::*;
use planetsfactory::engine::generator::*;
use planetsfactory::engine::orbits::*;
use planetsfactory::observables::photometry::*;
use planetsfactory::observables::radial_velocity::*;
use planetsfactory::observables::transits::*;
use planetsfactory::presets::{kepler90, proxima_centauri, solar_system, trappist1};
#[test]
fn kepler_solver_circular() {
let ea = solve_kepler(1.0, 0.0, 1e-14);
assert!((ea - 1.0).abs() < 1e-12);
}
#[test]
fn kepler_solver_eccentric() {
let ea = solve_kepler(1.0, 0.5, 1e-14);
let check = ea - 0.5 * ea.sin();
assert!((check - 1.0).abs() < 1e-12);
}
#[test]
fn true_anomaly_at_periapsis() {
let nu = true_from_eccentric(0.0, 0.5);
assert!(nu.abs() < 1e-12);
}
#[test]
fn elements_to_state_earth_distance() {
let earth = OrbitalElements::from_au_deg(1.0, 0.0167, 0.0, 0.0, 0.0, 0.0);
let (pos, _vel) = elements_to_state(&earth, SOLAR_MASS);
let r = (pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]).sqrt();
assert!((r / AU - 1.0).abs() < 0.02);
}
#[test]
fn vis_viva_circular() {
let v = vis_viva(G * SOLAR_MASS, AU, AU);
let expected = (G * SOLAR_MASS / AU).sqrt();
assert!((v - expected).abs() / expected < 1e-10);
}
#[test]
fn hohmann_delta_v_positive() {
let (dv1, dv2) = hohmann_delta_v(G * SOLAR_MASS, AU, 1.524 * AU);
assert!(dv1 > 0.0 && dv2 > 0.0);
}
#[test]
fn orbital_period_consistent() {
let elem = OrbitalElements::from_au_deg(1.0, 0.0, 0.0, 0.0, 0.0, 0.0);
let p = elem.period(G * SOLAR_MASS);
assert!((p / YEAR - 1.0).abs() < 0.01);
}
#[test]
fn formation_isolation_mass_positive() {
let f = FormationModel::solar_like();
let m = f.isolation_mass(1.0);
assert!(m > 0.0);
}
#[test]
fn formation_snow_line_in_au_range() {
let f = FormationModel::solar_like();
assert!(f.snow_line_au > 2.0 && f.snow_line_au < 4.0);
}
#[test]
fn formation_critical_core_mass() {
let f = FormationModel::solar_like();
assert!(f.critical_core_mass() > 5.0 * EARTH_MASS);
}
#[test]
fn formation_gas_accretion_zero_below_critical() {
let f = FormationModel::solar_like();
assert!(f.runaway_gas_accretion_rate(EARTH_MASS) == 0.0);
}
#[test]
fn formation_gas_accretion_positive_above_critical() {
let f = FormationModel::solar_like();
assert!(f.runaway_gas_accretion_rate(20.0 * EARTH_MASS) > 0.0);
}
#[test]
fn evolution_cooling_luminosity_positive() {
let e = PlanetEvolution::new(JUPITER_MASS, JUPITER_RADIUS, 5.2 * AU, SOLAR_LUMINOSITY);
assert!(e.cooling_luminosity() > 0.0);
}
#[test]
fn evolution_xuv_loss_positive() {
let e = PlanetEvolution::new(EARTH_MASS, EARTH_RADIUS, AU, SOLAR_LUMINOSITY);
assert!(e.xuv_mass_loss_rate(1e-3) > 0.0);
}
#[test]
fn evolution_impact_erosion_zero_below_escape() {
let f = PlanetEvolution::impact_erosion_fraction(5e3, 1.1e4);
assert!(f == 0.0);
}
#[test]
fn generator_solar_like_system() {
let config = SystemGeneratorConfig::solar_like(8);
let planets = generate_system(&config);
assert!(planets.len() == 8);
}
#[test]
fn generator_m_dwarf_system() {
let config = SystemGeneratorConfig::m_dwarf(5);
let planets = generate_system(&config);
assert!(planets.len() == 5);
}
#[test]
fn generator_single_planet() {
let config = SystemGeneratorConfig::solar_like(1);
let planets = generate_system(&config);
assert!(planets.len() == 1);
}
#[test]
fn transit_depth_jupiter() {
let d = transit_depth(JUPITER_RADIUS, SOLAR_RADIUS);
assert!(d > 0.01 && d < 0.012);
}
#[test]
fn transit_probability_earth() {
let p = transit_probability(SOLAR_RADIUS, AU);
assert!(p > 0.004 && p < 0.005);
}
#[test]
fn rv_semi_amplitude_jupiter() {
let k = rv_semi_amplitude(
JUPITER_MASS,
SOLAR_MASS,
5.2 * AU,
0.048,
std::f64::consts::FRAC_PI_2,
);
assert!(k > 10.0 && k < 15.0);
}
#[test]
fn rv_minimum_mass_positive() {
let m = minimum_mass(0.09, SOLAR_MASS, YEAR, 0.017);
assert!(m > 0.0);
}
#[test]
fn photometry_flux_ratio_small() {
let r = planet_flux_ratio(JUPITER_RADIUS, 5.2 * AU, 0.34);
assert!(r > 0.0 && r < 1e-6);
}
#[test]
fn preset_solar_system_eight_planets() {
assert!(solar_system::all().len() == 8);
}
#[test]
fn preset_solar_system_inner_four() {
assert!(solar_system::inner().len() == 4);
}
#[test]
fn preset_solar_system_outer_four() {
assert!(solar_system::outer().len() == 4);
}
#[test]
fn preset_trappist1_seven_planets() {
assert!(trappist1::all().len() == 7);
}
#[test]
fn preset_kepler90_eight_planets() {
assert!(kepler90::all().len() == 8);
}
#[test]
fn preset_proxima_two_planets() {
assert!(proxima_centauri::all().len() == 2);
}