Files
IQ.Pilot/iqpilot/selfdrive/car/tests/test_learned_factor_persistence.py
2026-08-31 02:37:13 -05:00

83 lines
2.4 KiB
Python

import json
from types import SimpleNamespace
from iqpilot.selfdrive.car.card import Car
class DummyParams:
def __init__(self):
self.values: dict[str, object] = {}
def get(self, key: str):
return self.values.get(key)
def put_nonblocking(self, key: str, value) -> None:
self.values[key] = value
class HondaLikeController:
def __init__(self):
self.gasfactor = 1.0
self.windfactor = 1.0
def make_car(controller):
car = object.__new__(Car)
car.params = DummyParams()
car.CI = SimpleNamespace(CC=controller)
car.CP = SimpleNamespace(carFingerprint="HONDA_CRV_6G")
return car
class TestLearnedFactorPersistence:
def test_save_then_seed_round_trip(self):
car = make_car(HondaLikeController())
car.CI.CC.gasfactor = 1.37
car.CI.CC.windfactor = 0.84
car._save_learned_factors()
fresh = make_car(HondaLikeController())
fresh.params.values = car.params.values
fresh._seed_learned_factors()
assert fresh.CI.CC.gasfactor == 1.37
assert fresh.CI.CC.windfactor == 0.84
def test_factors_keyed_per_fingerprint(self):
car = make_car(HondaLikeController())
car.CI.CC.gasfactor = 2.0
car._save_learned_factors()
other = make_car(HondaLikeController())
other.params.values = car.params.values
other.CP = SimpleNamespace(carFingerprint="HONDA_CIVIC_BOSCH")
other._seed_learned_factors()
assert other.CI.CC.gasfactor == 1.0
other.CI.CC.gasfactor = 0.5
other._save_learned_factors()
stored = json.loads(other.params.values["IQLongLearnedFactors"])
assert stored["HONDA_CRV_6G"]["gasfactor"] == 2.0
assert stored["HONDA_CIVIC_BOSCH"]["gasfactor"] == 0.5
def test_seed_ignores_corrupt_or_nonfinite_values(self):
car = make_car(HondaLikeController())
car.params.values["IQLongLearnedFactors"] = "not json"
car._seed_learned_factors()
assert car.CI.CC.gasfactor == 1.0
car.params.values["IQLongLearnedFactors"] = json.dumps({"HONDA_CRV_6G": {"gasfactor": float("nan"), "windfactor": "x"}})
car._seed_learned_factors()
assert car.CI.CC.gasfactor == 1.0
assert car.CI.CC.windfactor == 1.0
def test_noop_for_controllers_without_factors(self):
car = make_car(SimpleNamespace())
car._seed_learned_factors()
car._save_learned_factors()
assert "IQLongLearnedFactors" not in car.params.values
car = make_car(None)
car._seed_learned_factors()
car._save_learned_factors()
assert "IQLongLearnedFactors" not in car.params.values