"""Golden tests for SCENARIO_SHOCK_MATRIX_V1 (governance/todo/v8_9_p2_adoption_plan.yaml P2-A). Maps to v8.9 proposal golden case V89_010 (candidate_good_portfolio_bad: a positive point estimate can still be a bad portfolio decision once stress scenarios are applied). """ from __future__ import annotations import importlib.util from pathlib import Path ROOT = Path(__file__).resolve().parents[3] MODULE_PATH = ROOT / "tools" / "build_scenario_shock_matrix_v1.py" def _load_module(): spec = importlib.util.spec_from_file_location("build_scenario_shock_matrix_v1", MODULE_PATH) module = importlib.util.module_from_spec(spec) assert spec.loader is not None spec.loader.exec_module(module) return module def test_v89_010_crisis_case_worse_than_base_case() -> None: mod = _load_module() distribution = [float(i * 1000) for i in range(-50, 50)] base = mod.evaluate_scenario(distribution, "base_case") crisis = mod.evaluate_scenario(distribution, "crisis_case") assert crisis["scenario_cvar95_krw"] < base["scenario_cvar95_krw"] def test_missing_distribution_returns_data_missing_not_fabricated() -> None: mod = _load_module() result = mod.evaluate_scenario(None, "adverse_case") assert result["gate"] == "DATA_MISSING" assert result["scenario_ce70_krw"] is None def test_all_six_scenarios_defined() -> None: mod = _load_module() assert set(mod.SCENARIO_DEFINITIONS.keys()) == { "base_case", "adverse_case", "liquidity_drought_case", "crisis_case", "fx_shock_case", "tax_cost_case", }