enceladuss 0.0.3

Enceladus celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
// ── CryovolcanicEndpoint ──

#[test]
fn enceladus_cryo_species_count() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    assert!(cryo.species.len() >= 7);
}

#[test]
fn enceladus_water_dominant() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    let h2o = cryo.species.iter().find(|s| s.symbol == "H2O").unwrap();
    assert!(h2o.mass_fraction > 0.9);
}

#[test]
fn enceladus_plume_height() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    assert!((cryo.plume_height_m - 500_000.0).abs() < 1.0);
}

#[test]
fn enceladus_plume_density_at_surface() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    assert!((cryo.plume_density_at_height(0.0) - cryo.total_mass_rate_kg_s).abs() < 0.01);
}

#[test]
fn enceladus_plume_density_zero_above() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    assert!(cryo.plume_density_at_height(600_000.0).abs() < 1e-9);
}

#[test]
fn enceladus_water_mass_rate() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    assert!(cryo.water_mass_rate_kg_s() > 150.0);
}

#[test]
fn enceladus_particle_escape_fraction() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    let frac = cryo.particle_escape_fraction();
    assert!(frac > 0.0 && frac <= 1.0);
}

#[test]
fn enceladus_molar_masses_positive() {
    let cryo = enceladuss::rendering::cryovolcanic::CryovolcanicEndpoint::enceladus();
    for sp in &cryo.species {
        assert!(
            sp.molar_mass_kg_mol > 0.0,
            "{} has zero molar mass",
            sp.name
        );
    }
}

// ── TigerStripeEndpoint ──

#[test]
fn tiger_stripe_count() {
    let ts = enceladuss::rendering::cryovolcanic::TigerStripeEndpoint::south_polar();
    assert_eq!(ts.stripe_count, 4);
}

#[test]
fn tiger_stripe_area() {
    let ts = enceladuss::rendering::cryovolcanic::TigerStripeEndpoint::south_polar();
    assert!(ts.total_active_area_m2() > 1e8);
}

#[test]
fn tiger_stripe_thermal_flux() {
    let ts = enceladuss::rendering::cryovolcanic::TigerStripeEndpoint::south_polar();
    assert!(ts.thermal_flux_w_m2() > 0.0);
}

#[test]
fn tiger_stripe_contrast() {
    let ts = enceladuss::rendering::cryovolcanic::TigerStripeEndpoint::south_polar();
    assert!(ts.temperature_contrast_k() > 100.0);
}

// ── ShaderEndpoint ──

#[test]
fn enceladus_terrain_shader() {
    let s = enceladuss::rendering::shaders::ShaderEndpoint::terrain();
    assert!(s.uniforms.len() >= 4);
    assert_eq!(s.name, "enceladus_terrain_pbr");
}

#[test]
fn enceladus_plume_shader() {
    let s = enceladuss::rendering::shaders::ShaderEndpoint::plume();
    assert!(s.uniforms.len() >= 3);
    assert_eq!(s.name, "enceladus_plume_scatter");
}

#[test]
fn enceladus_tiger_stripe_shader() {
    let s = enceladuss::rendering::shaders::ShaderEndpoint::tiger_stripe();
    assert!(s.uniforms.len() >= 3);
    assert_eq!(s.name, "enceladus_tiger_stripe_thermal");
}

// ── DustScattering (kept) ──

#[test]
fn plume_opacity_at_surface() {
    let d = enceladuss::rendering::dust::PlumeSpriteRenderer::ice_plume();
    assert!(d.opacity_at_height(0.0) > 0.0);
}

#[test]
fn opacity_decreases_with_height() {
    let d = enceladuss::rendering::dust::PlumeSpriteRenderer::ice_plume();
    assert!(d.opacity_at_height(100_000.0) < d.opacity_at_height(0.0));
}

// ── PbrMaterial (kept) ──

#[test]
fn pristine_ice_material_albedo() {
    let m = enceladuss::rendering::materials::PbrMaterial::pristine_ice();
    assert!(m.albedo[0] > 0.9);
    assert!(m.roughness < 0.3);
}

#[test]
fn tiger_stripe_material() {
    let m = enceladuss::rendering::materials::PbrMaterial::tiger_stripe();
    assert!(m.albedo[0] > 0.8);
}

#[test]
fn cratered_north_material() {
    let m = enceladuss::rendering::materials::PbrMaterial::cratered_north();
    assert!(m.roughness > 0.5);
}