#![allow(clippy::unwrap_used)]
use crate::math::Vector3;
#[test]
fn unit_feature_direction_zeroes_tiny_components_without_readmission() {
let unit =
crate::units::UnitVector3::new(Vector3::new(-0.0, 1.0, 1.0e-13)).expect("unit direction");
let direction = crate::features::FeatureDirection3::from_unit_without_small_components(unit);
let raw = direction.get();
assert_eq!(
[raw.x.to_bits(), raw.y.to_bits(), raw.z.to_bits()],
[0.0f64.to_bits(), 1.0f64.to_bits(), 0.0f64.to_bits()]
);
}
#[test]
fn a_transform_hands_out_its_columns_and_translation_as_finite_vectors() {
use crate::transform::Transform;
let transform = Transform::affine([
[1.0, 2.0, 3.0, -f64::MAX],
[4.0, 5.0, 6.0, 0.5],
[7.0, 8.0, 9.0, f64::MAX],
])
.unwrap();
assert_eq!(
transform.translation().get(),
Vector3::new(-f64::MAX, 0.5, f64::MAX)
);
assert_eq!(
transform
.linear_columns()
.map(crate::features::FiniteVector3::get),
[
Vector3::new(1.0, 4.0, 7.0),
Vector3::new(2.0, 5.0, 8.0),
Vector3::new(3.0, 6.0, 9.0),
]
);
}
#[test]
fn unit_directions_cross_into_a_finite_vector_and_finite_vectors_normalize() {
use crate::units::UnitVector3;
let x = UnitVector3::new(Vector3::new(1.0, 0.0, 0.0)).unwrap();
let y = UnitVector3::new(Vector3::new(0.0, 1.0, 0.0)).unwrap();
assert_eq!(x.finite_cross(y).get(), Vector3::new(0.0, 0.0, 1.0));
assert_eq!(x.finite_cross(x).unit_nonzero(), None);
let far = crate::features::FiniteVector3::new(Vector3::new(f64::MAX, f64::MAX, 0.0)).unwrap();
let unit = far.unit_nonzero().unwrap();
assert!((unit.x - std::f64::consts::FRAC_1_SQRT_2).abs() <= 2.0 * f64::EPSILON);
assert_eq!(unit.x, unit.y);
}