@@ -757,3 +757,66 @@ fn test_total_cmp() {
757757 assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & f32 :: INFINITY ) ) ;
758758 assert_eq ! ( Ordering :: Less , ( -s_nan( ) ) . total_cmp( & s_nan( ) ) ) ;
759759}
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