-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_language_pack.py
More file actions
95 lines (76 loc) · 3.55 KB
/
Copy pathtest_language_pack.py
File metadata and controls
95 lines (76 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
"""Тесты опционального language-pack слоя (Workstream B).
Проверяют:
1. Выключенный гейт (по умолчанию): слой не активен, стандартное поведение.
2. Включённый гейт (MSCODEBASE_LANGUAGE_PACK=true) + установленный пакет:
регистрация парсеров новых языков и SCM-символы (.lua).
3. Fallback queries: язык без вендоренного tags.scm берёт query из language-pack.
4. Фильтр мусорных имён (макро-грамматики).
Пакет tree-sitter-language-pack в dev-окружении установлен (extra).
"""
import re
import pytest
from src.core import language_pack
@pytest.fixture(autouse=True)
def _reset_language_pack():
"""Сбрасывает модульное состояние между тестами."""
language_pack._tried = False
language_pack._enabled = False
language_pack._parsers.clear()
language_pack._tags.clear()
yield
language_pack._tried = False
language_pack._enabled = False
language_pack._parsers.clear()
language_pack._tags.clear()
class TestDisabledByDefault:
def test_env_gate_off(self, monkeypatch):
monkeypatch.delenv("MSCODEBASE_LANGUAGE_PACK", raising=False)
assert not language_pack.is_enabled()
result = language_pack.try_enable()
assert result["enabled"] is False
assert "MSCODEBASE_LANGUAGE_PACK" in result["reason"]
@pytest.fixture()
def enabled(monkeypatch):
pytest.importorskip("tree_sitter_language_pack")
monkeypatch.setenv("MSCODEBASE_LANGUAGE_PACK", "true")
return language_pack.try_enable()
class TestEnabled:
def test_registers_parsers_and_tags(self, enabled):
assert enabled["enabled"] is True
assert enabled["languages"] >= 50
assert enabled["tags_queries"] >= 50
assert ".lua" in enabled["extensions"]
def test_lua_scm_symbols(self, enabled, tmp_path):
from src.core.indexing.parser import CodeParser
parser = CodeParser()
f = tmp_path / "sample.lua"
f.write_text(
"local M = {}\n"
"function M.greet(name)\n"
" return 'Hi ' .. name\n"
"end\n"
"local function helper()\n"
" return 42\n"
"end\n",
encoding="utf-8",
)
_, symbols = parser.parse_file(f)
names = {s["name"] for s in symbols}
assert "greet" in names
assert "helper" in names
# мусор макро-грамматик отфильтрован (валидные идентификаторы)
for s in symbols:
assert re.fullmatch(r"[A-Za-z_][A-Za-z0-9_]*", s["name"])
def test_no_garbage_from_macro_grammars(self, enabled):
"""Известный шум (elixir) исключён из карты — не регистрируется."""
assert "elixir" not in language_pack.LANG_EXT_MAP
assert ".ex" not in enabled["extensions"]
def test_excluded_conflict_matlab(self, enabled):
"""MATLAB пропущен: .m пересекается с Objective-C."""
assert "matlab" not in language_pack.LANG_EXT_MAP
class TestFileGuardExtension:
def test_dynamic_extensions_propagate(self, enabled):
from src.core.extensions import DYNAMIC_EXTENSIONS
from src.core.indexing.file_guard import FileGuard
assert ".lua" in DYNAMIC_EXTENSIONS
assert ".lua" in FileGuard.SUPPORTED_EXTENSIONS