feat: gaming environment checks engine (M6) + notification icon — 0.9.0
The evaluate-and-suggest half of M6: a read-only findings report (D9) over system settings that affect gaming stability/performance, each with the exact fix command. - core/gameenv.py: PCIe ASPM, NVIDIA persistence mode, CPU governor (the three seed-case contributors to GPU bus-drop / Xid 79), GameMode, MangoHud, vm.swappiness, shader disk cache, THP, CPU mitigations, Proton versions. Pure evaluate_* helpers split from IO for testing; reuses the M4 Finding model. - steam.proton_versions(): surfaces installed Proton builds for the report. - CLI: rigdoctor gameenv (text / --json); render_health() gained a title arg. - GUI: new Environment page; extracted a shared finding_card widget and switched the Health page to it. - Tests for the pure evaluators + aggregate. Also fix: desktop notifications now use the RigDoctor icon (installed theme copy -> bundled asset -> stock fallback) instead of a generic stock icon, matching the app/dock icon. Docs (MODULES/ROADMAP) updated; version 0.8.0 -> 0.9.0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
"""Tests for M6 gaming-environment checks (pure evaluators + aggregate smoke test)."""
|
||||
|
||||
import unittest
|
||||
|
||||
from rigdoctor.core import gameenv
|
||||
from rigdoctor.core.health import Finding
|
||||
|
||||
|
||||
class AspmTests(unittest.TestCase):
|
||||
def test_powersave_is_warning(self):
|
||||
f = gameenv.evaluate_aspm("[powersave] performance powersupersave\n")
|
||||
self.assertEqual(f.severity, "warning")
|
||||
self.assertEqual(f.category, "PCIe")
|
||||
|
||||
def test_performance_is_ok(self):
|
||||
self.assertEqual(gameenv.evaluate_aspm("[performance] powersave powersupersave").severity, "ok")
|
||||
|
||||
def test_default_is_info(self):
|
||||
self.assertEqual(gameenv.evaluate_aspm("[default] performance powersave").severity, "info")
|
||||
|
||||
def test_missing_is_none(self):
|
||||
self.assertIsNone(gameenv.evaluate_aspm(None))
|
||||
self.assertIsNone(gameenv.evaluate_aspm("no brackets here"))
|
||||
|
||||
|
||||
class GovernorTests(unittest.TestCase):
|
||||
def test_performance_only_is_ok(self):
|
||||
self.assertEqual(gameenv.evaluate_governor({"performance"}).severity, "ok")
|
||||
|
||||
def test_powersave_is_warning(self):
|
||||
f = gameenv.evaluate_governor({"powersave"})
|
||||
self.assertEqual(f.severity, "warning")
|
||||
self.assertIn("cpupower", f.suggestion)
|
||||
|
||||
def test_dynamic_is_info(self):
|
||||
self.assertEqual(gameenv.evaluate_governor({"schedutil"}).severity, "info")
|
||||
|
||||
def test_empty_is_none(self):
|
||||
self.assertIsNone(gameenv.evaluate_governor(set()))
|
||||
|
||||
|
||||
class SwappinessTests(unittest.TestCase):
|
||||
def test_high_is_info_with_suggestion(self):
|
||||
f = gameenv.evaluate_swappiness(60)
|
||||
self.assertEqual(f.severity, "info")
|
||||
self.assertIn("swappiness", f.suggestion)
|
||||
|
||||
def test_low_is_ok(self):
|
||||
self.assertEqual(gameenv.evaluate_swappiness(10).severity, "ok")
|
||||
|
||||
|
||||
class ShaderCacheTests(unittest.TestCase):
|
||||
def test_disabled_nvidia_is_warning(self):
|
||||
self.assertEqual(gameenv.evaluate_shader_cache({"__GL_SHADER_DISK_CACHE": "0"}).severity, "warning")
|
||||
|
||||
def test_disabled_mesa_is_warning(self):
|
||||
self.assertEqual(gameenv.evaluate_shader_cache({"MESA_SHADER_CACHE_DISABLE": "true"}).severity, "warning")
|
||||
|
||||
def test_default_is_ok(self):
|
||||
self.assertEqual(gameenv.evaluate_shader_cache({}).severity, "ok")
|
||||
|
||||
|
||||
class AggregateTests(unittest.TestCase):
|
||||
def test_run_returns_sorted_findings(self):
|
||||
findings = gameenv.run_gameenv_checks()
|
||||
self.assertTrue(all(isinstance(f, Finding) for f in findings))
|
||||
order = {"critical": 0, "warning": 1, "info": 2, "ok": 3}
|
||||
sevs = [order.get(f.severity, 9) for f in findings]
|
||||
self.assertEqual(sevs, sorted(sevs)) # worst-first
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user