Files
onepilot/sunnypilot/selfdrive/controls/lib/tests/test_blinker_pause_lateral.py
github-actions[bot] 6f34f74e9b sunnypilot v2026.001.000 release
date: 2026-04-10T22:07:44
master commit: 4ba0c4b574bff994e9a8f7266b4969b39380a8b1
2026-04-10 22:07:52 +08:00

145 lines
4.0 KiB
Python

"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
from cereal import car
from openpilot.common.constants import CV
from openpilot.sunnypilot.selfdrive.controls.lib.blinker_pause_lateral import BlinkerPauseLateral
class TestBlinkerPauseLateral:
def setup_method(self):
self.blinker_pause_lateral = BlinkerPauseLateral()
self._reset_states()
def _reset_states(self):
self.blinker_pause_lateral.enabled = True
self.blinker_pause_lateral.is_metric = False
self.blinker_pause_lateral.min_speed = 20 # MPH
self.blinker_pause_lateral.reengage_delay = 0
self.blinker_pause_lateral.blinker_off_timer = 0.0
self.CS = car.CarState.new_message()
self.CS.vEgo = 0
self.CS.leftBlinker = False
self.CS.rightBlinker = False
def _test_should_blinker_pause_lateral(self, expected_results) -> None:
for left in (True, False):
for right in (True, False):
self.CS.leftBlinker = left
self.CS.rightBlinker = right
result = self.blinker_pause_lateral.update(self.CS)
assert result == expected_results[(left, right)]
def test_below_min_speed_blinker(self):
self.CS.vEgo = 4.5 # ~10 MPH
expected_results = {
(False, False): False,
(True, False): True,
(False, True): True,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_reengage_delay(self):
self.blinker_pause_lateral.reengage_delay = 2 # seconds
self.CS.vEgo = 4.5 # ~10 MPH
expected_results = {
(False, False): True,
(True, False): True,
(False, True): True,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_above_min_speed_blinker(self):
self.CS.vEgo = 13.4 # ~30 MPH
expected_results = {
(False, False): False,
(True, False): False,
(False, True): False,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_just_below_min_speed(self):
self.CS.vEgo = (20 * CV.MPH_TO_MS) - 0.01
expected_results = {
(False, False): False,
(True, False): True,
(False, True): True,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_disabled(self):
self.blinker_pause_lateral.enabled = False
self.CS.vEgo = 4.5 # ~10 MPH
expected_results = {
(False, False): False,
(True, False): False,
(False, True): False,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_metric_units_below_min_speed(self):
self.blinker_pause_lateral.is_metric = True
self.CS.vEgo = 5.0 # ~18 km/h
expected_results = {
(False, False): False,
(True, False): True,
(False, True): True,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_metric_units_above_threshold(self):
self.blinker_pause_lateral.is_metric = True
self.CS.vEgo = 6.0 # ~21.6 km/h
expected_results = {
(False, False): False,
(True, False): False,
(False, True): False,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
def test_change_min_speed_threshold(self):
self.blinker_pause_lateral.min_speed = 30 # MPH
# below min speed
self.CS.vEgo = 11.2 # ~25 MPH
expected_results = {
(False, False): False,
(True, False): True,
(False, True): True,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)
# above min speed
self.CS.vEgo = 15.6 # ~35 MPH
expected_results = {
(False, False): False,
(True, False): False,
(False, True): False,
(True, True): False
}
self._test_should_blinker_pause_lateral(expected_results)