fix(task-25): page_setup_truth and settings_pdf_mediabox_a3 move the sheet to ANSI B before proving A3
A fresh Layout1 is already ISO A3 landscape (ezdxf R2018 default: 420 x 297, plot_rotation 0), so an A3-only /MediaBox read-back passed with page_setup_apply stubbed to a no-op: the A/B gate row and the v4 matrix task could not fail on the setter. Both now apply ANSI B (432 x 279, a size no fresh document has; spec section 9 names it) and read that PDF first, then apply ISO A3, read its PDF, and require the setter's changed.size_mm to have moved from B to A3. The stub fails at the first PDF. The moved-sheet comparison is +/-0.5 mm, the spec's tolerance, not exact: measured live on AutoCAD 2026 (scratch Documents.Add(), closed unsaved), the COM engine reports ANSI B as 431.8 x 279.4 and the DWG To PDF.pc3 file's MediaBox as 431.8 x 279.4 then 420.158 x 297.039 for A3; the task passes there with changed.size_mm [[431.8, 279.4], [420.0, 297.0]]. Headless it is [[432.0, 279.0], [420.0, 297.0]]. tests/test_benchmark_v4.py gains the mutation test the finding describes (setter stubbed -> both rows must fail; both passed on the old code) and a run of the gate row itself; the headless task test asserts the B stage. README rows and the tasks_v4 docstring say what the task now does; the README collected-tests figure follows the two new tests (3282 -> 3284). The regenerated A/B report against v1.5.1 is byte-identical (26 -> 32/32). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FKFStjEFzpGyLq5bMpWxTd
This commit is contained in:
co-authored by
Claude Opus 5
parent
c2942d3c94
commit
18c7c69da6
@@ -376,17 +376,45 @@ async def settings_layer_state_roundtrip():
|
||||
)
|
||||
|
||||
|
||||
def _sheet_near(size_mm, width_mm: float, height_mm: float) -> bool:
|
||||
"""Within the spec's ±0.5 mm: COM measures ANSI B as 431.8 × 279.4."""
|
||||
try:
|
||||
w, h = (float(v) for v in size_mm)
|
||||
except (TypeError, ValueError):
|
||||
return False
|
||||
return abs(w - width_mm) < 0.5 and abs(h - height_mm) < 0.5
|
||||
|
||||
|
||||
async def settings_pdf_mediabox_a3():
|
||||
"""Page setup evidence is the PDF's own /MediaBox (spec §8.3)."""
|
||||
"""Page setup evidence is the PDF's own /MediaBox (spec §8.3).
|
||||
|
||||
A fresh document's Layout1 is already ISO A3 landscape, so an A3-only
|
||||
read-back would pass with the setter stubbed out. The sheet is therefore
|
||||
moved to ANSI B first — 432 × 279, a size no fresh document has (spec §9
|
||||
names it) — and that PDF is read; then ISO A3 is applied and read again.
|
||||
The A3 apply must also report the layout moved from B to A3, so the PDF
|
||||
and the setter's own diff have to agree on where the sheet was.
|
||||
"""
|
||||
from engineering.standards.papers import resolve_page_setup
|
||||
from engineering.standards.plot import batch_plot
|
||||
|
||||
b = await _b()
|
||||
await b.page_setup_apply("Layout1", resolve_page_setup("ISO_A3"))
|
||||
await b.page_setup_apply("Layout1", resolve_page_setup("ANSI_B"))
|
||||
out_dir = tempfile.mkdtemp()
|
||||
report = await batch_plot(b, ["Layout1"], out_dir, "{drawing}-{layout}.pdf")
|
||||
width_mm, height_mm = report["sheets"][0]["mediabox_mm"]
|
||||
return abs(width_mm - 420.0) < 0.5 and abs(height_mm - 297.0) < 0.5
|
||||
report_b = await batch_plot(b, ["Layout1"], out_dir, "{drawing}-{layout}-ansi_b.pdf")
|
||||
width_b, height_b = report_b["sheets"][0]["mediabox_mm"]
|
||||
applied = await b.page_setup_apply("Layout1", resolve_page_setup("ISO_A3"))
|
||||
report_a3 = await batch_plot(b, ["Layout1"], out_dir, "{drawing}-{layout}-iso_a3.pdf")
|
||||
width_a3, height_a3 = report_a3["sheets"][0]["mediabox_mm"]
|
||||
moved = applied["changed"].get("size_mm") or [[0.0, 0.0], [0.0, 0.0]]
|
||||
return (
|
||||
abs(width_b - 432.0) < 0.5
|
||||
and abs(height_b - 279.0) < 0.5
|
||||
and _sheet_near(moved[0], 432.0, 279.0)
|
||||
and _sheet_near(moved[1], 420.0, 297.0)
|
||||
and abs(width_a3 - 420.0) < 0.5
|
||||
and abs(height_a3 - 297.0) < 0.5
|
||||
)
|
||||
|
||||
|
||||
CHECKS = {
|
||||
|
||||
Reference in New Issue
Block a user