From 32fee7f2fe147da0099228e11260d87fa72048c8 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Thu, 15 Oct 2026 02:09:55 -0500 Subject: [PATCH] Fix mocked driver-monitor graphics fixtures --- .../ui/tests/test_layout_preview_renderer.py | 14 ++++++++++-- .../ui/tests/test_onroad_customization.py | 17 ++++++++++---- .../starpilot/ui/tests/test_onroad_dm.py | 22 ++++++++++++++----- prebuilt.json | 2 +- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/openpilot/starpilot/ui/tests/test_layout_preview_renderer.py b/openpilot/starpilot/ui/tests/test_layout_preview_renderer.py index 6c38f03831..6e162b8863 100644 --- a/openpilot/starpilot/ui/tests/test_layout_preview_renderer.py +++ b/openpilot/starpilot/ui/tests/test_layout_preview_renderer.py @@ -4,7 +4,7 @@ import io import struct from types import SimpleNamespace as NS import unittest -from unittest.mock import Mock +from unittest.mock import Mock, call import zlib from openpilot.starpilot.ui.layout_preview_renderer import LayoutPreviewRenderer, _Canvas, _DriverMonitorArt, _png_rgba, sample_state @@ -174,18 +174,28 @@ class LayoutPreviewRendererTests(unittest.TestCase): canvas.monitor = _DriverMonitorArt.__new__(_DriverMonitorArt) canvas.monitor.profile = Profile.COMPACT canvas.monitor.renderer = Mock() + matrix = Mock() + matrix.attach_mock(canvas.monitor.renderer._render, 'render') state = sample_state("engaged", default_document()) - with patch("openpilot.starpilot.ui.layout_preview_renderer.draw_widget_frame"): + with patch("openpilot.starpilot.ui.layout_preview_renderer.draw_widget_frame"), \ + patch.multiple(rl, rl_push_matrix=matrix.push, rl_translatef=matrix.translate, + rl_scalef=matrix.scale, rl_pop_matrix=matrix.pop): canvas._render_driver_monitor(rl.Rectangle(), state) canvas.monitor.renderer._render.assert_not_called() + self.assertEqual(matrix.mock_calls, []) state.customization["layouts"]["compact"]["driver_monitor"].update(x=200, y=100) canvas._render_driver_monitor(rl.Rectangle(), state) canvas.monitor.renderer._render.assert_called_once() + self.assertEqual(matrix.mock_calls, [call.push(), call.translate(200, 100, 0), call.scale(1, 1, 1), + call.translate(-200, -100, 0), call.render(canvas.monitor.renderer._rect), call.pop()]) + matrix.reset_mock() canvas.monitor.renderer._render.reset_mock() state.customization["layouts"]["compact"]["driver_monitor"].update(x=16, y=10) canvas.view.compact_hud._set_speed_alpha.x = 0.0 canvas._render_driver_monitor(rl.Rectangle(), state) canvas.monitor.renderer._render.assert_called_once() + self.assertEqual(matrix.mock_calls, [call.push(), call.translate(16, 10, 0), call.scale(1, 1, 1), + call.translate(-16, -10, 0), call.render(canvas.monitor.renderer._rect), call.pop()]) def test_big_sidebar_matches_original_right_rail_and_is_sample_only(self): frame = rl.Rectangle(1860, 0, 300, 1080) diff --git a/openpilot/starpilot/ui/tests/test_onroad_customization.py b/openpilot/starpilot/ui/tests/test_onroad_customization.py index 22e2163751..9b3c2dc3ff 100644 --- a/openpilot/starpilot/ui/tests/test_onroad_customization.py +++ b/openpilot/starpilot/ui/tests/test_onroad_customization.py @@ -1,5 +1,5 @@ -from unittest.mock import Mock +from unittest.mock import Mock, call as mock_call from openpilot.starpilot.ui.presentation import BitmapFonts import json from dataclasses import replace @@ -607,13 +607,16 @@ def test_driver_frame_matches_native_preview_and_keeps_face_renderer_separate(mo state = road(document) live = DriverMonitorLayer.__new__(DriverMonitorLayer) live.profile = Profile.COMPACT + matrix = Mock() monkeypatch.setattr(live, 'renderer', NS(set_should_draw=Mock(), set_position=Mock(), _rect=object(), - _fade_filter=NS(update=Mock()), _render=Mock()), raising=False) + _fade_filter=NS(update=Mock()), _render=matrix.live_render), raising=False) preview = _DriverMonitorArt.__new__(_DriverMonitorArt) preview.profile = Profile.COMPACT - monkeypatch.setattr(preview, 'renderer', NS(_render=Mock()), raising=False) + monkeypatch.setattr(preview, 'renderer', NS(_render=matrix.preview_render), raising=False) with patch('openpilot.starpilot.ui.onroad_dm.draw_widget_frame') as live_frame, \ - patch('openpilot.starpilot.ui.layout_preview_renderer.draw_widget_frame') as preview_frame: + patch('openpilot.starpilot.ui.layout_preview_renderer.draw_widget_frame') as preview_frame, \ + patch.multiple(rl, rl_push_matrix=matrix.push, rl_translatef=matrix.translate, + rl_scalef=matrix.scale, rl_pop_matrix=matrix.pop): live.render(state, monitor=None, driver=None, fresh=False, onroad=True) preview.render(rl.Rectangle(0, 0, 536, 240), state) assert live_frame.call_args.args[1:] == preview_frame.call_args.args[1:] @@ -623,6 +626,12 @@ def test_driver_frame_matches_native_preview_and_keeps_face_renderer_separate(mo live.renderer._fade_filter.update.assert_called_once_with(0.35) live.renderer._render.assert_called_once() preview.renderer._render.assert_called_once() + assert matrix.mock_calls == [ + mock_call.push(), mock_call.translate(90, 40, 0), mock_call.scale(1, 1, 1), mock_call.translate(-90, -40, 0), + mock_call.live_render(live.renderer._rect), mock_call.pop(), + mock_call.push(), mock_call.translate(90, 40, 0), mock_call.scale(1, 1, 1), mock_call.translate(-90, -40, 0), + mock_call.preview_render(preview.renderer._rect), mock_call.pop(), + ] @pytest.mark.parametrize("enabled", [True, False]) diff --git a/openpilot/starpilot/ui/tests/test_onroad_dm.py b/openpilot/starpilot/ui/tests/test_onroad_dm.py index e363417b24..91bc6e8c31 100644 --- a/openpilot/starpilot/ui/tests/test_onroad_dm.py +++ b/openpilot/starpilot/ui/tests/test_onroad_dm.py @@ -1,4 +1,4 @@ -from unittest.mock import Mock +from unittest.mock import Mock, call from openpilot.starpilot.ui.presentation import BitmapFonts from unittest.mock import patch @@ -158,19 +158,25 @@ class TestDriverMonitor(unittest.TestCase): monitor.visionPolicyState.pose.pitch = float('nan') layer = DriverMonitorLayer.__new__(DriverMonitorLayer) layer.profile = Profile.LARGE + matrix = Mock() self.enterContext( patch.object( layer, 'renderer', - NS(set_should_draw=Mock(), set_position=Mock(), _rect=object(), _is_active=True, _fade_filter=NS(update=Mock()), _update_state=Mock(), _render=Mock()), + NS(set_should_draw=Mock(), set_position=Mock(), _rect=object(), _is_active=True, + _fade_filter=NS(update=Mock()), _update_state=Mock(), _render=matrix.render), create=True, ) ) - layer.render(road(), monitor=monitor, driver=driver, fresh=True, onroad=True) + with patch.multiple('openpilot.starpilot.ui.onroad_dm.rl', rl_push_matrix=matrix.push, rl_translatef=matrix.translate, + rl_scalef=matrix.scale, rl_pop_matrix=matrix.pop): + layer.render(road(), monitor=monitor, driver=driver, fresh=True, onroad=True) layer.renderer._update_state.assert_not_called() layer.renderer._render.assert_called_once() self.assertFalse(layer.renderer._is_active) layer.renderer._fade_filter.update.assert_called_once_with(0.35) + self.assertEqual(matrix.mock_calls, [call.push(), call.translate(120, 840, 0), call.scale(1, 1, 1), + call.translate(-120, -840, 0), call.render(layer.renderer._rect), call.pop()]) def test_visible_face_keeps_person_solid_even_when_vision_policy_is_inactive(self): from openpilot.selfdrive.ui.mici.onroad.driver_state import DriverStateRenderer @@ -196,13 +202,19 @@ class TestDriverMonitor(unittest.TestCase): document['layouts']['large']['driver_monitor'].update(x=700.5, y=600.25) layer = DriverMonitorLayer.__new__(DriverMonitorLayer) layer.profile = Profile.LARGE + matrix = Mock() self.enterContext( - patch.object(layer, 'renderer', NS(set_should_draw=Mock(), set_position=Mock(), _update_state=Mock(), _render=Mock(), _rect=object()), create=True) + patch.object(layer, 'renderer', NS(set_should_draw=Mock(), set_position=Mock(), _update_state=Mock(), + _render=matrix.render, _rect=object()), create=True) ) - layer.render(replace(road(), customization=document), monitor=monitor, driver=driver, fresh=True, onroad=True) + with patch.multiple('openpilot.starpilot.ui.onroad_dm.rl', rl_push_matrix=matrix.push, rl_translatef=matrix.translate, + rl_scalef=matrix.scale, rl_pop_matrix=matrix.pop): + layer.render(replace(road(), customization=document), monitor=monitor, driver=driver, fresh=True, onroad=True) layer.renderer.set_position.assert_called_once_with(700.5, 600.25) layer.renderer._update_state.assert_called_once() layer.renderer._render.assert_called_once_with(layer.renderer._rect) + self.assertEqual(matrix.mock_calls, [call.push(), call.translate(700.5, 600.25, 0), call.scale(1, 1, 1), + call.translate(-700.5, -600.25, 0), call.render(layer.renderer._rect), call.pop()]) def test_composition_wires_actual_monitor_layer_before_alert(self): from contextlib import ExitStack diff --git a/prebuilt.json b/prebuilt.json index a42301f8d5..a188725664 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "e10d74d6606301a472810871c5349040d6db434e66388e860ac574d5d1f8d043", "schema_version": 1} +{"protected_inventory_sha256": "5cfd05f33d0a6367fd072ab3463b923ca56e8eb23596f0f83ca2ea38c3df9149", "schema_version": 1}