Files
2026Technology-Competition/tests/test_phase5_scorer.py
T

83 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Phase5-T11(缩减版):验证 EvalReport.per_chapter 与 failed_chapters 被正确填充。
真实 score() 签名为 score(chapters: list[ChapterArtifact], source: StructuredSource)
故测试按真实签名构造输入(使用 ChapterArtifact)。
"""
from __future__ import annotations
from genesis.data_models import (
CellValue,
ExcelTable,
ParsedTemplate,
Provenance,
SheetType,
StructuredSource,
)
from genesis.eval.scorer import ChapterArtifact, ChapterScorer, EvalReport
def _source() -> StructuredSource:
cell = CellValue(
value="登録",
provenance=Provenance(file_name="f.xlsx", sheet_name="機能一覧", row=3, column="C", column_header="x"),
)
table = ExcelTable(
name="機能一覧", detected_type=SheetType.FUNCTION,
extraction_method="structured", headers=["v"], rows=[{"v": cell}],
)
return StructuredSource(
tables=[table],
template=ParsedTemplate(file_name="t.docx", sections=[], placeholders={}, styles={}),
rule_docs=[], image_analyses=[], existing_system=None, comments=[],
)
def _artifact(cid: str, text: str) -> ChapterArtifact:
return ChapterArtifact(
chapter_id=cid, text=text, source_uris=[], template_sections_expected=[cid],
)
def test_score_populates_per_chapter_and_failed():
source = _source()
good = _artifact("a", "充分且规范的说明内容,满足写入规则要求。")
bad = _artifact("b", "x") # 过短/不充分 -> 应判失败
report: EvalReport = ChapterScorer().score([good, bad], source)
assert isinstance(report.per_chapter, list)
assert len(report.per_chapter) == 2
assert all(isinstance(r, EvalReport) for r in report.per_chapter)
assert isinstance(report.failed_chapters, list)
assert "b" in report.failed_chapters # 不充分章节被标记
def test_per_chapter_reports_have_dimensions():
source = _source()
artifacts = [_artifact("a", "充分且规范的说明内容,满足写入规则要求。"), _artifact("b", "x")]
report = ChapterScorer().score(artifacts, source)
for r in report.per_chapter:
assert len(r.dimensions) > 0
assert 0.0 <= r.total_score <= 1.0
def test_per_chapter_failed_chapters_aligns():
"""每个逐章报告自身的 failed_chapters 应与顶层 failed_chapters 一致。"""
source = _source()
artifacts = [_artifact("a", "充分且规范的说明内容,满足写入规则要求。"), _artifact("b", "x")]
report = ChapterScorer().score(artifacts, source)
failed_ids = {ch for ch in report.failed_chapters}
for ch, r in zip(artifacts, report.per_chapter):
if ch.chapter_id in failed_ids:
assert ch.chapter_id in r.failed_chapters
else:
assert r.failed_chapters == []
def test_empty_chapters_backward_compatible():
"""空章节输入:向后兼容,per_chapter/failed_chapters 为空列表。"""
source = _source()
report = ChapterScorer().score([], source)
assert report.per_chapter == []
assert report.failed_chapters == []
assert report.total_score == 1.0