"""Tests for tools/lint_project.py, the project policy linter."""
from __future__ import annotations
from pathlib import Path
import lint_project as lp
from conftest import PROJECT_ROOT
GOOD_MANIFEST = "\n"
def make_project(tmp_path: Path, files: dict[str, str]) -> Path:
for name, text in {"manifest.xml": GOOD_MANIFEST, **files}.items():
path = tmp_path / name
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(text, encoding="utf-8")
return tmp_path
def codes(root: Path) -> list[tuple[str, str, int]]:
return [(str(p.path), p.code, p.line) for p in lp.lint(root)]
def test_clean_project_passes(tmp_path: Path) -> None:
root = make_project(
tmp_path,
{
"source/util/Diag.mc": '// Diag\nSystem.println("DIAG {}");\n',
"source/otp/Base32.mc": (
'// Base32\nconst ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; // lint: allow-literal\n'
),
"test/T.mc": (
"// T\n"
'System.println("debug output in tests is allowed");\n'
'const V = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ";\n'
),
},
)
assert codes(root) == []
def test_each_rule_fires(tmp_path: Path) -> None:
root = make_project(
tmp_path,
{
"source/app/NoHeader.mc": "import Toybox.Lang;\n",
"source/app/Log.mc": '// Log\nSystem.println("secret?");\n',
"source/app/Todo.mc": "// Todo\nvar x = 1; // TODO finish\n",
"source/app/Secret.mc": (
'// Secret\nconst S = "JBSWY3DPEHPK3PXPJBSWY3DP";\nconst H = "0123456789abcdef0123456789abcdef";\n'
),
"source/app/Net.mc": "// Net\nimport Toybox.Communications;\n",
},
)
assert codes(root) == [
("source/app/Log.mc", "MC002", 2),
("source/app/Net.mc", "MC005", 2),
("source/app/NoHeader.mc", "MC001", 1),
("source/app/Secret.mc", "MC004", 2),
("source/app/Secret.mc", "MC004", 3),
("source/app/Todo.mc", "MC003", 2),
]
def test_println_in_comment_is_ignored(tmp_path: Path) -> None:
root = make_project(tmp_path, {"source/app/A.mc": "// A\nvar a = 1; // System.println(a)\n"})
assert codes(root) == []
def test_manifest_permissions_are_rejected(tmp_path: Path) -> None:
root = make_project(
tmp_path,
{"manifest.xml": '\n\n\n'},
)
assert codes(root) == [("manifest.xml", "MC005", 2)]
def test_project_passes_its_own_rules() -> None:
problems = lp.lint(PROJECT_ROOT)
assert problems == [], "\n".join(map(str, problems))