use cadrum::{Error, Solid};
const EPS: f64 = 1e-6;
#[test]
fn test_chamfer_cube_reduces_volume_and_area() {
let a = 10.0_f64;
let d = 1.0_f64;
let cube = Solid::cube(a, a, a);
let original_volume = cube.volume();
let original_area = cube.area();
let edges: Vec<_> = cube.iter_edge().collect();
let beveled = cube.chamfer_edges(d, edges).expect("chamfer should succeed");
assert!(beveled.volume() < original_volume,
"chamfer must reduce volume: {} vs {}", beveled.volume(), original_volume);
assert!(beveled.area() < original_area,
"chamfer must reduce area: {} vs {}", beveled.area(), original_area);
}
#[test]
fn test_chamfer_cube_matches_analytical_volume() {
let a = 10.0_f64;
let d = 1.0_f64;
let cube = Solid::cube(a, a, a);
let edges: Vec<_> = cube.iter_edge().collect();
let beveled = cube.chamfer_edges(d, edges).expect("chamfer cube");
let expected = a.powi(3) - 6.0 * d * d * (a - d);
let rel_err = (beveled.volume() - expected).abs() / expected;
assert!(rel_err < 1e-3,
"chamfered cube volume {} vs analytical {} (rel err {})",
beveled.volume(), expected, rel_err);
}
#[test]
fn test_chamfer_empty_edges_is_noop() {
let cube = Solid::cube(5.0, 5.0, 5.0);
let original_volume = cube.volume();
let unchanged = cube
.chamfer_edges(0.5, std::iter::empty::<&cadrum::Edge>())
.expect("empty chamfer is a no-op, not an error");
assert!((unchanged.volume() - original_volume).abs() < EPS,
"no-op chamfer should preserve volume exactly, got {}", unchanged.volume());
}
#[test]
fn test_chamfer_distance_too_large_returns_err() {
let cube = Solid::cube(2.0, 2.0, 2.0);
let edges: Vec<_> = cube.iter_edge().collect();
let err = cube.chamfer_edges(5.0, edges).err().expect("oversized distance must fail");
assert!(matches!(err, Error::ChamferFailed),
"expected ChamferFailed, got {:?}", err);
}