use super::*;
fn box_positions_indices(lo: [f32; 3], hi: [f32; 3]) -> (Vec<f32>, Vec<u32>) {
let corners: [[f32; 3]; 8] = [
[lo[0], lo[1], lo[2]],
[hi[0], lo[1], lo[2]],
[hi[0], hi[1], lo[2]],
[lo[0], hi[1], lo[2]],
[lo[0], lo[1], hi[2]],
[hi[0], lo[1], hi[2]],
[hi[0], hi[1], hi[2]],
[lo[0], hi[1], hi[2]],
];
let positions: Vec<f32> = corners.iter().flat_map(|c| c.iter().copied()).collect();
#[rustfmt::skip]
let indices: Vec<u32> = vec![
0, 1, 2, 0, 2, 3, 4, 6, 5, 4, 7, 6, 0, 5, 1, 0, 4, 5, 3, 2, 6, 3, 6, 7, 0, 3, 7, 0, 7, 4, 1, 5, 6, 1, 6, 2, ];
(positions, indices)
}
#[test]
fn well_formed_deep_overlap_still_returns_a_solid() {
let (pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(result.is_solid(), "well-formed deep overlap must not be rejected as malformed");
assert_eq!(result.degenerate_reason(), "");
assert!(result.volume_m3() > 0.0);
}
#[test]
fn a_positions_buffer_not_a_multiple_of_three_is_reported_malformed_not_computed() {
let (pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (mut pos_b, idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
pos_b.pop();
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(!result.is_solid());
assert_eq!(result.degenerate_reason(), "malformed-operand");
assert_eq!(result.volume_m3(), 0.0);
assert!(result.positions().is_empty());
assert!(result.indices().is_empty());
}
#[test]
fn an_index_past_its_own_operands_vertex_count_is_reported_malformed_not_silently_dropped() {
let (pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, mut idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
let last = idx_b.len() - 1;
idx_b[last] = 99;
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(!result.is_solid());
assert_eq!(result.degenerate_reason(), "malformed-operand");
assert_eq!(result.volume_m3(), 0.0);
}
#[test]
fn an_index_exactly_at_its_own_operands_vertex_count_is_reported_malformed() {
let (pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, mut idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
let vertex_count = (pos_b.len() / 3) as u32;
let last = idx_b.len() - 1;
idx_b[last] = vertex_count;
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(!result.is_solid());
assert_eq!(result.degenerate_reason(), "malformed-operand");
assert_eq!(result.volume_m3(), 0.0);
}
#[test]
fn an_out_of_range_index_on_operand_a_is_also_caught() {
let (pos_a, mut idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
idx_a[0] = 1000;
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(!result.is_solid());
assert_eq!(result.degenerate_reason(), "malformed-operand");
}
#[test]
fn nan_corner_off_the_overlap_face_must_be_rejected_not_silently_absorbed() {
let (mut pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
pos_a[0] = f32::NAN;
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(
!result.is_solid(),
"NaN operand must never be reported as a trustworthy solid; got isSolid=true, volume={}",
result.volume_m3()
);
assert_eq!(result.degenerate_reason(), "malformed-operand");
}
#[test]
fn nan_corner_on_the_overlap_face_must_be_rejected_not_misreported_as_no_overlap() {
let (mut pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
pos_a[6 * 3] = f32::NAN;
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(!result.is_solid());
assert_eq!(
result.degenerate_reason(),
"malformed-operand",
"a genuinely overlapping pair corrupted by NaN must not be reported as no-overlap"
);
}
#[test]
fn infinite_corner_must_be_rejected_as_malformed_operand() {
let (mut pos_a, idx_a) = box_positions_indices([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]);
let (pos_b, idx_b) = box_positions_indices([0.5, 0.5, 0.5], [1.5, 1.5, 1.5]);
pos_a[0] = f32::INFINITY;
let result = clash_intersection_solid(&pos_a, &idx_a, &pos_b, &idx_b);
assert!(!result.is_solid());
assert_eq!(result.degenerate_reason(), "malformed-operand");
}