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)