diff --git a/9_Firmware/9_3_GUI/test_v7.py b/9_Firmware/9_3_GUI/test_v7.py index 9d36f8d..96cc70e 100644 --- a/9_Firmware/9_3_GUI/test_v7.py +++ b/9_Firmware/9_3_GUI/test_v7.py @@ -322,6 +322,37 @@ class TestHardwareReExports(unittest.TestCase): self.assertIsInstance(devs, list) +# ============================================================================= +# Test: v7.workers.RadarDataWorker initialization +# (Audit P-1: __init__ must populate _frame_queue/_acquisition/counters +# without requiring an explicit set_waveform call. Dashboard constructs +# the worker and calls .start() directly; missing init causes AttributeError +# on first frame in production.) +# ============================================================================= + +@unittest.skipUnless(_pyqt6_available(), "PyQt6 not installed") +class TestRadarDataWorkerInit(unittest.TestCase): + def test_init_sets_runtime_attrs(self): + from v7.workers import RadarDataWorker + worker = RadarDataWorker(connection=None) + self.assertIsNotNone(worker._frame_queue) + self.assertEqual(worker._frame_queue.maxsize, 4) + self.assertIsNone(worker._acquisition) + self.assertEqual(worker._frame_count, 0) + self.assertEqual(worker._byte_count, 0) + self.assertEqual(worker._error_count, 0) + self.assertFalse(worker._running) + + def test_set_waveform_does_not_reset_counters(self): + from v7.workers import RadarDataWorker + from v7.models import WaveformConfig + worker = RadarDataWorker(connection=None) + worker._frame_count = 7 + worker.set_waveform(WaveformConfig()) + self.assertEqual(worker._frame_count, 7, + "set_waveform must not reset runtime counters") + + # ============================================================================= # Test: v7.__init__ — clean exports # ============================================================================= diff --git a/9_Firmware/9_3_GUI/v7/workers.py b/9_Firmware/9_3_GUI/v7/workers.py index 8b82eac..812dd83 100644 --- a/9_Firmware/9_3_GUI/v7/workers.py +++ b/9_Firmware/9_3_GUI/v7/workers.py @@ -91,9 +91,6 @@ class RadarDataWorker(QThread): self._waveform = WaveformConfig() self._running = False - def set_waveform(self, wf) -> None: - self._waveform = wf - # Frame queue for production RadarAcquisition → this thread self._frame_queue: queue.Queue = queue.Queue(maxsize=4) @@ -105,6 +102,9 @@ class RadarDataWorker(QThread): self._byte_count = 0 self._error_count = 0 + def set_waveform(self, wf) -> None: + self._waveform = wf + def stop(self): self._running = False if self._acquisition: