# 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