Files
StarPilot/openpilot/starpilot/controllers/tests/test_capture.py
T
firestar5683 347397ad38 Add exclusive parked SpacePilot mode and native Big UI
Use the supported Offroad lifecycle with fresh Park, receive-only CAN,
stopped-process and noOutput checks. Add offroad touch/controller play
and the native Big UI five-version-tap entry. Exiting never restores
driving mode automatically within the existing manager session.

Qualified by210 unique focused passing cases, lint/type checks, native
host rendering/input/resource checks and independent lifecycle review.
Actual vehicle lifecycle, hardware inputs and device headroom remain
unqualified; no deployment is part of this change.
2026-10-26 00:01:36 -05:00

56 lines
2.2 KiB
Python

"""Native modal input consumes a complete batch without invoking vehicle actions."""
from unittest.mock import Mock
from openpilot.starpilot.controllers.input import Press
from openpilot.starpilot.controllers.tests.test_owner import TestControllerOwner as OwnerFixture
from openpilot.starpilot.controllers.tests.test_runtime import TestControllerRuntime as RuntimeFixture
def test_modal_resolves_binding_without_action_or_learning():
fixture = OwnerFixture()
fixture.setUp()
try:
fixture.configure()
fixture.learn(3)
fixture.now += 1_000_000
capture = Mock()
press = Press(fixture.device['id'], 42, fixture.now)
fixture.owner.feed(press, capture=capture)
capture.assert_called_once_with('safe.action', fixture.now)
assert fixture.calls == 0 and not fixture.favorite_calls
fixture.owner.feed(press, capture=capture)
assert capture.call_count == 1
fixture.owner.feed(Press('unknown', 42, fixture.now), capture=capture)
fixture.owner.feed(Press(fixture.device['id'], 42, fixture.now - 260_000_000), capture=capture)
assert capture.call_count == 1
fixture.now += 1_000_000
fixture.owner.feed(Press(fixture.device['id'], 42, fixture.now))
assert fixture.calls == 1
fixture.owner.action({'operation': 'learn', 'revision': fixture.owner.snapshot()['revision'], 'slot': 4})
fixture.now += 1_000_000
before = fixture.path.read_bytes()
fixture.owner.feed(Press(fixture.device['id'], 55, fixture.now), capture=capture)
assert fixture.path.read_bytes() == before
capture.assert_called_with(None, fixture.now)
finally:
fixture.doCleanups()
def test_batch_capture_is_stable_when_first_press_closes_modal():
fixture = RuntimeFixture()
runtime, _, reader, owner, _ = fixture.runtime()
try:
capture = Mock()
current: list[Mock | None] = [capture]
runtime.input_capture = lambda: current[0]
reader.poll.return_value = [Press('device', 1, 10), Press('device', 2, 20)]
def consume(_press, *, capture):
current[0] = None
owner.feed.side_effect = consume
runtime.poll()
assert owner.feed.call_count == 2
assert all(call.kwargs['capture'] is capture for call in owner.feed.call_args_list)
finally:
fixture.doCleanups()