autocad-bench / tests /test_evaluation.py
Dev Mandal
Initial open-source release
0be8f22
Raw
History Blame Contribute Delete
3.85 kB
from __future__ import annotations
import asyncio
import json
from autocad_bench.evaluation.run import evaluate_rollout
from autocad_bench.tasks.manifest import load_manifest
from autocad_bench.evaluation.scoring import GoldCacheStore
from autocad_bench.evaluation.scoring.models import EvaluationFailure
from tests.scoring_helpers import invalid_drawing, valid_drawing
def test_completed_rollout_is_scored_and_publishes_status(tmp_path) -> None:
entry = next(item for item in load_manifest() if item.task_id == "task-001")
candidate_dwg = entry.resolve_gold_path().read_bytes()
drawing = valid_drawing(
candidate_dwg,
evaluator_version="static-test-v1",
drawing_type="2d",
)
rollout_dir = tmp_path / "rollout"
evaluation_dir = rollout_dir / "evaluation"
evaluation_dir.mkdir(parents=True)
(rollout_dir / "attempt.dwg").write_bytes(candidate_dwg)
(evaluation_dir / "metadata.json").write_text(
drawing.metadata.model_dump_json(indent=2),
encoding="utf-8",
)
(evaluation_dir / "render.png").write_bytes(drawing.render_png)
cache = GoldCacheStore(evaluator_version="static-test-v1", root=tmp_path / "gold")
cache.write("task-001", drawing)
outcome = asyncio.run(
evaluate_rollout(
rollout_dir=rollout_dir,
task_id="task-001",
evaluator_version="static-test-v1",
gold_cache_root=tmp_path / "gold",
vision_api_key=None,
vision_enabled=False,
)
)
status = json.loads((evaluation_dir / "status.json").read_text())
score = json.loads((evaluation_dir / "score.json").read_text())
assert outcome["deterministic_score"] == 1.0
assert outcome["vision_skipped_reason"] == "disabled"
assert score["score"] == 1.0
assert (evaluation_dir / "diff.png").is_file()
assert status["stage"] == "completed"
assert status["deterministic_score"] == 1.0
def test_invalid_dwg_gets_a_terminal_zero_without_calling_vision(tmp_path) -> None:
entry = next(item for item in load_manifest() if item.task_id == "task-001")
candidate_dwg = b"AC1032-invalid-candidate"
invalid = invalid_drawing(
candidate_dwg,
EvaluationFailure.EMPTY_MODEL_SPACE,
evaluator_version="static-test-v1",
)
invalid = invalid.model_copy(
update={
"metadata": invalid.metadata.model_copy(
update={"drawing_type": "2d"}
)
}
)
rollout_dir = tmp_path / "rollout"
evaluation_dir = rollout_dir / "evaluation"
evaluation_dir.mkdir(parents=True)
(rollout_dir / "attempt.dwg").write_bytes(candidate_dwg)
(evaluation_dir / "metadata.json").write_text(
invalid.metadata.model_dump_json(indent=2),
encoding="utf-8",
)
(evaluation_dir / "render.png").write_bytes(b"")
gold_dwg = entry.resolve_gold_path().read_bytes()
cache = GoldCacheStore(evaluator_version="static-test-v1", root=tmp_path / "gold")
cache.write(
"task-001",
valid_drawing(
gold_dwg,
evaluator_version="static-test-v1",
drawing_type="2d",
),
)
outcome = asyncio.run(
evaluate_rollout(
rollout_dir=rollout_dir,
task_id="task-001",
evaluator_version="static-test-v1",
gold_cache_root=tmp_path / "gold",
vision_api_key=None,
vision_enabled=True,
)
)
score = json.loads((evaluation_dir / "score.json").read_text())
status = json.loads((evaluation_dir / "status.json").read_text())
assert outcome["deterministic_score"] == 0.0
assert outcome["vision_skipped_reason"] == "invalid_candidate"
assert score["failure_reason"] == "empty_model_space"
assert status["stage"] == "completed"