#[test]
fn titan_atmosphere_exists() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!(atmo.species.len() >= 7);
}
#[test]
fn titan_surface_pressure() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!((atmo.surface_pressure_pa - 146_700.0).abs() < 1.0);
}
#[test]
fn titan_surface_temperature() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!((atmo.surface_temperature_k - 93.7).abs() < 0.1);
}
#[test]
fn titan_n2_dominant() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
let n2 = atmo.species.iter().find(|s| s.symbol == "N2").unwrap();
assert!(n2.volume_fraction > 0.95);
}
#[test]
fn titan_methane_present() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
let ch4 = atmo.species.iter().find(|s| s.symbol == "CH4").unwrap();
assert!(ch4.volume_fraction > 0.01);
}
#[test]
fn titan_rayleigh_density_decreases() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!(atmo.rayleigh_density(50_000.0) < atmo.rayleigh_density(0.0));
}
#[test]
fn titan_sky_color_orange() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
let c = atmo.sky_color();
assert!(c[0] > c[1] && c[1] > c[2]);
}
#[test]
fn titan_direct_transmission_decreases_with_od() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
let t1 = atmo.direct_transmission(1.0, 1.0);
let t2 = atmo.direct_transmission(5.0, 1.0);
assert!(t2 < t1);
}
#[test]
fn titan_sky_luminance_positive() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!(atmo.sky_luminance(0.0, 1.0) > 0.0);
}
#[test]
fn titan_barometric_density_positive() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!(atmo.barometric_density() > 0.0);
}
#[test]
fn titan_shell_volume_positive() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!(atmo.shell_volume() > 0.0);
}
#[test]
fn titan_atmosphere_height_600km() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
assert!((atmo.atmosphere_height_m - 600_000.0).abs() < 1.0);
}
#[test]
fn titan_molar_masses_positive() {
let atmo = titanss::rendering::atmosphere_scattering::AtmosphereEndpoint::titan();
for sp in &atmo.species {
assert!(
sp.molar_mass_kg_mol > 0.0,
"{} has zero molar mass",
sp.name
);
}
}
#[test]
fn titan_cloud_system_five_layers() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
assert_eq!(cs.layers.len(), 5);
}
#[test]
fn titan_cloud_total_od() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
let od = cs.total_optical_depth();
assert!(od > 5.0 && od < 10.0);
}
#[test]
fn titan_cloud_transmission_low() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
assert!(cs.transmission() < 0.01);
}
#[test]
fn titan_cloud_top_altitude() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
assert!(cs.cloud_top_altitude_m() > 500_000.0);
}
#[test]
fn titan_cloud_base_at_surface() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
assert!((cs.cloud_base_altitude_m() - 0.0).abs() < 1.0);
}
#[test]
fn titan_cloud_layer_at_200km() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
let layer = cs.layer_at_altitude(200_000.0);
assert!(layer.is_some());
assert_eq!(layer.unwrap().name, "main_haze");
}
#[test]
fn titan_cloud_layer_at_ground() {
let cs = titanss::rendering::clouds::CloudSystemEndpoint::titan_default();
let layer = cs.layer_at_altitude(1_000.0);
assert!(layer.is_some());
assert_eq!(layer.unwrap().composition, "C2H6 + CH4 condensate");
}
#[test]
fn titan_terrain_shader_has_uniforms() {
let s = titanss::rendering::shaders::ShaderEndpoint::terrain();
assert!(s.uniforms.len() >= 6);
assert_eq!(s.name, "titan_terrain_pbr");
}
#[test]
fn titan_atmosphere_shader() {
let s = titanss::rendering::shaders::ShaderEndpoint::atmosphere();
assert!(s.uniforms.len() >= 5);
assert_eq!(s.name, "titan_atmosphere_scattering");
}
#[test]
fn titan_haze_shader() {
let s = titanss::rendering::shaders::ShaderEndpoint::haze();
assert!(s.uniforms.len() >= 3);
assert_eq!(s.name, "titan_tholin_haze");
}
#[test]
fn titan_eclipse_shader() {
let s = titanss::rendering::shaders::ShaderEndpoint::eclipse();
assert!(s.uniforms.len() >= 3);
}
#[test]
fn dust_plume_opacity() {
let d = titanss::rendering::dust::DustScattering::impact_plume();
assert!(d.opacity_at_height(0.0) > 0.0);
}
#[test]
fn opacity_decreases() {
let d = titanss::rendering::dust::DustScattering::impact_plume();
assert!(d.opacity_at_height(5_000.0) < d.opacity_at_height(0.0));
}
#[test]
fn dark_terrain_material() {
let m = titanss::rendering::materials::PbrMaterial::dark_terrain();
assert!(m.albedo[0] < 0.3);
}
#[test]
fn icy_bright_material() {
let m = titanss::rendering::materials::PbrMaterial::icy_bright();
assert!(m.albedo[0] > 0.4);
}
#[test]
fn crater_floor_material() {
let m = titanss::rendering::materials::PbrMaterial::crater_floor();
assert!(m.roughness > 0.5);
}