from __future__ import annotations import pytest from dovla_cil.sim import genesis_backend, maniskill_backend from dovla_cil.sim.registry import create_backend, get_backend_class, list_backends from dovla_cil.sim.toy_backend import ToyBackend def test_registry_can_list_optional_backends() -> None: backends = list_backends() assert "toy" in backends assert "maniskill" in backends assert "genesis" in backends def test_maniskill_backend_class_imports_without_dependency() -> None: backend_class = get_backend_class("maniskill") assert backend_class.__name__ == "ManiSkillBackend" def test_genesis_backend_class_imports_without_dependency() -> None: backend_class = get_backend_class("genesis") assert backend_class.__name__ == "GenesisBackend" def test_requesting_maniskill_without_dependency_gives_clean_error( monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setattr(maniskill_backend, "_find_maniskill_module", lambda: None) with pytest.raises(ImportError) as exc_info: create_backend("maniskill") message = str(exc_info.value) assert "Install optional dependency with" in message assert "OPENCLAUDE" not in message def test_requesting_genesis_without_dependency_gives_clean_error( monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setattr(genesis_backend, "_find_genesis_module", lambda: None) with pytest.raises(ImportError) as exc_info: create_backend("genesis") message = str(exc_info.value) assert "Install optional dependency with" in message assert "OPENCLAUDE" not in message def test_unknown_backend_raises_value_error() -> None: with pytest.raises(ValueError): create_backend("unknown") def test_toy_backend_unaffected() -> None: assert isinstance(create_backend("toy"), ToyBackend)