//! Tests for plane angle quantities. use apsis_core::{Quantity, Unit}; use apsis_units::dimension::Angle; use apsis_units::{Degrees, Radians}; use core::f64::consts::PI; #[test] fn direct_conversions_are_consistent() { assert!((Degrees::new(180.0).to_radians().value() - PI).abs() < 1e-12); assert!((Radians::new(PI).to_degrees().value() - 180.0).abs() < 1e-12); assert!((Degrees::new(90.0).to_radians().value() - PI / 2.0).abs() < 1e-12); } #[test] fn generic_conversion_matches_direct_conversion() { let angle = Degrees::new(45.0); let via_trait: Radians = angle.to_unit(); assert!((via_trait.value() - angle.to_radians().value()).abs() < 1e-12); } #[test] fn conversion_round_trips() { let original = Degrees::new(137.5); let round_tripped: Degrees = original.to_unit::().to_unit(); assert!((round_tripped.value() - original.value()).abs() < 1e-12); } #[test] fn wrap_places_angles_in_the_canonical_range() { for turns in -3..=3 { let angle = Radians::new(PI + f64::from(turns) * 2.0 * PI); let wrapped = angle.wrap(); assert!(wrapped.value() >= -PI); assert!(wrapped.value() < PI); // Wrapping shifts by whole turns, so the angle is preserved // modulo two pi. let difference = angle.value() - wrapped.value(); assert!((difference / (2.0 * PI)).fract().abs() < 1e-12); } assert!((Radians::new(0.0).wrap().value()).abs() < 1e-12); assert!((Radians::new(PI).wrap().value() + PI).abs() < 1e-12); } #[test] fn unit_metadata_is_available() { assert_eq!(Radians::symbol(), "rad"); assert_eq!(Degrees::symbol(), "deg"); assert_eq!(Radians::factor_to_base(), 1.0); assert!((Degrees::factor_to_base() - PI / 180.0).abs() < 1e-15); fn assert_angle>() {} assert_angle::(); assert_angle::(); } #[test] fn display_includes_the_symbol() { assert_eq!(Radians::new(1.0).to_string(), "1 rad"); assert_eq!(Degrees::new(90.0).to_string(), "90 deg"); }