"""Tests for HackRF command builder.""" from utils.sdr.base import SDRDevice, SDRType from utils.sdr.hackrf import HackRFCommandBuilder def _make_device(serial: str = "abc123") -> SDRDevice: return SDRDevice( sdr_type=SDRType.HACKRF, index=0, name="HackRF One", serial=serial, driver="hackrf", capabilities=HackRFCommandBuilder.CAPABILITIES, ) class TestHackRFCapabilities: def test_gain_max_reflects_combined_lna_vga(self): """gain_max should be LNA(40) + VGA(62) = 102.""" assert HackRFCommandBuilder.CAPABILITIES.gain_max == 102.0 def test_frequency_range(self): caps = HackRFCommandBuilder.CAPABILITIES assert caps.freq_min_mhz == 1.0 assert caps.freq_max_mhz == 6000.0 def test_tx_capable(self): assert HackRFCommandBuilder.CAPABILITIES.tx_capable is True class TestSplitGain: def test_low_gain_all_to_lna(self): builder = HackRFCommandBuilder() lna, vga = builder._split_gain(30) assert lna == 30 assert vga == 0 def test_gain_at_lna_max(self): builder = HackRFCommandBuilder() lna, vga = builder._split_gain(40) assert lna == 40 assert vga == 0 def test_high_gain_splits_across_stages(self): builder = HackRFCommandBuilder() lna, vga = builder._split_gain(80) assert lna == 40 assert vga == 40 def test_max_combined_gain(self): builder = HackRFCommandBuilder() lna, vga = builder._split_gain(102) assert lna == 40 assert vga == 62 class TestBuildAdsbCommand: def test_contains_soapysdr_device_type(self): builder = HackRFCommandBuilder() cmd = builder.build_adsb_command(_make_device(), gain=40) assert "--device-type" in cmd assert "soapysdr" in cmd def test_includes_serial_in_device_string(self): builder = HackRFCommandBuilder() cmd = builder.build_adsb_command(_make_device(serial="deadbeef"), gain=40) device_idx = cmd.index("--device") assert "deadbeef" in cmd[device_idx + 1] class TestBuildIQCaptureCommand: def test_outputs_cu8_to_stdout(self): builder = HackRFCommandBuilder() cmd = builder.build_iq_capture_command(_make_device(), frequency_mhz=100.0, sample_rate=2048000, gain=40) assert "-F" in cmd assert "CU8" in cmd assert cmd[-1] == "-" def test_gain_split_in_command(self): builder = HackRFCommandBuilder() cmd = builder.build_iq_capture_command(_make_device(), frequency_mhz=100.0, gain=80) gain_idx = cmd.index("-g") assert cmd[gain_idx + 1] == "LNA=40,VGA=40"