File size: 2,470 Bytes
b516e00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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