# pyright: reportGeneralTypeIssues=false from collections.abc import Generator import dearpygui.dearpygui as dpg import pytest import dpg_gauges as dpgg from dpg_gauges.gauges import LevelGaugeConfig, StatusLightConfig from dpg_gauges.scales import fill_fraction, fill_span, normalized_span 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_bar_geometry_helpers_clamp_and_center() -> None: assert fill_fraction(150, 0, 100, clamp=True) == 1.0 assert fill_span(25, 0, 100) == (0.0, 0.25) assert fill_span(-25, -100, 100, fill_mode="centered") == (0.375, 0.5) assert fill_span(25, -100, 100, fill_mode="centered") == (0.5, 0.625) assert normalized_span(90, 10, 0, 100) == (0.1, 0.9) def test_bar_runtime_renders_fill_thresholds_and_markers(dpg_context: None) -> None: threshold = dpgg.ThresholdBand(35, 50, (255, 120, 0, 120)) marker = dpgg.GaugeMarker(50, (255, 255, 255, 255)) with dpg.window(label="Bar"): dpgg.bar_gauge( tag="boost", label="Boost", value=25, min_value=0, max_value=50, width=240, height=90, thresholds=[threshold], markers=[marker], ) debug = dpgg.get_gauge_debug_state("boost") assert "boost__bar_fill" in debug["renderer"]["layers"]["dynamic"] assert "boost__threshold_0" in debug["renderer"]["layers"]["thresholds"] assert "boost__marker_0" in debug["renderer"]["layers"]["markers"] dpgg.set_value("boost", 100) state = get_gauge_state("boost") assert state.clamped_value == 50 assert state.displayed_value == 50 def test_level_runtime_uses_vertical_fill(dpg_context: None) -> None: with dpg.window(label="Level"): dpgg.level_gauge(tag="fuel", label="Fuel", value=75, width=120, height=180) debug = dpgg.get_gauge_debug_state("fuel") config = get_gauge_state("fuel").config assert isinstance(config, LevelGaugeConfig) assert config.orientation == "vertical" assert "fuel__bar_fill" in debug["renderer"]["layers"]["dynamic"] def test_status_light_uses_configured_state_text_and_color(dpg_context: None) -> None: states = { "ok": dpgg.StatusState((0, 220, 120, 255), "OK"), "fault": dpgg.StatusState((255, 45, 45, 255), "FAULT"), } with dpg.window(label="Status"): dpgg.status_light(tag="ecu", label="ECU", state="ok", states=states, width=180, height=70) debug = dpgg.get_gauge_debug_state("ecu") assert "ecu__status_light" in debug["renderer"]["layers"]["dynamic"] assert "ecu__status_text" in debug["renderer"]["layers"]["text"] dpgg.configure_gauge("ecu", state="fault") config = get_gauge_state("ecu").config assert isinstance(config, StatusLightConfig) assert config.state == "fault" assert get_gauge_state("ecu").dirty == 0