from collections.abc import Callable from types import SimpleNamespace from serena.dashboard import SerenaDashboardAPI from solidlsp.ls_config import Language class _DummyMemoryLogHandler: def get_log_messages(self, from_idx: int = 0): # pragma: no cover - simple stub return SimpleNamespace(messages=[], max_idx=-1) def clear_log_messages(self) -> None: # pragma: no cover - simple stub pass class _DummyAgent: def __init__(self, project: SimpleNamespace | None) -> None: self._project = project def register_config_changed_callback(self, callback: Callable[[], None]) -> None: pass def execute_task(self, func, *, logged: bool | None = None, name: str | None = None): del logged, name return func() def get_active_project(self): return self._project def _make_dashboard(project_languages: list[Language] | None) -> SerenaDashboardAPI: project = None if project_languages is not None: project = SimpleNamespace(project_config=SimpleNamespace(languages=project_languages)) agent = _DummyAgent(project) return SerenaDashboardAPI(memory_log_handler=_DummyMemoryLogHandler(), tool_names=[], agent=agent, tool_usage_stats=None) def test_available_languages_include_experimental_when_no_active_project(): dashboard = _make_dashboard(project_languages=None) response = dashboard._get_available_languages() expected = sorted(lang.value for lang in Language.iter_all(include_experimental=True)) assert response.languages == expected def test_available_languages_exclude_project_languages(): dashboard = _make_dashboard(project_languages=[Language.PYTHON, Language.MARKDOWN]) response = dashboard._get_available_languages() available = set(response.languages) assert Language.PYTHON.value not in available assert Language.MARKDOWN.value not in available # ensure experimental languages remain available for selection assert Language.ANSIBLE.value in available