@@ -757,3 +757,66 @@ fn test_total_cmp() {
757
757
assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & f32 :: INFINITY ) ) ;
758
758
assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & s_nan( ) ) ) ;
759
759
}
760
+
761
+ #[ test]
762
+ fn test_lerp_exact ( ) {
763
+ // simple values
764
+ assert_eq ! ( f32 :: lerp( 0.0 , 2.0 , 4.0 ) , 2.0 ) ;
765
+ assert_eq ! ( f32 :: lerp( 1.0 , 2.0 , 4.0 ) , 4.0 ) ;
766
+
767
+ // boundary values
768
+ assert_eq ! ( f32 :: lerp( 0.0 , f32 :: MIN , f32 :: MAX ) , f32 :: MIN ) ;
769
+ assert_eq ! ( f32 :: lerp( 1.0 , f32 :: MIN , f32 :: MAX ) , f32 :: MAX ) ;
770
+ }
771
+
772
+ #[ test]
773
+ fn test_lerp_consistent ( ) {
774
+ assert_eq ! ( f32 :: lerp( f32 :: MAX , f32 :: MIN , f32 :: MIN ) , f32 :: MIN ) ;
775
+ assert_eq ! ( f32 :: lerp( f32 :: MIN , f32 :: MAX , f32 :: MAX ) , f32 :: MAX ) ;
776
+
777
+ // as long as t is finite, a/b can be infinite
778
+ assert_eq ! ( f32 :: lerp( f32 :: MAX , f32 :: NEG_INFINITY , f32 :: NEG_INFINITY ) , f32 :: NEG_INFINITY ) ;
779
+ assert_eq ! ( f32 :: lerp( f32 :: MIN , f32 :: INFINITY , f32 :: INFINITY ) , f32 :: INFINITY ) ;
780
+ }
781
+
782
+ #[ test]
783
+ fn test_lerp_nan_infinite ( ) {
784
+ // non-finite t is not NaN if a/b different
785
+ assert ! ( !f32 :: lerp( f32 :: INFINITY , f32 :: MIN , f32 :: MAX ) . is_nan( ) ) ;
786
+ assert ! ( !f32 :: lerp( f32 :: NEG_INFINITY , f32 :: MIN , f32 :: MAX ) . is_nan( ) ) ;
787
+ }
788
+
789
+ #[ test]
790
+ fn test_lerp_values ( ) {
791
+ // just a few basic values
792
+ assert_eq ! ( f32 :: lerp( 0.25 , 1.0 , 2.0 ) , 1.25 ) ;
793
+ assert_eq ! ( f32 :: lerp( 0.50 , 1.0 , 2.0 ) , 1.50 ) ;
794
+ assert_eq ! ( f32 :: lerp( 0.75 , 1.0 , 2.0 ) , 1.75 ) ;
795
+ }
796
+
797
+ #[ test]
798
+ fn test_lerp_monotonic ( ) {
799
+ // near 0
800
+ let below_zero = f32:: lerp ( -f32:: EPSILON , f32:: MIN , f32:: MAX ) ;
801
+ let zero = f32:: lerp ( 0.0 , f32:: MIN , f32:: MAX ) ;
802
+ let above_zero = f32:: lerp ( f32:: EPSILON , f32:: MIN , f32:: MAX ) ;
803
+ assert ! ( below_zero <= zero) ;
804
+ assert ! ( zero <= above_zero) ;
805
+ assert ! ( below_zero <= above_zero) ;
806
+
807
+ // near 0.5
808
+ let below_half = f32:: lerp ( 0.5 - f32:: EPSILON , f32:: MIN , f32:: MAX ) ;
809
+ let half = f32:: lerp ( 0.5 , f32:: MIN , f32:: MAX ) ;
810
+ let above_half = f32:: lerp ( 0.5 + f32:: EPSILON , f32:: MIN , f32:: MAX ) ;
811
+ assert ! ( below_half <= half) ;
812
+ assert ! ( half <= above_half) ;
813
+ assert ! ( below_half <= above_half) ;
814
+
815
+ // near 1
816
+ let below_one = f32:: lerp ( 1.0 - f32:: EPSILON , f32:: MIN , f32:: MAX ) ;
817
+ let one = f32:: lerp ( 1.0 , f32:: MIN , f32:: MAX ) ;
818
+ let above_one = f32:: lerp ( 1.0 + f32:: EPSILON , f32:: MIN , f32:: MAX ) ;
819
+ assert ! ( below_one <= one) ;
820
+ assert ! ( one <= above_one) ;
821
+ assert ! ( below_one <= above_one) ;
822
+ }
0 commit comments