use super::*;
#[test]
fn remove_internal_membrane_no_panic_on_non_finite_coords() {
let mut m = Mesh::new();
for t in 0..4u32 {
let base = t * 3;
for k in 0..3u32 {
m.positions
.extend_from_slice(&[f32::INFINITY, t as f32 + k as f32, k as f32]);
m.normals.extend_from_slice(&[0.0, 0.0, 1.0]);
}
m.indices.extend_from_slice(&[base, base + 1, base + 2]);
}
let out =
GeometryRouter::remove_internal_membrane(&m, Vector3::new(0.0, 0.0, 0.0));
assert_eq!(out.indices.len() % 3, 0);
}
#[test]
fn remove_internal_membrane_deterministic_on_all_nan_extents() {
let build = || {
let mut m = Mesh::new();
for t in 0..4u32 {
let base = t * 3;
for _ in 0..3u32 {
m.positions.extend_from_slice(&[
f32::INFINITY,
f32::INFINITY,
f32::INFINITY,
]);
m.normals.extend_from_slice(&[0.0, 0.0, 1.0]);
}
m.indices.extend_from_slice(&[base, base + 1, base + 2]);
}
m
};
let a = GeometryRouter::remove_internal_membrane(&build(), Vector3::new(0.0, 0.0, 0.0));
let b = GeometryRouter::remove_internal_membrane(&build(), Vector3::new(0.0, 0.0, 0.0));
assert_eq!(a.indices, b.indices, "all-NaN extents must pick a deterministic axis");
assert_eq!(a.positions.len(), b.positions.len());
assert_eq!(a.indices.len() % 3, 0);
}
#[test]
fn axis_pick_total_order_semantics() {
let pick = |ext: [f64; 3]| -> usize {
(0..3).max_by(|&i, &j| ext[i].total_cmp(&ext[j])).unwrap()
};
assert_eq!(pick([-0.0, 0.0, -1.0]), 1, "+0.0 outranks -0.0 in the total order");
assert_eq!(pick([0.0, 0.0, 0.0]), 2, "ties resolve to the last index");
assert_eq!(pick([f64::NAN, f64::NAN, f64::NAN]), 2, "all-NaN ties resolve to the last index");
assert_eq!(pick([f64::NAN, 1.0, 2.0]), 0, "positive NaN outranks finite values");
assert_eq!(pick([1.0, f64::INFINITY, f64::NAN]), 2, "positive NaN outranks +inf");
}