NaraMotion / tests /test_motion_easing.py
ArifiIslam's picture
Release NaraMotion v0.26.0: Structure of Arrays (SoA), Path Arena Allocator, Uniform Grid Indexing, Dual-Buffer Rendering & Centroid Spring Pop-in
b516e00 verified
Raw History Blame Contribute Delete
2.47 kB
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