75 lines
2.3 KiB
Python
75 lines
2.3 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from scripts.export_yolo_diagnostic_evaluation_tiles import (
|
|
is_canonical_evaluation_window,
|
|
validate_diagnostic_manifest,
|
|
)
|
|
|
|
|
|
def _write_manifest(tmp_path: Path, *, split: str = "calibration") -> Path:
|
|
manifest = tmp_path / "operator_samples_manifest.json"
|
|
manifest.write_text(
|
|
json.dumps(
|
|
{
|
|
"purpose": "non_protected_diagnostic_evaluation",
|
|
"training_eligibility": {
|
|
"status": "not_eligible_evaluation_only"
|
|
},
|
|
"samples": [
|
|
{
|
|
"sample_slug": "fresh-aoi",
|
|
"split": split,
|
|
"sample_role": "positive",
|
|
}
|
|
],
|
|
}
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
import hashlib
|
|
|
|
digest = hashlib.sha256(manifest.read_bytes()).hexdigest()
|
|
(tmp_path / "NO_TRAINING.json").write_text(
|
|
json.dumps({"training_allowed": False, "manifest_sha256": digest}),
|
|
encoding="utf-8",
|
|
)
|
|
return manifest
|
|
|
|
|
|
def test_validate_diagnostic_manifest_accepts_bound_calibration(tmp_path: Path) -> None:
|
|
manifest = _write_manifest(tmp_path)
|
|
|
|
payload = validate_diagnostic_manifest(manifest)
|
|
|
|
assert payload["samples"][0]["sample_slug"] == "fresh-aoi"
|
|
|
|
|
|
def test_validate_diagnostic_manifest_rejects_training_split(tmp_path: Path) -> None:
|
|
manifest = _write_manifest(tmp_path, split="train")
|
|
|
|
with pytest.raises(ValueError, match="calibration-only"):
|
|
validate_diagnostic_manifest(manifest)
|
|
|
|
|
|
def test_validate_diagnostic_manifest_rejects_unbound_marker(tmp_path: Path) -> None:
|
|
manifest = _write_manifest(tmp_path)
|
|
(tmp_path / "NO_TRAINING.json").write_text(
|
|
json.dumps({"training_allowed": False, "manifest_sha256": "0" * 64}),
|
|
encoding="utf-8",
|
|
)
|
|
|
|
with pytest.raises(ValueError, match="not bound"):
|
|
validate_diagnostic_manifest(manifest)
|
|
|
|
|
|
def test_canonical_evaluation_window_rejects_overlapping_edge_cover() -> None:
|
|
assert is_canonical_evaluation_window(
|
|
{"row_off": 512, "col_off": 512, "height": 512, "width": 512}, 512
|
|
)
|
|
assert not is_canonical_evaluation_window(
|
|
{"row_off": 521, "col_off": 512, "height": 512, "width": 512}, 512
|
|
)
|