116 lines
4.2 KiB
Python
116 lines
4.2 KiB
Python
import unittest
|
|
|
|
from hpcsim.enrichment import Enricher
|
|
|
|
|
|
class TestEnrichment(unittest.TestCase):
|
|
def test_basic_ranges(self):
|
|
e = Enricher()
|
|
sample = {
|
|
"lap": 1,
|
|
"speed": 250,
|
|
"throttle": 0.8,
|
|
"brake": 0.1,
|
|
"tire_compound": "medium",
|
|
"fuel_level": 0.6,
|
|
"ers": 0.5,
|
|
"track_temp": 35,
|
|
"rain_probability": 0.1,
|
|
}
|
|
out = e.enrich(sample)
|
|
self.assertIn("aero_efficiency", out)
|
|
self.assertTrue(0.0 <= out["aero_efficiency"] <= 1.0)
|
|
self.assertTrue(0.0 <= out["tire_degradation_index"] <= 1.0)
|
|
self.assertTrue(0.0 <= out["ers_charge"] <= 1.0)
|
|
self.assertTrue(0.0 <= out["fuel_optimization_score"] <= 1.0)
|
|
self.assertTrue(0.0 <= out["driver_consistency"] <= 1.0)
|
|
self.assertIn(out["weather_impact"], {"low", "medium", "high"})
|
|
|
|
def test_stateful_wear_increases(self):
|
|
e = Enricher()
|
|
prev = 0.0
|
|
for lap in range(1, 6):
|
|
out = e.enrich({
|
|
"lap": lap,
|
|
"speed": 260,
|
|
"throttle": 0.9,
|
|
"brake": 0.05,
|
|
"tire_compound": "soft",
|
|
"fuel_level": 0.7,
|
|
})
|
|
self.assertGreaterEqual(out["tire_degradation_index"], prev)
|
|
prev = out["tire_degradation_index"]
|
|
|
|
def test_enrich_with_context(self):
|
|
"""Test the new enrich_with_context method that outputs race context."""
|
|
e = Enricher()
|
|
sample = {
|
|
"lap": 10,
|
|
"speed": 280,
|
|
"throttle": 0.85,
|
|
"brake": 0.05,
|
|
"tire_compound": "medium",
|
|
"fuel_level": 0.7,
|
|
"track_temp": 42.5,
|
|
"total_laps": 51,
|
|
"track_name": "Monza",
|
|
"driver_name": "Alonso",
|
|
"current_position": 5,
|
|
"tire_life_laps": 8,
|
|
"rainfall": False,
|
|
}
|
|
|
|
result = e.enrich_with_context(sample)
|
|
|
|
# Verify structure
|
|
self.assertIn("enriched_telemetry", result)
|
|
self.assertIn("race_context", result)
|
|
|
|
# Verify enriched telemetry
|
|
enriched = result["enriched_telemetry"]
|
|
self.assertEqual(enriched["lap"], 10)
|
|
self.assertTrue(0.0 <= enriched["aero_efficiency"] <= 1.0)
|
|
self.assertTrue(0.0 <= enriched["tire_degradation_index"] <= 1.0)
|
|
self.assertTrue(0.0 <= enriched["ers_charge"] <= 1.0)
|
|
self.assertTrue(0.0 <= enriched["fuel_optimization_score"] <= 1.0)
|
|
self.assertTrue(0.0 <= enriched["driver_consistency"] <= 1.0)
|
|
self.assertIn(enriched["weather_impact"], {"low", "medium", "high"})
|
|
|
|
# Verify race context
|
|
context = result["race_context"]
|
|
self.assertIn("race_info", context)
|
|
self.assertIn("driver_state", context)
|
|
self.assertIn("competitors", context)
|
|
|
|
# Verify race_info
|
|
race_info = context["race_info"]
|
|
self.assertEqual(race_info["track_name"], "Monza")
|
|
self.assertEqual(race_info["total_laps"], 51)
|
|
self.assertEqual(race_info["current_lap"], 10)
|
|
self.assertEqual(race_info["weather_condition"], "Dry")
|
|
self.assertEqual(race_info["track_temp_celsius"], 42.5)
|
|
|
|
# Verify driver_state
|
|
driver_state = context["driver_state"]
|
|
self.assertEqual(driver_state["driver_name"], "Alonso")
|
|
self.assertEqual(driver_state["current_position"], 5)
|
|
self.assertEqual(driver_state["current_tire_compound"], "medium")
|
|
self.assertEqual(driver_state["tire_age_laps"], 8)
|
|
self.assertEqual(driver_state["fuel_remaining_percent"], 70.0)
|
|
|
|
# Verify competitors
|
|
competitors = context["competitors"]
|
|
self.assertIsInstance(competitors, list)
|
|
self.assertGreater(len(competitors), 0)
|
|
for comp in competitors:
|
|
self.assertIn("position", comp)
|
|
self.assertIn("driver", comp)
|
|
self.assertIn("tire_compound", comp)
|
|
self.assertIn("tire_age_laps", comp)
|
|
self.assertIn("gap_seconds", comp)
|
|
self.assertNotEqual(comp["position"], 5) # Not same as driver position
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|