fix(gui): P-1 — RadarDataWorker __init__ initialises runtime attrs

Audit P-1 (2026-05-02): _frame_queue, _acquisition, and frame counters
were stranded inside set_waveform() due to indentation drift.  The
dashboard constructs RadarDataWorker and calls .start() directly
without ever calling set_waveform, so live FT2232H acquisition crashes
with AttributeError on first frame access in run().

Move the init block back into __init__; set_waveform now only sets
self._waveform.  Add TestRadarDataWorkerInit covering both:
- attrs present after bare __init__ (no set_waveform required)
- set_waveform does not reset runtime counters

Test result: test_v7 102/102 PASS in radar_venv (was 100/100 + 2 new).
This commit is contained in:
Jason
2026-05-02 16:08:24 +05:45
parent 3d2ffc3f2c
commit fcbf243aba
2 changed files with 34 additions and 3 deletions

View File

@@ -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
# =============================================================================

View File

@@ -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: