From 0008c33ea915bac53df1b097915a150b279e75fe Mon Sep 17 00:00:00 2001 From: Jun-te Kim Date: Thu, 11 Jun 2026 11:55:46 +0000 Subject: [PATCH] =?UTF-8?q?Map=20Not-Defined=20glazing=20code=20to=20a=20v?= =?UTF-8?q?alid=20type=20for=20windowless=2018.0=20certs=20=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- .../domain/tests/test_from_rdsap_schema.py | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/datatypes/epc/domain/tests/test_from_rdsap_schema.py b/datatypes/epc/domain/tests/test_from_rdsap_schema.py index 8e88bb77..3ff99b4e 100644 --- a/datatypes/epc/domain/tests/test_from_rdsap_schema.py +++ b/datatypes/epc/domain/tests/test_from_rdsap_schema.py @@ -1553,3 +1553,55 @@ class TestRdSap18_0ReducedFieldSynthesis: # Assert total_area = sum(w.window_width * w.window_height for w in result.sap_windows) assert total_area == pytest.approx(0.148 * tfa * 1.25) + + def test_synthesised_glazing_type_routed_through_cascade(self) -> None: + # Arrange — ADR-0028: 18.0 multiple_glazing_type shares 20.0.0's code + # space (verified vs epc_codes.csv), so route it through the verified + # cascade — code 1 ("DG pre-2002") must remap to 2, not be read as single. + # A windowless cert lodging multiple_glazing_type=1. + corpus = _load_18_0_corpus() + if not corpus: + pytest.skip("no RdSAP-Schema-18.0 corpus harvested") + cert = next( + ( + c + for c in corpus + if not c.get("sap_windows") and c.get("multiple_glazing_type") == 1 + ), + None, + ) + if cert is None: + pytest.skip("no corpus cert with multiple_glazing_type=1") + + # Act + result = EpcPropertyDataMapper.from_api_response(cert) + + # Assert — cascade remaps 1 ("DG pre-2002") -> 2 (double), not raw 1. + assert all(w.glazing_type == 2 for w in result.sap_windows) + + def test_synthesised_glazing_type_handles_not_defined_code(self) -> None: + # Arrange — ADR-0028: 69/1000 18.0 certs lodge multiple_glazing_type "ND" + # (Not Defined), a string the int-keyed cascade cannot map. The + # synthesised window must carry a valid INTEGER glazing_type (treated as + # DG-modal, matching the calculator's _G_LIGHT_DEFAULT), never the raw + # "ND" string on an int field. A windowless cert lodging "ND". + corpus = _load_18_0_corpus() + if not corpus: + pytest.skip("no RdSAP-Schema-18.0 corpus harvested") + cert = next( + ( + c + for c in corpus + if not c.get("sap_windows") and c.get("multiple_glazing_type") == "ND" + ), + None, + ) + if cert is None: + pytest.skip("no windowless corpus cert with multiple_glazing_type ND") + + # Act + result = EpcPropertyDataMapper.from_api_response(cert) + + # Assert — every synthesised window has an int glazing_type, not "ND". + assert result.sap_windows + assert all(isinstance(w.glazing_type, int) for w in result.sap_windows)