Files
dpg-gauges/tests/test_step5_catalogue.py

92 lines
2.9 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.scales import active_segments, compass_heading, generate_ticks, value_to_angle
from dpg_gauges.state import clear_registry, get_gauge_state
@pytest.fixture
def dpg_context() -> Generator[None]:
clear_registry()
dpgg.configure()
dpg.create_context()
try:
yield
finally:
clear_registry()
dpg.destroy_context()
def test_value_to_angle_ticks_and_compass_wrap() -> None:
assert value_to_angle(50, 0, 100, 225, -45) == 90
assert generate_ticks(0, 100, 3) == [0, 50, 100]
assert compass_heading(370) == 10
assert compass_heading(-10) == 350
def test_analog_renders_needle_redline_and_marker(dpg_context: None) -> None:
marker = dpgg.GaugeMarker(6000, (255, 255, 255, 255))
with dpg.window(label="Analog"):
dpgg.analog_gauge(
tag="rpm",
label="RPM",
value=3500,
max_value=8000,
redline_start=6500,
markers=[marker],
width=240,
height=200,
)
debug = dpgg.get_gauge_debug_state("rpm")
assert "rpm__needle" in debug["renderer"]["layers"]["dynamic"]
assert "rpm__marker_0" in debug["renderer"]["layers"]["markers"]
assert get_gauge_state("rpm").measured_width == 240
def test_compass_wraps_runtime_heading(dpg_context: None) -> None:
with dpg.window(label="Compass"):
dpgg.compass_gauge(tag="heading", value=370, width=200, height=200)
state = get_gauge_state("heading")
assert state.clamped_value == 10
assert (
"heading__needle" in dpgg.get_gauge_debug_state("heading")["renderer"]["layers"]["dynamic"]
)
def test_segmented_activation_and_rendering(dpg_context: None) -> None:
assert active_segments(55, 0, 100, 10) == 6
with dpg.window(label="Segments"):
dpgg.segmented_gauge(tag="shift", value=55, segments=10, width=260, height=80)
dynamic = dpgg.get_gauge_debug_state("shift")["renderer"]["layers"]["dynamic"]
assert "shift__segment_0" in dynamic
assert "shift__segment_9" in dynamic
def test_battery_clamps_and_multi_value_renders(dpg_context: None) -> None:
with dpg.window(label="Catalogue"):
dpgg.battery_gauge(tag="battery", value=125, width=220, height=100)
dpgg.multi_value_gauge(
tag="engine",
label="Engine",
values={"AFR": 12.8, "Oil": "58 psi"},
width=220,
height=110,
)
assert get_gauge_state("battery").clamped_value == 100
assert (
"battery__battery_fill"
in dpgg.get_gauge_debug_state("battery")["renderer"]["layers"]["dynamic"]
)
text = dpgg.get_gauge_debug_state("engine")["renderer"]["layers"]["text"]
assert "engine__multi_0" in text
assert "engine__multi_1" in text