feat(#73): IMP-44 u1~u5 layout override unknown-key guard + frontend zone_geometries validation
Some checks failed
Multi-MDX Regression (IMP-91) / multi-mdx-regression (push) Failing after 23s
Some checks failed
Multi-MDX Regression (IMP-91) / multi-mdx-regression (push) Failing after 23s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -156,3 +156,109 @@ def test_top_1_bottom_2_dynamic_2d_populates_geometry():
|
||||
assert result["dynamic_cols"] is True
|
||||
assert len(result["heights_px"]) == 2 # R rows
|
||||
assert len(result["widths_px"]) == 2 # C cols
|
||||
|
||||
|
||||
# ────────────────────── IMP-44 u5 regression ──────────────────────
|
||||
# Regression coverage for the layout-override unknown-key guard
|
||||
# (Stage 1 root-cause #73). Asserts that foreign-preset keys are
|
||||
# dropped, structured [override-warning] is emitted, and
|
||||
# computation=user_override_geometry is NEVER reported when the
|
||||
# kept-key set is empty (no false override_applied=true).
|
||||
|
||||
|
||||
def test_imp44_h2_with_v2_keys_emits_warning_and_falls_through(capsys):
|
||||
"""horizontal-2 receiving vertical-2 keys (left/right) → all-unknown:
|
||||
drop both, emit warning, fall through to dynamic dispatch.
|
||||
computation must NOT be user_override_geometry."""
|
||||
zones = [_zone("top", 0.6), _zone("bottom", 0.4)]
|
||||
override = {
|
||||
"left": {"x": 0, "y": 0, "w": 0.5, "h": 1.0},
|
||||
"right": {"x": 0.5, "y": 0, "w": 0.5, "h": 1.0},
|
||||
}
|
||||
result = build_layout_css(
|
||||
"horizontal-2", zones, override_zone_geometries=override
|
||||
)
|
||||
captured = capsys.readouterr()
|
||||
assert "[override-warning]" in captured.err
|
||||
assert "layout_preset=horizontal-2" in captured.err
|
||||
assert "unknown_keys=['left', 'right']" in captured.err
|
||||
assert "expected_positions=['top', 'bottom']" in captured.err
|
||||
# All-unknown → no override applied (no silent fallback).
|
||||
assert result["computation"] != "user_override_geometry"
|
||||
raw = result.get("raw_zone_layout") or {}
|
||||
if isinstance(raw, dict):
|
||||
assert raw.get("override_applied") is not True
|
||||
|
||||
|
||||
def test_imp44_v2_with_h2_keys_emits_warning_and_falls_through(capsys):
|
||||
"""vertical-2 receiving horizontal-2 keys (top/bottom) → all-unknown:
|
||||
drop both, emit warning, fall through to dynamic dispatch.
|
||||
computation must NOT be user_override_geometry."""
|
||||
zones = [_zone("left", 0.5), _zone("right", 0.5)]
|
||||
override = {
|
||||
"top": {"x": 0, "y": 0, "w": 1.0, "h": 0.3},
|
||||
"bottom": {"x": 0, "y": 0.3, "w": 1.0, "h": 0.7},
|
||||
}
|
||||
result = build_layout_css(
|
||||
"vertical-2", zones, override_zone_geometries=override
|
||||
)
|
||||
captured = capsys.readouterr()
|
||||
assert "[override-warning]" in captured.err
|
||||
assert "layout_preset=vertical-2" in captured.err
|
||||
assert "unknown_keys=['bottom', 'top']" in captured.err
|
||||
assert "expected_positions=['left', 'right']" in captured.err
|
||||
assert result["computation"] != "user_override_geometry"
|
||||
raw = result.get("raw_zone_layout") or {}
|
||||
if isinstance(raw, dict):
|
||||
assert raw.get("override_applied") is not True
|
||||
|
||||
|
||||
def test_imp44_partial_mix_keeps_known_drops_unknown(capsys):
|
||||
"""horizontal-2 receiving {top (known), left (unknown)}: keep top,
|
||||
drop left, emit warning naming only 'left'. override_applied=True
|
||||
must hold and the source must contain only the kept key."""
|
||||
zones = [_zone("top", 0.6), _zone("bottom", 0.4)]
|
||||
override = {
|
||||
"top": {"x": 0, "y": 0, "w": 1.0, "h": 0.3},
|
||||
"left": {"x": 0, "y": 0, "w": 0.5, "h": 1.0},
|
||||
}
|
||||
result = build_layout_css(
|
||||
"horizontal-2", zones, override_zone_geometries=override
|
||||
)
|
||||
captured = capsys.readouterr()
|
||||
assert "[override-warning]" in captured.err
|
||||
assert "unknown_keys=['left']" in captured.err
|
||||
# Known key applied → user_override_geometry computation.
|
||||
assert result["computation"] == "user_override_geometry"
|
||||
raw = result["raw_zone_layout"]
|
||||
assert raw["override_applied"] is True
|
||||
assert set(raw["source"].keys()) == {"top"}
|
||||
# Sanity: top ratio (0.3) drives heights_px[0] < heights_px[1].
|
||||
assert result["heights_px"][0] < result["heights_px"][1]
|
||||
|
||||
|
||||
def test_imp44_2d_preset_with_h2_keys_emits_warning_and_falls_through(capsys):
|
||||
"""2-D preset (top-1-bottom-2) receiving horizontal-2 keys
|
||||
(top/bottom): all-unknown vs T positions
|
||||
{top, bottom-left, bottom-right} → drop all, emit warning,
|
||||
fall through to 2-D dynamic dispatch."""
|
||||
zones = [
|
||||
_zone("top", 0.5),
|
||||
_zone("bottom-left", 0.25),
|
||||
_zone("bottom-right", 0.25),
|
||||
]
|
||||
override = {
|
||||
"bottom": {"x": 0, "y": 0.3, "w": 1.0, "h": 0.7},
|
||||
}
|
||||
result = build_layout_css(
|
||||
"top-1-bottom-2", zones, override_zone_geometries=override
|
||||
)
|
||||
captured = capsys.readouterr()
|
||||
assert "[override-warning]" in captured.err
|
||||
assert "layout_preset=top-1-bottom-2" in captured.err
|
||||
assert "unknown_keys=['bottom']" in captured.err
|
||||
# All-unknown → 2-D dynamic fallback (not user_override_geometry).
|
||||
assert result["computation"] == "2d_dynamic_aggregated"
|
||||
raw = result.get("raw_zone_layout") or {}
|
||||
if isinstance(raw, dict):
|
||||
assert raw.get("override_applied") is not True
|
||||
|
||||
Reference in New Issue
Block a user