roverdevkit / tests /test_soils.py
jjreif's picture
Deploy roverdevkit @ 2676a67
b3d14e3
Raw
History Blame Contribute Delete
1.95 kB
"""Tests for the soil-simulant catalogue loader."""
from __future__ import annotations
import pytest
from roverdevkit.terramechanics.bekker_wong import SoilParameters
from roverdevkit.terramechanics.soils import (
SOIL_CSV_PATH,
get_soil_parameters,
list_soil_simulants,
load_soil_catalogue,
)
def test_csv_file_is_present() -> None:
assert SOIL_CSV_PATH.exists(), f"expected soil CSV at {SOIL_CSV_PATH}"
def test_catalogue_contains_expected_simulants() -> None:
names = list_soil_simulants()
# Every scenario YAML references one of these; breaking this test means
# some scenario cannot be loaded.
for required in (
"Apollo_regolith_nominal",
"Apollo_regolith_loose",
"Apollo_regolith_dense",
):
assert required in names, f"missing simulant {required!r} in catalogue"
def test_parameters_are_physically_plausible() -> None:
for name in list_soil_simulants():
params = get_soil_parameters(name)
assert 0.5 <= params.n <= 1.5, f"{name}: sinkage exponent out of range"
# KLS-1 carries a negative k_c from a Wong 1980 least-squares fit;
# the catalogue notes k_eff = k_c/b + k_phi stays positive at wheel widths.
if name != "KLS-1":
assert params.k_c >= 0.0
assert params.k_phi > 0.0
assert params.cohesion_kpa >= 0.0
assert 25.0 <= params.friction_angle_deg <= 55.0
assert params.shear_modulus_k_m > 0.0
def test_lookup_returns_soil_parameters_type() -> None:
params = get_soil_parameters("Apollo_regolith_nominal")
assert isinstance(params, SoilParameters)
def test_unknown_simulant_raises_with_helpful_message() -> None:
with pytest.raises(KeyError, match="unknown soil simulant"):
get_soil_parameters("NotARealSimulant")
def test_loader_is_cached_returns_same_dict() -> None:
a = load_soil_catalogue()
b = load_soil_catalogue()
assert a is b