#![allow(dead_code)]
use serde::Deserialize;
#[derive(Deserialize)]
pub struct FrameJson {
pub origin: [f64; 3],
pub x_dir: [f64; 3],
pub y_dir: [f64; 3],
pub z_dir: [f64; 3],
}
pub fn point3(a: [f64; 3]) -> geomcore::Point {
geomcore::Point::new(a[0], a[1], a[2])
}
pub fn vector3(a: [f64; 3]) -> geomcore::Vector {
geomcore::Vector::new(a[0], a[1], a[2])
}
pub fn frame3(f: &FrameJson) -> geomcore::Frame {
geomcore::Frame::new(point3(f.origin), vector3(f.z_dir), vector3(f.x_dir)).unwrap()
}
pub fn load(name: &str) -> serde_json::Value {
serde_json::from_str(
&std::fs::read_to_string(format!(
"{}/tests/fixtures/{name}",
env!("CARGO_MANIFEST_DIR")
))
.unwrap(),
)
.unwrap()
}
#[track_caller]
pub fn assert_close(actual: f64, expected: f64) {
let tol = 1e-7 * expected.abs().max(1.0);
assert!(
(actual - expected).abs() <= tol,
"actual {actual} != expected {expected}"
);
}
#[track_caller]
pub fn assert_point3(actual: geomcore::Point, expected: [f64; 3]) {
assert_close(actual.x, expected[0]);
assert_close(actual.y, expected[1]);
assert_close(actual.z, expected[2]);
}
#[track_caller]
pub fn assert_vector3(actual: geomcore::Vector, expected: [f64; 3]) {
assert_close(actual.x, expected[0]);
assert_close(actual.y, expected[1]);
assert_close(actual.z, expected[2]);
}