test(s54): value_report overlap-flag load-bearing seam
This commit is contained in:
parent
dd566025a4
commit
9b81a6e416
1 changed files with 71 additions and 0 deletions
71
tests/test_value_report_loadbearing.py
Normal file
71
tests/test_value_report_loadbearing.py
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
"""Load-bearing seam for the S5.4 value report's overlap flagging (målbilde §7).
|
||||||
|
|
||||||
|
DETACH POINTS THAT TURN THIS RED (documented, not stubbed — the assertions ARE the seam lock):
|
||||||
|
1. Drop the ``overlaps=ledger.overlaps()`` surfacing in ``build_value_report`` -> the marker
|
||||||
|
overlap key vanishes from BOTH the text and the JSON output -> the positive arm goes RED.
|
||||||
|
2. Bypass the ledger's dimension-free dedup (``_dedup_amount`` / ``_sum_key``) -> the same
|
||||||
|
candidate realized under two dimensions is double-counted -> ``portfolio_total_ore`` doubles to
|
||||||
|
``2 * _MARKER_ORE`` -> the control arm goes RED.
|
||||||
|
|
||||||
|
The MARKER amount + identity appear NOWHERE else in the repo (marker convention,
|
||||||
|
``tests/test_run_cli_loadbearing.py:25``; absence grep-verified before choosing), so a rendered
|
||||||
|
match is provably caused by THIS ledger flowing through the report, not by incidental repo text.
|
||||||
|
|
||||||
|
Reuses the same-candidate-two-dimensions construction from
|
||||||
|
``tests/test_ledger_loadbearing.py:52-66``, rendered through the report.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
from portfolio_optimiser.ledger import LedgerEntry, SavingsLedger
|
||||||
|
from portfolio_optimiser.value_report import (
|
||||||
|
build_value_report,
|
||||||
|
dump_report_json,
|
||||||
|
format_report_text,
|
||||||
|
)
|
||||||
|
|
||||||
|
_MARKER_ORE = 58917 # marker: appears nowhere else in the codebase
|
||||||
|
_MARKER_ID = "c-marker-overlap-s54" # marker: appears nowhere else in the codebase
|
||||||
|
|
||||||
|
|
||||||
|
def _overlap_ledger() -> SavingsLedger:
|
||||||
|
"""One candidate (``_MARKER_ID``) realized under TWO dimensions (energi + asfalt) in P1 — a
|
||||||
|
distinct FULL storage key each, so both are stored (the overlap is visible), while the
|
||||||
|
dimension-free dedup counts the ``_MARKER_ORE`` amount ONCE."""
|
||||||
|
led = SavingsLedger()
|
||||||
|
for dimension in ("energi", "asfalt"):
|
||||||
|
led.add_realized(
|
||||||
|
LedgerEntry(
|
||||||
|
project_id="P1",
|
||||||
|
dimension=dimension,
|
||||||
|
candidate_identity=_MARKER_ID,
|
||||||
|
amount_ore=_MARKER_ORE,
|
||||||
|
verdict_id="v-marker",
|
||||||
|
provenance="marker-prov",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return led
|
||||||
|
|
||||||
|
|
||||||
|
def test_overlap_marker_is_flagged_in_both_renderings() -> None:
|
||||||
|
"""POSITIVE: the marker overlap key ``(P1, _MARKER_ID)`` reaches BOTH the human table AND the
|
||||||
|
JSON ``overlaps`` list. RED if ``build_value_report`` stops surfacing ``ledger.overlaps()``."""
|
||||||
|
report = build_value_report(_overlap_ledger())
|
||||||
|
|
||||||
|
assert ("P1", _MARKER_ID) in report.overlaps
|
||||||
|
assert _MARKER_ID in format_report_text(report) # flagged in the rendered table
|
||||||
|
|
||||||
|
payload = json.loads(dump_report_json(report))
|
||||||
|
assert ["P1", _MARKER_ID] in payload["overlaps"] # flagged in the JSON (tuple -> list)
|
||||||
|
|
||||||
|
|
||||||
|
def test_overlap_amount_counted_once_not_doubled() -> None:
|
||||||
|
"""CONTROL: the cross-dimension overlap is counted ONCE in the portfolio total, never doubled.
|
||||||
|
RED if the ledger's dimension-free dedup is bypassed (the total would become ``2 * _MARKER_ORE``
|
||||||
|
= 117834). This is the exact double-count the ledger's dedup was built to prevent."""
|
||||||
|
report = build_value_report(_overlap_ledger())
|
||||||
|
|
||||||
|
assert report.portfolio_total_ore == _MARKER_ORE # once, NOT 2 * _MARKER_ORE
|
||||||
|
assert report.per_project["P1"] == _MARKER_ORE
|
||||||
Loading…
Add table
Add a link
Reference in a new issue