80 lines
2.9 KiB
Python
80 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import json
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
SCRIPT = ROOT / "scripts" / "analyze_1c_moxel_property_experiments.py"
|
|
SPEC = importlib.util.spec_from_file_location("analyze_1c_moxel_property_experiments", SCRIPT)
|
|
assert SPEC and SPEC.loader
|
|
experiments = importlib.util.module_from_spec(SPEC)
|
|
SPEC.loader.exec_module(experiments)
|
|
|
|
|
|
def test_analyze_experiment_ranks_target_style_path(tmp_path: Path) -> None:
|
|
before = {
|
|
"structure": {
|
|
"counts": {"cell_style_candidates": 1},
|
|
"cell_style_candidates": [
|
|
{
|
|
"text": "Ячейка 7 - 2",
|
|
"tree_position": "$.39",
|
|
"style_evidence": {"last_7_preceding_values": ["1", "2", "7", "0", "3", "2", "3"]},
|
|
"next_moxel_record": {"type": "atom", "value": "4", "tree_position": "$.40"},
|
|
}
|
|
],
|
|
}
|
|
}
|
|
after = {
|
|
"structure": {
|
|
"counts": {"cell_style_candidates": 1},
|
|
"cell_style_candidates": [
|
|
{
|
|
"text": "Ячейка 7 - 2",
|
|
"tree_position": "$.39",
|
|
"style_evidence": {"last_7_preceding_values": ["1", "2", "7", "0", "3", "2", "3"]},
|
|
"next_moxel_record": {"type": "atom", "value": "5", "tree_position": "$.40"},
|
|
}
|
|
],
|
|
}
|
|
}
|
|
before_path = tmp_path / "before.json"
|
|
after_path = tmp_path / "after.json"
|
|
before_path.write_text(json.dumps(before, ensure_ascii=False), encoding="utf-8")
|
|
after_path.write_text(json.dumps(after, ensure_ascii=False), encoding="utf-8")
|
|
|
|
result = experiments.analyze_experiment(
|
|
{
|
|
"property": "ВертикальноеПоложение",
|
|
"target_text": "Ячейка 7 - 2",
|
|
"before": str(before_path),
|
|
"after": str(after_path),
|
|
},
|
|
tmp_path,
|
|
)
|
|
|
|
assert result["confidence"] in {"medium", "high"}
|
|
assert result["candidate_paths"]
|
|
assert "target_cell_styles" in result["candidate_paths"][0]["path"]
|
|
assert result["candidate_paths"][0]["after"] == "5"
|
|
|
|
|
|
def test_default_probe_plan_covers_core_cell_and_layout_properties() -> None:
|
|
properties = {item["property"] for item in experiments.default_probe_plan()}
|
|
|
|
assert "ГоризонтальноеПоложение" in properties
|
|
assert "ВертикальноеПоложение" in properties
|
|
assert "ШиринаКолонки" in properties
|
|
assert "Объединение" in properties
|
|
|
|
|
|
def test_resolve_manifest_path_accepts_project_relative_paths() -> None:
|
|
path = experiments.resolve_manifest_path(
|
|
"tests/1c/test_moxel_property_experiments.py",
|
|
ROOT / "reports" / "1c-template-baselines",
|
|
)
|
|
|
|
assert path == Path(__file__).resolve()
|