mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-06-28 18:12:05 +08:00
161 lines
4.9 KiB
Python
161 lines
4.9 KiB
Python
import sys
|
|
import types
|
|
import unittest
|
|
from unittest.mock import MagicMock
|
|
|
|
from collections import namedtuple
|
|
|
|
ColorClass = namedtuple("Color", ["r", "g", "b", "a"])
|
|
|
|
# 1. Register Mock/Stub for pyray
|
|
rl = types.SimpleNamespace(
|
|
Color=lambda r, g, b, a=255: ColorClass(r, g, b, a),
|
|
Rectangle=lambda x=0, y=0, width=0, height=0: types.SimpleNamespace(x=x, y=y, width=width, height=height),
|
|
Vector2=lambda x=0, y=0: types.SimpleNamespace(x=x, y=y),
|
|
Texture2D=type("Texture2D", (), {}),
|
|
Font=type("Font", (), {}),
|
|
WHITE=ColorClass(255, 255, 255, 255),
|
|
BLACK=ColorClass(0, 0, 0, 255),
|
|
get_time=lambda: 1.0,
|
|
)
|
|
sys.modules["pyray"] = rl
|
|
|
|
# 2. Register Mock/Stub for text_measure
|
|
text_measure = types.SimpleNamespace(
|
|
measure_text_cached=lambda *a, **k: types.SimpleNamespace(x=100, y=20)
|
|
)
|
|
sys.modules["openpilot.system.ui.lib.text_measure"] = text_measure
|
|
|
|
# 3. Register Mock/Stub for starpilot_border
|
|
starpilot_border = types.SimpleNamespace(
|
|
_csc_state=lambda: None,
|
|
_intensity=lambda c: 0.0,
|
|
_glow_color=lambda i: rl.Color(0, 255, 0, 255),
|
|
)
|
|
sys.modules["openpilot.selfdrive.ui.onroad.starpilot.starpilot_border"] = starpilot_border
|
|
|
|
class MockSubMaster:
|
|
def __init__(self):
|
|
self.valid = {}
|
|
self.updated = {}
|
|
self.data = {}
|
|
|
|
def __getitem__(self, key):
|
|
return self.data.get(key)
|
|
|
|
def __setitem__(self, key, value):
|
|
self.data[key] = value
|
|
|
|
def reset(self):
|
|
self.valid.clear()
|
|
self.updated.clear()
|
|
self.data.clear()
|
|
|
|
mock_ui_state = types.SimpleNamespace(
|
|
is_metric=False,
|
|
sm=MockSubMaster(),
|
|
)
|
|
ui_state_mod = types.ModuleType("openpilot.selfdrive.ui.ui_state")
|
|
ui_state_mod.ui_state = mock_ui_state
|
|
sys.modules["openpilot.selfdrive.ui.ui_state"] = ui_state_mod
|
|
|
|
# Now import aethergauge
|
|
from openpilot.selfdrive.ui.onroad.starpilot.aethergauge import (
|
|
AetherGauge,
|
|
AetherGaugeData,
|
|
IndicatorType,
|
|
_is_lead,
|
|
_lead_data,
|
|
_is_stop_light,
|
|
_is_curvature,
|
|
)
|
|
|
|
class TestAetherGaugeLeadLogic(unittest.TestCase):
|
|
def setUp(self):
|
|
mock_ui_state.sm.reset()
|
|
|
|
def test_is_lead_inactive_if_not_experimental(self):
|
|
mock_ui_state.sm.valid["starpilotPlan"] = True
|
|
mock_ui_state.sm.valid["radarState"] = True
|
|
mock_ui_state.sm["starpilotPlan"] = types.SimpleNamespace(
|
|
experimentalMode=False,
|
|
trackingLead=True,
|
|
)
|
|
mock_ui_state.sm["radarState"] = types.SimpleNamespace(
|
|
leadOne=types.SimpleNamespace(status=True, vLead=5.0, dRel=20.0)
|
|
)
|
|
self.assertFalse(_is_lead())
|
|
|
|
def test_is_lead_inactive_if_not_tracking_lead(self):
|
|
mock_ui_state.sm.valid["starpilotPlan"] = True
|
|
mock_ui_state.sm.valid["radarState"] = True
|
|
mock_ui_state.sm["starpilotPlan"] = types.SimpleNamespace(
|
|
experimentalMode=True,
|
|
trackingLead=False,
|
|
)
|
|
mock_ui_state.sm["radarState"] = types.SimpleNamespace(
|
|
leadOne=types.SimpleNamespace(status=True, vLead=5.0, dRel=20.0)
|
|
)
|
|
self.assertFalse(_is_lead())
|
|
|
|
def test_is_lead_active_when_experimental_and_tracking(self):
|
|
mock_ui_state.sm.valid["starpilotPlan"] = True
|
|
mock_ui_state.sm.valid["radarState"] = True
|
|
mock_ui_state.sm["starpilotPlan"] = types.SimpleNamespace(
|
|
experimentalMode=True,
|
|
trackingLead=True,
|
|
)
|
|
mock_ui_state.sm["radarState"] = types.SimpleNamespace(
|
|
leadOne=types.SimpleNamespace(status=True, vLead=5.0, dRel=20.0)
|
|
)
|
|
self.assertTrue(_is_lead())
|
|
|
|
def test_lead_data_slow(self):
|
|
mock_ui_state.sm.valid["radarState"] = True
|
|
mock_ui_state.sm["radarState"] = types.SimpleNamespace(
|
|
leadOne=types.SimpleNamespace(status=True, vLead=5.0, dRel=25.0)
|
|
)
|
|
data = _lead_data()
|
|
self.assertEqual(data.text, "SLOW")
|
|
self.assertEqual(data.indicator_extra, "slower")
|
|
self.assertEqual(data.indicator_value, 25.0)
|
|
self.assertEqual(data.indicator_type, IndicatorType.LEAD)
|
|
|
|
def test_lead_data_stopped(self):
|
|
mock_ui_state.sm.valid["radarState"] = True
|
|
mock_ui_state.sm["radarState"] = types.SimpleNamespace(
|
|
leadOne=types.SimpleNamespace(status=True, vLead=0.5, dRel=12.0)
|
|
)
|
|
data = _lead_data()
|
|
self.assertEqual(data.text, "STOPPED")
|
|
self.assertEqual(data.indicator_extra, "stopped")
|
|
self.assertEqual(data.indicator_value, 12.0)
|
|
self.assertEqual(data.indicator_type, IndicatorType.LEAD)
|
|
|
|
def test_is_stop_light(self):
|
|
mock_ui_state.sm.valid["starpilotPlan"] = True
|
|
mock_ui_state.sm["starpilotPlan"] = types.SimpleNamespace(
|
|
experimentalMode=True,
|
|
redLight=True,
|
|
)
|
|
self.assertTrue(_is_stop_light())
|
|
|
|
mock_ui_state.sm["starpilotPlan"].redLight = False
|
|
self.assertFalse(_is_stop_light())
|
|
|
|
def test_is_curvature(self):
|
|
mock_ui_state.sm.valid["starpilotPlan"] = True
|
|
mock_ui_state.sm["starpilotPlan"] = types.SimpleNamespace(
|
|
experimentalMode=True,
|
|
roadCurvature=0.002,
|
|
)
|
|
self.assertTrue(_is_curvature())
|
|
|
|
mock_ui_state.sm["starpilotPlan"].roadCurvature = 0.0005
|
|
self.assertFalse(_is_curvature())
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|