Files
galileo/tests/navigation/test_ephemeris_assembler.py
T

61 lines
2.4 KiB
Python

from __future__ import annotations
from galileo_rx.navigation.inav_ephemeris_assembler import InavEphemerisAssembler
from galileo_rx.navigation.inav_word_parser import (
EphemerisClockWord4, EphemerisWord1, EphemerisWord2, EphemerisWord3,
IonosphereHealthTimeWord5, ParsedInavWord,
)
def _word(prn: int, kind: int, iod: int, timestamp: int) -> ParsedInavWord:
if kind == 1:
payload = EphemerisWord1(iod, 1, 60.0, 1, 0.1, 1, 0.01, 1, 5000.0)
elif kind == 2:
payload = EphemerisWord2(iod, 1, 0.2, 1, 0.3, 1, 0.4, 1, 0.01)
elif kind == 3:
payload = EphemerisWord3(iod, 1, 0.01, 1, 0.01, 1, 0.01, 1, 0.01, 1, 1.0, 1, 1.0, 10)
else:
payload = EphemerisClockWord4(iod, prn, 1, 0.01, 1, 0.01, 1, 60.0, 1, 0.1, 1, 0.01, 1, 0.001)
return ParsedInavWord(prn, kind, timestamp, iod, payload, [], True, True)
def _health(prn: int) -> ParsedInavWord:
payload = IonosphereHealthTimeWord5(0, 0.0, 0, 0.0, 0, 0.0, (False,) * 5, 0, 0.0, 0, 0.0, 0, 0, 0, 0, 10, 20)
return ParsedInavWord(prn, 5, 0, None, payload, [], True, True)
def test_assembler_rejects_mixed_iod_and_commits_atomically() -> None:
assembler = InavEphemerisAssembler(3)
assembler.update(_health(3))
for kind in (1, 2, 3):
assert assembler.update(_word(3, kind, 5, kind)) is None
assert assembler.update(_word(3, 4, 6, 4)) is None
assert assembler.current is None
complete = assembler.update(_word(3, 4, 5, 5))
assert complete is not None and complete.iod_nav == 5
assert complete.health_valid and complete.data_valid
assert assembler.missing_word_types() == set()
def test_previous_ephemeris_survives_incomplete_update() -> None:
assembler = InavEphemerisAssembler(3)
assembler.update(_health(3))
for kind in (1, 2, 3, 4):
assembler.update(_word(3, kind, 5, kind))
current = assembler.current
assembler.update(_word(3, 1, 6, 10))
assert assembler.current is current
def test_stale_partial_set_is_expired_without_replacing_valid_ephemeris() -> None:
assembler = InavEphemerisAssembler(3, max_partial_age_samples=10)
assembler.update(_health(3))
for kind in (1, 2, 3, 4):
assembler.update(_word(3, kind, 5, kind))
current = assembler.current
assembler.update(_word(3, 1, 6, 20))
assembler.update(_word(3, 2, 7, 40))
assert assembler.stale_partial_sets == 1
assert assembler.current is current
assert assembler.missing_word_types() == set()