from __future__ import annotations import numpy as np from galileo_rx.tracking.lock_detector import LockDetector from galileo_rx.types import CorrelatorOutputs def _correlators(phase_rad: float) -> CorrelatorOutputs: prompt = complex(np.exp(1j * phase_rad)) return CorrelatorOutputs(0.2 * prompt, 0.5 * prompt, prompt, 0.5 * prompt, 0.2 * prompt) def test_data_lock_detector_ignores_bpsk_transition_but_detects_quadrature_jump() -> None: detector = LockDetector(data_sign_insensitive=True) detector.update(_correlators(0.0)) assert detector.update(_correlators(np.pi)).cycle_slip is False assert detector.update(_correlators(np.pi + 0.49 * np.pi)).cycle_slip is True