Another project
1#[cfg(test)]
2use bone_types::Vec3;
3use bone_types::{Point3, Tolerance, UnitVec3};
4use truck_modeling::{Point3 as TruckPoint3, Vector3 as TruckVector3};
5
6pub(crate) fn point_from_truck(p: TruckPoint3) -> Point3 {
7 Point3::from_mm(p.x, p.y, p.z)
8}
9
10pub(crate) fn try_unit_from_truck(v: TruckVector3, tolerance: Tolerance) -> Option<UnitVec3> {
11 UnitVec3::try_from_components(v.x, v.y, v.z, tolerance).ok()
12}
13
14#[cfg(test)]
15pub(crate) fn point_to_truck(p: Point3) -> TruckPoint3 {
16 let (x, y, z) = p.coords_mm();
17 TruckPoint3::new(x, y, z)
18}
19
20#[cfg(test)]
21pub(crate) fn vec_from_truck(v: TruckVector3) -> Vec3 {
22 Vec3::from_mm(v.x, v.y, v.z)
23}
24
25#[cfg(test)]
26pub(crate) fn vec_to_truck(v: Vec3) -> TruckVector3 {
27 let (x, y, z) = v.coords_mm();
28 TruckVector3::new(x, y, z)
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34 use proptest::prelude::*;
35
36 fn finite_coord() -> impl Strategy<Value = f64> {
37 prop::num::f64::POSITIVE | prop::num::f64::NEGATIVE | prop::num::f64::ZERO
38 }
39
40 proptest! {
41 #[test]
42 fn point_roundtrips_to_ulp(
43 x in finite_coord(),
44 y in finite_coord(),
45 z in finite_coord(),
46 ) {
47 let bone = Point3::from_mm(x, y, z);
48 let back = point_from_truck(point_to_truck(bone));
49 let (bx, by, bz) = back.coords_mm();
50 prop_assert!(bx.to_bits() == x.to_bits());
51 prop_assert!(by.to_bits() == y.to_bits());
52 prop_assert!(bz.to_bits() == z.to_bits());
53 }
54
55 #[test]
56 fn vec_roundtrips_to_ulp(
57 x in finite_coord(),
58 y in finite_coord(),
59 z in finite_coord(),
60 ) {
61 let bone = Vec3::from_mm(x, y, z);
62 let back = vec_from_truck(vec_to_truck(bone));
63 let (bx, by, bz) = back.coords_mm();
64 prop_assert!(bx.to_bits() == x.to_bits());
65 prop_assert!(by.to_bits() == y.to_bits());
66 prop_assert!(bz.to_bits() == z.to_bits());
67 }
68 }
69}