venuss 0.0.2

Venus celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
use venuss::rendering::atmosphere_scattering::VenusAtmosphereParams;
use venuss::rendering::clouds::{cloud_base_altitude_m, cloud_top_altitude_m};
use venuss::rendering::materials::{
    basaltic_plain, tessera_highland, volcanic_flow, weathered_plain,
};
use venuss::rendering::shaders::terrain;
use venuss::rendering::surface_haze::near_surface_visibility_km;

// ── Atmosphere Scattering ──

#[test]
fn sky_color_noon_finite() {
    let p = VenusAtmosphereParams::default();
    let c = p.sky_color(45.0);
    assert!(c[0].is_finite() && c[1].is_finite() && c[2].is_finite());
}

#[test]
fn sky_color_components_non_negative() {
    let p = VenusAtmosphereParams::default();
    let c = p.sky_color(45.0);
    assert!(c[0] >= 0.0 && c[1] >= 0.0 && c[2] >= 0.0);
}

#[test]
fn sky_color_sunset_different() {
    let p = VenusAtmosphereParams::default();
    let noon = p.sky_color(90.0);
    let sunset = p.sky_color(5.0);
    let diff =
        (noon[0] - sunset[0]).abs() + (noon[1] - sunset[1]).abs() + (noon[2] - sunset[2]).abs();
    assert!(diff > 0.0 || noon[0] >= 0.0);
}

#[test]
fn direct_transmission_noon_positive() {
    let p = VenusAtmosphereParams::default();
    assert!(p.direct_transmission(45.0) >= 0.0);
}

#[test]
fn direct_transmission_higher_at_zenith() {
    let p = VenusAtmosphereParams::default();
    let t_high = p.direct_transmission(90.0);
    let t_low = p.direct_transmission(5.0);
    assert!(t_high >= t_low);
}

#[test]
fn atmosphere_params_cloud_depth_positive() {
    let p = VenusAtmosphereParams::default();
    assert!(p.cloud_optical_depth > 0.0);
}

// ── Clouds ──

#[test]
fn cloud_top_above_base() {
    assert!(cloud_top_altitude_m() > cloud_base_altitude_m());
}

#[test]
fn cloud_base_in_atmosphere() {
    assert!(cloud_base_altitude_m() > 30_000.0);
}

#[test]
fn cloud_top_below_100km() {
    assert!(cloud_top_altitude_m() < 100_000.0);
}

// ── Materials ──

#[test]
fn basaltic_plain_albedo_valid() {
    let m = basaltic_plain();
    for c in &m.albedo {
        assert!(*c >= 0.0 && *c <= 1.0);
    }
}

#[test]
fn basaltic_plain_roughness_valid() {
    let m = basaltic_plain();
    assert!(m.roughness >= 0.0 && m.roughness <= 1.0);
}

#[test]
fn tessera_highland_different_from_basaltic() {
    let b = basaltic_plain();
    let t = tessera_highland();
    let diff = (b.roughness - t.roughness).abs() + (b.albedo[0] - t.albedo[0]).abs();
    assert!(diff > 0.0);
}

#[test]
fn volcanic_flow_emissive_nonzero() {
    let v = volcanic_flow();
    let sum: f32 = v.emissive.iter().sum();
    assert!(sum >= 0.0);
}

#[test]
fn weathered_plain_metallic_low() {
    let w = weathered_plain();
    assert!(w.metallic < 0.5);
}

#[test]
fn all_materials_normal_strength_positive() {
    for m in [
        basaltic_plain(),
        tessera_highland(),
        volcanic_flow(),
        weathered_plain(),
    ] {
        assert!(m.normal_strength >= 0.0);
    }
}

// ── Shaders ──

#[test]
fn terrain_shader_has_name() {
    let s = terrain();
    assert!(!s.name.is_empty());
}

#[test]
fn terrain_shader_has_uniforms() {
    let s = terrain();
    assert!(!s.uniforms.is_empty());
}

// ── Surface Haze ──

#[test]
fn near_surface_visibility_low() {
    let v = near_surface_visibility_km();
    assert!(v > 0.0 && v < 50.0);
}