from __future__ import annotations import sys import types from collections import deque from pathlib import Path from dovla_cil.eval.smolvla_runtime import ( ensure_lazy_policies_namespace, ensure_policy_utils_shim, ensure_train_config_type_shim, ) def test_lazy_smolvla_namespace_points_to_installed_policy_directory( tmp_path: Path, monkeypatch, ) -> None: package_dir = tmp_path / "lerobot" policies_dir = package_dir / "policies" policies_dir.mkdir(parents=True) module = types.ModuleType("lerobot") module.__file__ = str(package_dir / "__init__.py") monkeypatch.delitem(sys.modules, "lerobot.policies", raising=False) namespace = ensure_lazy_policies_namespace(module) assert namespace.__path__ == [str(policies_dir)] assert namespace.__spec__ is not None assert namespace.__spec__.submodule_search_locations == [str(policies_dir)] assert sys.modules["lerobot.policies"] is namespace def test_lazy_smolvla_namespace_is_idempotent(tmp_path: Path, monkeypatch) -> None: package_dir = tmp_path / "lerobot" (package_dir / "policies").mkdir(parents=True) module = types.ModuleType("lerobot") module.__file__ = str(package_dir / "__init__.py") monkeypatch.delitem(sys.modules, "lerobot.policies", raising=False) first = ensure_lazy_policies_namespace(module) second = ensure_lazy_policies_namespace(module) assert first is second def test_train_config_shim_exposes_only_required_type(monkeypatch) -> None: configs = types.ModuleType("lerobot.configs") configs.__path__ = [] monkeypatch.setitem(sys.modules, "lerobot.configs", configs) monkeypatch.delitem(sys.modules, "lerobot.configs.train", raising=False) module = ensure_train_config_type_shim() assert module.__dovla_type_only_shim__ is True assert module.TrainPipelineConfig.__module__ == "lerobot.configs.train" assert configs.train is module def test_train_config_shim_preserves_real_import(monkeypatch) -> None: real_module = types.ModuleType("lerobot.configs.train") monkeypatch.setitem(sys.modules, "lerobot.configs.train", real_module) assert ensure_train_config_type_shim() is real_module def test_policy_utils_shim_populates_and_advances_queues(monkeypatch) -> None: monkeypatch.delitem(sys.modules, "lerobot.policies.utils", raising=False) module = ensure_policy_utils_shim() queues = {"observation": deque(maxlen=2), "action": deque(maxlen=2)} result = module.populate_queues( queues, {"observation": "first", "action": "excluded"}, exclude_keys=["action"], ) module.populate_queues(queues, {"observation": "second"}) assert result is queues assert list(queues["observation"]) == ["first", "second"] assert list(queues["action"]) == [] def test_policy_utils_shim_preserves_real_import(monkeypatch) -> None: real_module = types.ModuleType("lerobot.policies.utils") monkeypatch.setitem(sys.modules, "lerobot.policies.utils", real_module) assert ensure_policy_utils_shim() is real_module