tritons 0.0.3

Triton celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
use tritons::rendering::dust::DustScattering;
use tritons::rendering::exosphere::{CryovolcanicEndpoint, ExosphereEndpoint};
use tritons::rendering::materials::PbrMaterial;
use tritons::rendering::shaders::{ShaderEndpoint, UniformValue};

// ── dust ──

#[test]
fn dust_plume_opacity() {
    let d = DustScattering::impact_plume();
    assert!(d.opacity_at_height(0.0) > 0.0);
}

#[test]
fn opacity_decreases() {
    let d = DustScattering::impact_plume();
    assert!(d.opacity_at_height(5_000.0) < d.opacity_at_height(0.0));
}

// ── materials ──

#[test]
fn dark_terrain_material() {
    let m = PbrMaterial::dark_terrain();
    assert!(m.albedo[0] < 0.3);
}

#[test]
fn icy_bright_material() {
    let m = PbrMaterial::icy_bright();
    assert!(m.albedo[0] > 0.4);
}

#[test]
fn crater_floor_roughness() {
    let m = PbrMaterial::crater_floor();
    assert!(m.roughness > 0.8);
}

// ── exosphere ──

#[test]
fn exosphere_species_count() {
    let exo = ExosphereEndpoint::triton();
    assert_eq!(exo.species.len(), 4);
}

#[test]
fn exosphere_body_radius() {
    let exo = ExosphereEndpoint::triton();
    assert!((exo.body_radius_m - tritons::TRITON_RADIUS_M).abs() < 1.0);
}

#[test]
fn exosphere_n2_dominant() {
    let exo = ExosphereEndpoint::triton();
    let n2 = exo.species.iter().find(|s| s.symbol == "N2").unwrap();
    let ch4 = exo.species.iter().find(|s| s.symbol == "CH4").unwrap();
    assert!(n2.column_density_m2 > ch4.column_density_m2 * 1e3);
}

#[test]
fn exosphere_density_decreases() {
    let exo = ExosphereEndpoint::triton();
    let d0 = exo.density_at_altitude("N2", 0.0);
    let d50 = exo.density_at_altitude("N2", 50_000.0);
    assert!(d0 > d50);
}

#[test]
fn exosphere_total_column() {
    let exo = ExosphereEndpoint::triton();
    assert!(exo.total_column_density() > 1e19);
}

#[test]
fn exosphere_molar_mass_positive() {
    let exo = ExosphereEndpoint::triton();
    for sp in &exo.species {
        assert!(sp.molar_mass_kg_mol > 0.0);
    }
}

// ── cryovolcanic ──

#[test]
fn geyser_height() {
    let g = CryovolcanicEndpoint::triton_geyser();
    assert_eq!(g.geyser_height_m, 8_000.0);
}

#[test]
fn geyser_plume_density_at_surface() {
    let g = CryovolcanicEndpoint::triton_geyser();
    assert!(g.plume_density_at_height(0.0) > 0.0);
}

#[test]
fn geyser_plume_zero_above_top() {
    let g = CryovolcanicEndpoint::triton_geyser();
    assert_eq!(g.plume_density_at_height(9_000.0), 0.0);
}

#[test]
fn geyser_plume_decreases() {
    let g = CryovolcanicEndpoint::triton_geyser();
    assert!(g.plume_density_at_height(1_000.0) > g.plume_density_at_height(5_000.0));
}

// ── shaders ──

#[test]
fn terrain_shader_name() {
    let s = ShaderEndpoint::terrain();
    assert_eq!(s.name, "triton_terrain_pbr");
    assert!(s.uniforms.len() >= 6);
}

#[test]
fn terrain_shader_surface_temp() {
    let s = ShaderEndpoint::terrain();
    let temp = s
        .uniforms
        .iter()
        .find(|u| u.name == "u_surface_temp_k")
        .unwrap();
    match temp.value {
        UniformValue::Float(v) => assert!((v - 38.0).abs() < 1.0),
        _ => panic!("expected Float"),
    }
}

#[test]
fn geyser_shader_name() {
    let s = ShaderEndpoint::geyser();
    assert_eq!(s.name, "triton_geyser_plume");
    assert!(s.uniforms.len() >= 3);
}

#[test]
fn eclipse_shader_name() {
    let s = ShaderEndpoint::eclipse();
    assert_eq!(s.name, "triton_eclipse");
    assert!(s.uniforms.len() >= 3);
}