diff --git a/domain/modelling/roof_recommendation.py b/domain/modelling/roof_recommendation.py index 76c60241..aa09b620 100644 --- a/domain/modelling/roof_recommendation.py +++ b/domain/modelling/roof_recommendation.py @@ -20,8 +20,10 @@ from repositories.product.product_repository import ProductRepository _LOFT_MEASURE_TYPE = "loft_insulation" # RdSAP 10 Table 16: 0 mm lodged roof insulation is an uninsulated loft. _ROOF_UNINSULATED_MM = 0 -# Recommended loft-insulation depth (mm) — the building-regs standard top-up. -_RECOMMENDED_LOFT_THICKNESS_MM = 270 +# Recommended loft-insulation depth (mm). Elmhurst re-lodges a loft-insulation +# measure at 300 mm; pinning the before→after cascade (000490/001431) requires +# the overlay to match that depth exactly (see test_elmhurst_cascade_pins). +_RECOMMENDED_LOFT_THICKNESS_MM = 300 def recommend_loft_insulation( diff --git a/tests/domain/modelling/fixtures/loft_001431_after.pdf b/tests/domain/modelling/fixtures/loft_001431_after.pdf new file mode 100644 index 00000000..1b76e032 Binary files /dev/null and b/tests/domain/modelling/fixtures/loft_001431_after.pdf differ diff --git a/tests/domain/modelling/fixtures/loft_001431_before.pdf b/tests/domain/modelling/fixtures/loft_001431_before.pdf new file mode 100644 index 00000000..6280eca5 Binary files /dev/null and b/tests/domain/modelling/fixtures/loft_001431_before.pdf differ diff --git a/tests/domain/modelling/test_elmhurst_cascade_pins.py b/tests/domain/modelling/test_elmhurst_cascade_pins.py index 8f7f5e83..bc2d6f32 100644 --- a/tests/domain/modelling/test_elmhurst_cascade_pins.py +++ b/tests/domain/modelling/test_elmhurst_cascade_pins.py @@ -20,6 +20,7 @@ from datatypes.epc.domain.epc_property_data import EpcPropertyData from domain.modelling.package_scorer import PackageScorer, Score from domain.modelling.product import Product from domain.modelling.recommendation import Recommendation +from domain.modelling.roof_recommendation import recommend_loft_insulation from domain.modelling.simulation import EpcSimulation from domain.modelling.wall_recommendation import recommend_cavity_wall from domain.sap10_calculator.calculator import Sap10Calculator, SapResult @@ -79,3 +80,22 @@ def test_cavity_wall_overlay_reproduces_the_relodged_after() -> None: _assert_overlay_reproduces_after( before, after, recommendation.options[0].overlay ) + + +def test_loft_overlay_reproduces_the_relodged_after() -> None: + # Arrange + before: EpcPropertyData = parse_recommendation_summary( + "loft_001431_before.pdf" + ) + after: EpcPropertyData = parse_recommendation_summary( + "loft_001431_after.pdf" + ) + recommendation: Recommendation | None = recommend_loft_insulation( + before, _AnyProduct() + ) + assert recommendation is not None + + # Act / Assert + _assert_overlay_reproduces_after( + before, after, recommendation.options[0].overlay + ) diff --git a/tests/domain/modelling/test_roof_recommendation.py b/tests/domain/modelling/test_roof_recommendation.py index 8acfc5c6..f801ee7d 100644 --- a/tests/domain/modelling/test_roof_recommendation.py +++ b/tests/domain/modelling/test_roof_recommendation.py @@ -46,7 +46,7 @@ def test_uninsulated_loft_yields_a_loft_insulation_recommendation() -> None: option = recommendation.options[0] assert option.measure_type == "loft_insulation" simulated: EpcPropertyData = apply_simulations(baseline, [option.overlay]) - assert _part(simulated, BuildingPartIdentifier.MAIN).roof_insulation_thickness == 270 + assert _part(simulated, BuildingPartIdentifier.MAIN).roof_insulation_thickness == 300 def test_already_insulated_loft_yields_no_recommendation() -> None: