Files
dpg-gauges/tests/test_step6_animation_stress.py

102 lines
3.0 KiB
Python

# pyright: reportGeneralTypeIssues=false
from collections.abc import Generator
import dearpygui.dearpygui as dpg
import pytest
import dpg_gauges as dpgg
from dpg_gauges.animation import advance_animation
from dpg_gauges.state import clear_registry, get_gauge_state, set_runtime_value
from dpg_gauges.types import AnimationConfig, SmoothingConfig
@pytest.fixture
def dpg_context() -> Generator[None]:
clear_registry()
dpgg.configure()
dpg.create_context()
try:
yield
finally:
clear_registry()
dpg.destroy_context()
@pytest.fixture(autouse=True)
def clean_registry() -> Generator[None]:
clear_registry()
dpgg.configure()
yield
clear_registry()
def test_animation_converges_to_latest_target() -> None:
dpgg.digital_gauge(tag="anim", value=0, animation=AnimationConfig(enabled=True, duration=1.0))
set_runtime_value("anim", 100, now=10.0)
state = get_gauge_state("anim")
config = state.config.animation
assert isinstance(config, AnimationConfig)
value, active = advance_animation(state.animation_state, config, now=10.5)
assert value == 50
assert active is True
value, active = advance_animation(state.animation_state, config, now=11.0)
assert value == 100
assert active is False
def test_smoothing_progresses_and_resets_on_range_change() -> None:
dpgg.digital_gauge(
tag="smooth",
value=0,
smoothing=SmoothingConfig(enabled=True, alpha=0.5),
)
set_runtime_value("smooth", 100, now=1.0)
state = get_gauge_state("smooth")
assert state.displayed_value == 0
assert state.smoothing_state.active is True
dpgg.configure_gauge("smooth", max_value=50)
assert state.displayed_value == 50
assert state.smoothing_state.value == 50
def test_latest_target_wins_without_queue_growth() -> None:
dpgg.digital_gauge(tag="latest", value=0, animation=AnimationConfig(enabled=True, duration=1.0))
set_runtime_value("latest", 25, now=1.0)
set_runtime_value("latest", 75, now=1.1)
set_runtime_value("latest", 50, now=1.2)
state = get_gauge_state("latest")
assert state.target_value == 50
assert state.clamped_value == 50
assert state.animation_state.target_value == 50
assert state.value_revision == 3
def test_attached_renderer_schedules_only_while_animation_active(dpg_context: None) -> None:
with dpg.window(label="Animation"):
dpgg.digital_gauge(
tag="attached",
value=0,
width=180,
height=80,
animation=AnimationConfig(enabled=True, duration=1.0),
)
dpgg.set_value("attached", 100)
debug = dpgg.get_gauge_debug_state("attached")
assert debug["renderer"]["scheduled"] is True
assert debug["animation"]["target_value"] == 100
state = get_gauge_state("attached")
state.animation_state.active = False
state.smoothing_state.active = False
state.renderer._scheduled = False
state.renderer.render()
assert dpgg.get_gauge_debug_state("attached")["renderer"]["scheduled"] is False