73 lines
3.3 KiB
Python
73 lines
3.3 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
SCRIPT = ROOT / "scripts" / "discover_1c_moxel_schema.py"
|
|
SPEC = importlib.util.spec_from_file_location("discover_1c_moxel_schema", SCRIPT)
|
|
assert SPEC and SPEC.loader
|
|
discovery = importlib.util.module_from_spec(SPEC)
|
|
SPEC.loader.exec_module(discovery)
|
|
|
|
|
|
def test_analyze_marker_matrix_infers_inline_text_column_from_last_preceding_scalar() -> None:
|
|
payload = {
|
|
"schema": "codex_1c_template_marker_matrix.v1",
|
|
"rows": [
|
|
{"text": "10-2", "expected_row": 10, "expected_col": 2, "decoded_row": 10, "decoded_col": 3, "preceding": ["9", "0", "3", "1"]},
|
|
{"text": "10-3", "expected_row": 10, "expected_col": 3, "decoded_row": 10, "decoded_col": 4, "preceding": ["2"]},
|
|
{"text": "10-4", "expected_row": 10, "expected_col": 4, "decoded_row": 10, "decoded_col": 11, "preceding": ["3"]},
|
|
],
|
|
}
|
|
|
|
analysis = discovery.analyze_marker_matrix([payload])
|
|
rule = analysis["candidate_rules"][0]
|
|
|
|
assert analysis["current_decoder"]["row_accuracy"] == {"ok": 3, "total": 3}
|
|
assert analysis["current_decoder"]["column_accuracy"] == {"ok": 0, "total": 3}
|
|
assert rule["target"] == "moxel.inline_text_cell.column"
|
|
assert rule["confidence"] == "high"
|
|
assert rule["evidence"] == {"ok": 3, "total": 3}
|
|
assert analysis["row_runs"][0]["sequence_ok"] is True
|
|
|
|
|
|
def test_infer_named_range_rules_from_history_matrix_moves() -> None:
|
|
history_matrix = {
|
|
"transitions": [
|
|
{
|
|
"named_range_changes": {
|
|
"one_based": {
|
|
"before": {"row_start": 7, "row_end": 7, "column_start": 3, "column_end": 3},
|
|
"after": {"row_start": 8, "row_end": 8, "column_start": 3, "column_end": 3},
|
|
},
|
|
"raw_scalars": {
|
|
"before": ["1", "3", "2", "6", "2", "6", "00000000-0000-0000-0000-000000000000", "0"],
|
|
"after": ["1", "3", "2", "7", "2", "7", "00000000-0000-0000-0000-000000000000", "0"],
|
|
},
|
|
}
|
|
},
|
|
{
|
|
"named_range_changes": {
|
|
"one_based": {
|
|
"before": {"row_start": 8, "row_end": 8, "column_start": 3, "column_end": 3},
|
|
"after": {"row_start": 8, "row_end": 8, "column_start": 4, "column_end": 4},
|
|
},
|
|
"raw_scalars": {
|
|
"before": ["1", "3", "2", "7", "2", "7", "00000000-0000-0000-0000-000000000000", "0"],
|
|
"after": ["1", "3", "3", "7", "3", "7", "00000000-0000-0000-0000-000000000000", "0"],
|
|
},
|
|
}
|
|
},
|
|
]
|
|
}
|
|
|
|
result = discovery.infer_named_range_rules(history_matrix, {})
|
|
rules_by_target = {rule["target"]: rule for rule in result["rules"]}
|
|
|
|
assert rules_by_target["moxel.named_range.top"]["raw_scalar_indexes"] == [3, 5]
|
|
assert rules_by_target["moxel.named_range.bottom"]["raw_scalar_indexes"] == [3, 5]
|
|
assert rules_by_target["moxel.named_range.left"]["raw_scalar_indexes"] == [2, 4]
|
|
assert rules_by_target["moxel.named_range.right"]["raw_scalar_indexes"] == [2, 4]
|