92 lines
2.9 KiB
Python
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
|