import math import pytest from naramotion.motion import ( Easing, CubicBezier, Spring, lerp, lerp_color, lerp_matrix, clamp ) from naramotion.color import Rgba32 from naramotion.matrix import Matrix2D def test_penner_easing_boundaries(): curves = [ Easing.linear, Easing.quad_in, Easing.quad_out, Easing.quad_in_out, Easing.cubic_in, Easing.cubic_out, Easing.cubic_in_out, Easing.quart_in, Easing.quart_out, Easing.quart_in_out, Easing.quint_in, Easing.quint_out, Easing.quint_in_out, Easing.sine_in, Easing.sine_out, Easing.sine_in_out, Easing.expo_in, Easing.expo_out, Easing.expo_in_out, Easing.circ_in, Easing.circ_out, Easing.circ_in_out, Easing.back_in, Easing.back_out, Easing.back_in_out, Easing.elastic_in, Easing.elastic_out, Easing.elastic_in_out, Easing.bounce_in, Easing.bounce_out, Easing.bounce_in_out, ] for curve in curves: val_0 = curve(0.0) val_1 = curve(1.0) assert math.isclose(val_0, 0.0, abs_tol=1e-5), f"Failed for {curve} at t=0" assert math.isclose(val_1, 1.0, abs_tol=1e-5), f"Failed for {curve} at t=1" def test_easing_lookup_names(): assert Easing.get("easeInOutCubic") == Easing.cubic_in_out assert Easing.get("bounce_out") == Easing.bounce_out assert Easing.get("ease_out_quad") == Easing.quad_out assert Easing.get("unknown_curve") == Easing.linear def test_cubic_bezier(): # CSS ease: cubic-bezier(0.25, 0.1, 0.25, 1.0) cb = CubicBezier(0.25, 0.1, 0.25, 1.0) assert math.isclose(cb(0.0), 0.0, abs_tol=1e-5) assert math.isclose(cb(1.0), 1.0, abs_tol=1e-5) mid = cb(0.5) assert 0.0 < mid < 1.0 def test_spring_dynamics(): spring = Spring(stiffness=100.0, damping=10.0, mass=1.0) assert spring(0.0) == 0.0 # Over time, spring converges to 1.0 val_settled = spring(3.0) assert math.isclose(val_settled, 1.0, abs_tol=1e-2) def test_lerp_color_and_matrix(): # 1. Color lerp c1 = Rgba32(255, 0, 0, 255) # Red c2 = Rgba32(0, 0, 255, 255) # Blue mid_color = lerp_color(c1, c2, 0.5) assert mid_color.r == 128 assert mid_color.b == 128 # 2. Matrix lerp m1 = Matrix2D.make_translation(0, 0) m2 = Matrix2D.make_translation(100, 200) mid_mat = lerp_matrix(m1, m2, 0.5) assert mid_mat.m20 == 50.0 assert mid_mat.m21 == 100.0