solarsystems 0.0.1

N-body solar system engine — gravitational dynamics, orbital mechanics, perturbations, event detection, and full celestial orchestration
Documentation
use solarsystems::BodyId;
use solarsystems::rendering::features::{
    body_render_profile, body_render_quality, body_ring_bands, body_surface_features,
};

#[test]
fn earth_surface_features_include_real_named_regions() {
    let features = body_surface_features(BodyId::Earth);
    assert!(
        features.len() >= 10,
        "expected detailed Earth regions, got {}",
        features.len()
    );
    assert!(features.iter().any(|f| f.name == "Africa"));
    assert!(features.iter().any(|f| f.name == "Eurasia"));
    assert!(features.iter().any(|f| f.name == "NorthAmerica"));
}

#[test]
fn sun_surface_features_include_active_regions() {
    let features = body_surface_features(BodyId::Sun);
    assert!(
        features.len() >= 6,
        "expected several solar active regions, got {}",
        features.len()
    );
    assert!(features.iter().all(|f| f.lat_deg.abs() <= 40.0));
}

#[test]
fn saturn_ring_bands_are_detailed() {
    let bands = body_ring_bands(BodyId::Saturn);
    assert!(
        bands.len() >= 7,
        "expected detailed Saturn rings, got {}",
        bands.len()
    );
    assert!(bands.iter().any(|b| b.name == "CassiniDivision"));
    assert!(bands.iter().any(|b| b.name == "EnckeGap"));
}

#[test]
fn moon_surface_features_include_maria_and_polar_frost() {
    let features = body_surface_features(BodyId::Moon);
    assert!(
        features.len() >= 6,
        "expected detailed Moon regions, got {}",
        features.len()
    );
    assert!(features.iter().any(|f| f.name == "MareImbrium"));
    assert!(features.iter().any(|f| f.name == "OceanusProcellarum"));
    assert!(features.iter().any(|f| f.material == "polar_ice"));
}

#[test]
fn europa_surface_features_include_chaos_and_lineae() {
    let features = body_surface_features(BodyId::Europa);
    assert!(
        features.len() >= 4,
        "expected Europa lineae/chaos regions, got {}",
        features.len()
    );
    assert!(features.iter().any(|f| f.name == "ConamaraChaos"));
    assert!(features.iter().any(|f| f.material == "lineae_crack"));
}

#[test]
fn dwarf_planets_have_named_surface_regions() {
    let pluto = body_surface_features(BodyId::Pluto);
    assert!(pluto.iter().any(|f| f.name == "TombaughRegio"));
    let haumea = body_surface_features(BodyId::Haumea);
    assert!(haumea.iter().any(|f| f.name == "DarkRedSpot"));
}

#[test]
fn asteroids_and_comets_have_source_features() {
    let ceres = body_surface_features(BodyId::Ceres);
    assert!(ceres.iter().any(|f| f.name == "Occator"));
    let halley = body_surface_features(BodyId::Halley);
    assert!(halley.iter().any(|f| f.kind == "jet"));
}

#[test]
fn inner_planets_and_ice_giants_have_named_source_regions() {
    let mars = body_surface_features(BodyId::Mars);
    assert!(mars.iter().any(|f| f.name == "OlympusMons"));
    assert!(mars.iter().any(|f| f.name == "VallesMarineris"));

    let mercury = body_surface_features(BodyId::Mercury);
    assert!(mercury.iter().any(|f| f.name == "CalorisBasin"));

    let venus = body_surface_features(BodyId::Venus);
    assert!(venus.iter().any(|f| f.name == "AphroditeTerra"));

    let neptune = body_surface_features(BodyId::Neptune);
    assert!(neptune.iter().any(|f| f.name == "GreatDarkSpot"));
}

#[test]
fn render_profiles_are_owned_by_solarsystems() {
    let earth = body_render_profile(BodyId::Earth);
    assert_eq!(earth.family, "oceanic_terrestrial");
    assert_eq!(earth.ocean_material, "ocean");

    let jupiter = body_render_profile(BodyId::Jupiter);
    assert_eq!(jupiter.family, "banded_gas_giant");
    assert_eq!(jupiter.accent_material, "stormregion");

    let europa = body_render_profile(BodyId::Europa);
    assert_eq!(europa.family, "icy_body");

    let halley = body_render_profile(BodyId::Halley);
    assert_eq!(halley.family, "comet_nucleus");
}

#[test]
fn gas_giants_have_dense_source_banding() {
    let jupiter = body_surface_features(BodyId::Jupiter);
    assert!(
        jupiter.len() >= 8,
        "expected richer Jupiter banding, got {}",
        jupiter.len()
    );
    assert!(jupiter.iter().any(|f| f.name == "GreatRedSpot"));
    assert!(jupiter.iter().any(|f| f.name == "OvalBA"));

    let saturn = body_surface_features(BodyId::Saturn);
    assert!(
        saturn.len() >= 6,
        "expected richer Saturn banding, got {}",
        saturn.len()
    );
    assert!(saturn.iter().any(|f| f.name == "NorthPolarHexagon"));
    assert!(saturn.iter().any(|f| f.name == "SouthPolarVortex"));
}

#[test]
fn browser_render_budgets_stay_detailed_without_ram_explosion() {
    let earth = body_render_quality(BodyId::Earth);
    assert!(
        (192..=320).contains(&earth.mesh_segments),
        "Earth mesh budget should stay detailed but sane, got {}",
        earth.mesh_segments
    );
    assert!(
        earth.texture_width <= 2048 && earth.texture_height <= 1024,
        "Earth texture budget is too large for browser generation: {}x{}",
        earth.texture_width,
        earth.texture_height
    );

    let moon = body_render_quality(BodyId::Moon);
    assert!(
        (128..=256).contains(&moon.mesh_segments),
        "Moon mesh budget should stay detailed but sane, got {}",
        moon.mesh_segments
    );

    let saturn = body_render_quality(BodyId::Saturn);
    assert!(
        (360..=720).contains(&saturn.ring_segments),
        "Saturn ring budget should avoid browser over-allocation, got {}",
        saturn.ring_segments
    );
}

#[test]
fn terrestrial_worlds_and_major_moons_have_dense_named_regions() {
    let earth = body_surface_features(BodyId::Earth);
    assert!(
        earth.len() >= 16,
        "expected dense Earth regions, got {}",
        earth.len()
    );
    assert!(earth.iter().any(|f| f.name == "AmazonBasin"));
    assert!(earth.iter().any(|f| f.name == "Patagonia"));

    let mars = body_surface_features(BodyId::Mars);
    assert!(
        mars.len() >= 10,
        "expected dense Mars regions, got {}",
        mars.len()
    );
    assert!(mars.iter().any(|f| f.name == "ArabiaTerra"));
    assert!(mars.iter().any(|f| f.name == "NoctisLabyrinthus"));

    let moon = body_surface_features(BodyId::Moon);
    assert!(
        moon.len() >= 10,
        "expected dense Moon regions, got {}",
        moon.len()
    );
    assert!(moon.iter().any(|f| f.name == "MareCrisium"));

    let europa = body_surface_features(BodyId::Europa);
    assert!(
        europa.len() >= 6,
        "expected denser Europa regions, got {}",
        europa.len()
    );
    assert!(europa.iter().any(|f| f.name == "TheraMacula"));

    let titan = body_surface_features(BodyId::Titan);
    assert!(
        titan.len() >= 5,
        "expected denser Titan regions, got {}",
        titan.len()
    );
    assert!(titan.iter().any(|f| f.name == "LigeiaMare"));
}