From 13b18ce9fb6691f9db75a661b01afd308f27fff6 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Thu, 4 Jun 2026 21:16:00 +0000 Subject: [PATCH] feat(modelling): roof dispatcher insulates a flat roof MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slice 3 (ADR-0021). The dispatcher gains a flat-roof branch: a "flat" roof_construction_type with no lodged thickness (uninsulated → None on the Elmhurst path) gets a single flat_roof_insulation Option whose overlay raises roof_insulation_thickness to 200 mm — tested before the loft fallback so a flat roof's None doesn't trip the loft trigger. Pinned against the Elmhurst before→after cert at 1e-4. Golden cohort roof firing unchanged (none across 57). Co-Authored-By: Claude Opus 4.8 --- .../generators/roof_recommendation.py | 16 +++++++++++ .../fixtures/flat_roof_001431_after.pdf | Bin 0 -> 80025 bytes .../fixtures/flat_roof_001431_before.pdf | Bin 0 -> 80928 bytes .../modelling/test_elmhurst_cascade_pins.py | 26 ++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 tests/domain/modelling/fixtures/flat_roof_001431_after.pdf create mode 100644 tests/domain/modelling/fixtures/flat_roof_001431_before.pdf diff --git a/domain/modelling/generators/roof_recommendation.py b/domain/modelling/generators/roof_recommendation.py index c7ab223e..9a3fff36 100644 --- a/domain/modelling/generators/roof_recommendation.py +++ b/domain/modelling/generators/roof_recommendation.py @@ -32,6 +32,9 @@ _ROOF_UNINSULATED_MM = 0 _RECOMMENDED_LOFT_THICKNESS_MM = 300 # Recommended sloping-ceiling depth (mm); Elmhurst re-lodges 100 mm (ADR-0021). _RECOMMENDED_SLOPING_CEILING_THICKNESS_MM = 100 +_FLAT_ROOF_MEASURE_TYPE = "flat_roof_insulation" +# Recommended flat-roof depth (mm); Elmhurst re-lodges 200 mm (ADR-0021). +_RECOMMENDED_FLAT_ROOF_THICKNESS_MM = 200 def recommend_roof_insulation( @@ -65,6 +68,19 @@ def recommend_roof_insulation( thickness_mm=_RECOMMENDED_SLOPING_CEILING_THICKNESS_MM, ) + if "flat" in roof_type: + # A flat roof lodges no thickness when uninsulated ("As Built" → None + # on the Elmhurst path); a lodged thickness means it's already done. + if main.roof_insulation_thickness is not None: + return None + return _roof_recommendation( + epc, + products, + measure_type=_FLAT_ROOF_MEASURE_TYPE, + description="Flat-roof insulation", + thickness_mm=_RECOMMENDED_FLAT_ROOF_THICKNESS_MM, + ) + if "no access" in roof_type: return None # the roof void can't be reached to insulate it diff --git a/tests/domain/modelling/fixtures/flat_roof_001431_after.pdf b/tests/domain/modelling/fixtures/flat_roof_001431_after.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1457baf69de40bbe90b2cc6e5a54d61edc4d30c1 GIT binary patch literal 80025 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 z z*g8fW9JED2lx8njSf-~(M&)>2m#Uoxl?JPq-2^UP@(0oegk_|cc2*n1dUks4<0QJC zSy82q?C)QK zVoB%0s#ag3N8?lpt!*huJ3ji~ZD61Gy%x(A6MudV0fWIE_S0gSlJa$<`c$2;>d~5C zI_&APe{_J%%*xhY*kJL^tMo&B23ZqV*XsDi>6y{dF5CDU{sbYqE_!}4<>*mL+MNHp z4#=qDjdN`p3>&o`0|N_FuL|od2Zr7O+KtE&BhI8v(Wmutk6^0&EdrivU{$ z*do9d0k#ORMSv{=Y!P6K09ypuBES{_wg|9AfGzs}qb+*)LahIUE#mqo&C`G_0&Edr zivU{$*do9d0k#ORMSv{=Y!P6K09ypuBES{_wg|9AfGq-S5nzh|TLjo5z!m|v2(U$f zEdp#2V2c1-^nbi9;`{eHZ~tXm#Qje?Zvk5b*do9d0pk_{;}$ss;}!wq76IcH0pk_{ z;}!wq76IcH0pk|^-8cL{yamQB0>&)@#w`NIEds_Z0>&)@#w`NIE&3llZV~^#*F60% zk6Xm^PnxFzTLjo5z!m|v2(U$fEdp#2V2c1-1lS_L76G;hutk6^0&EdrivU{$*do9d z0k#ORMSv{=Y!P6K09ypuBES{_w&?$OTO{!Bb>9BVwutwiblw8C2(U$fEdp#2V2c1- zlnvM-z!m|v2(U$fEdp#2V2c1-gmTb#Us4K!T&~6v74PT>C3tNCwg|9AfGq-S5nzh| zTLjpm|IxOHgZS04@S>5rB&TTm;~v|Ko8H2gkqHd;2fzBL08U zdkg3yKo6&E&_BBpo;)q1n43_7Xi8m&_%u#KeM;RrGFUoQ&fEs zT|MFt4*+x#po;)q1n43_7XiBHf3_~-{P)_Y|7Bey@K4&O0bK;>B0v`bx(LukfGz@b z5ul3zT?FVNKouy|)}ZY_ecWa|;L+Y)R7I#@&6CIxo2Gy$v1NU%v*LY!5=PLlSv4)%6n zI|vm&o3fEDm`#p@{hxH+^6(0Xh&V%>z(%&HZ-ZaO4Zp?{$M3$Uy|QkwJu{@@uo8~R zI4d|Z6_Pz2h4aMLwe+t{sICmwWC^0=k$y(2@e}(em3&kpJP!yP7cP4=J%#VY%xAWX zKV{dhBJ<*x;NroU&g^`!>H**0YlJ3G@=VY~(HpNK8%i6?g!%jWZ=1H?;Jlud{%WIH z-FRk~aT?A+X$r?r`D3t>#rHmRx)~H9(bc`en&fbjpc{EjwUI0!nuDIgw^!q+d*i5r za7oA7h2c62#%P!-NX>8hx#+L(xcK}ft%sVu84uIkY><}`^MqtW`ewPTWS?Z!PZbgV zXoDTAEgDk{9-`LU;Y-%;u@IMj{}S~ck~4@QG;O=RDQ|4gP& z&h$2K#$&i2C*U&#w?)|PMa;XBmzvk`g*tWA)khfG^1;a+Q7za5!{;Tc_j9C)eBP%VgC|n5KyTY2Q~Y@I zA+!_SouklS@b}FPW|eit(++uTlnj(uvuQn*21=8QKgPtwcu4}HVo7o6c_@&RIeaflBlXF{6;2yGy= z|HGlp^PdTAP9U^_(EbmHHt&BAZE1Tuh!oh_#L3bDV(-NE@b-@?g}9TYkS5yI;i2N;;r(Oc=NF*j<>jN|5a6KV;^O+#1Y5_$ z&;6%;Ve9^K++U9Qf1Cexe^?q1>HIOl^5bCV;Q1r7hYa~RIscd*mU&^!oDX(l59=Nd z=3!_5W50)t_+cmT$G))je;oJc{r-9!?3jmT0dDTUru~rKUryp-&dm$^fnaGp{D6Nw zc~~BQS^gu>KYt*c59a`z9?s!m{*eD)_WR5Hk8~ckKb-5saj@lwb9|WpdD8zQ9{wwK zs5l-%OZC6vfd3!k;J^0%yGZ+&gY56d1pOm~{vU#jY=i>_& z%diWSm;I0V!v*&6HT(a2{~n_Gzg;1Jxgub>JVg1!Ha;#sDlWc1UpcT`|FVvUhm(q% zo&6u9{vpi&E9yD_ZZH59BXcmDijmX9)7ryd@~W~aflV!q9!k-NJ$VFpSULG%S@Uyq zu)<0zetp=JpB)6Yw=)&z!#7i?vZ;cd?OmKqz|KNKe_S*VGgz7XP|B*ZNprx;wTC4U z5w^Fljjg~Y5ZHD(*oXGVW;qV3htCbR_2KpB0{V}1VKw-Nge+|!U|6YdV*~+9fnlXC zm`xFEXAZHT;^61y_?xH3T%CSbQa;@I6Xr6=P#8nw6;H$F@>{OBFR}yf94W6-;d?)% z&U2DPwjHF5-+)nVD&ADey2gr32qaO>)dw^EeD(O}r1(I}eg1D1&Q9&PSMA(`s=Oe* z1xHskEMIbO@|;;YMfxKZx;Kr2Zz}O-wOx5t!f72x??hBdgMtiFS|MCJTO0m{P&kpu zcy%rjMI+1`dM?&U!taSe2UQL{wIu$rv3r-Si_Uc1q)JGtVV@IFYLlN!(h8s}F9@>{ zMa-2>>GPEA(YU?Rzh%ENaS)ubW;k;d^2yP;szSKV*B(EoL~_jTL}^0v9x(Q86(GWw zU=f___BOIGMLt!J+^9=03!SU0^8mlDBTepv%=EMTRw;Ns&%w*2H+>K=>Xn7%IwezB zHzjE)f9_a!X>+w&>~cjo91rjMZ6bV&{|h`BZ@*p0bbJbl^;Zs#%brJTZ;S4@-9Af? zgsQnquEhlV4W3lI)#D$l#qiDVxzPd741v(I-F4e$%bgCrg;Z#^3QCg+$y|1S=gXLV zPWnpBqTbVi5#eHxm7|&prdcxCdspAnuQru9WwI5X+a&m0isZ39(W|j{@3?m_-1eQo zPS@91O{`MaFZ@-&IL2m*z3Bh5{um2tCB`NUvm~wZr5oS*&k6Muxs7pkVeCp zc}aekU+xQyt++;H;Sc6Qp&7Nr)(D!c>=ARD(#P(^Ug8jajW{`ne53g|dUU&3a$zz) zMf=jplhYtMmBAjq3AQ|!YSAPD?4HW5e** zGZ*LG|N5)5a*nU=i=#gVndkc^#o z#fjq)cfF{TjH#5?{cDhkYjQ&}XsRWf*l;+v{l6F&a-IKmXk zM@zt@s4>TZ$wh|=?pYdK$e5;B>bC}3Q)y1T3;dh25l6@-Um z2$`;q0=3ix>t?vEeQ87)m)Gh>?`cM}?naWmw9wVOpBLqPmWN7sL^{Fms~w~~(w30` zk&ni_2R_)b@>o?Le)1`7U+@sL4^Y-kX|Yl4Hrsg$(xT8q;uxA%59w>4eUmXUT5bKc z#S@#pQ9Jsi;91k^rOE!V_JNqF5HVdjo9x=}rb4sQ`>^LPhfNAzJjU=z=-lJU{#16x zdti^Uq{$kr?6yRO8cK;&6OeoUNPG^fW!u(&n!-@gQ2hr5l_;WAtN&nSu)97TBK^<| zM&$A~!+Po_)pKM?QTBOBMur4xA!IoWtoIXyP6jQXxM+f2q&=k$3i{lhdD9q%{UihS zCg)Mr$R0<4e@;a5h(k^E==%k%tQ@f~*TM)V~d#>}!FjQmwI94X7mTuOmKm zILSQ9+fWTT>=`>#E;wMZaLm37LPl{h3sTNS$HA5A^->!_o+3D{DdA0Px5fDaY9Kus zJg<3lDWSHUe@kBX*3BR8v1f|(UMBP%>AiW)x^Z(Qh-GH-^M=OiK(^6EXZ9fx+dT(d zhQ6V~Kc0#Hcj^j%y5Ijhbp=?Z{!euUE~-CQ z;QzL+@L%oM|D>+K%fI$=VbG+C-i_j$#)k;pbYz71dR0Cr^+3nh+dU5~8o(894 zX=Z`?DVLV!_W4Ba@TL_D4AG}C9={?(xXeQmT85tt?M4p^_u`w=je?#^Q|lIEF37p6 z4&0^rWCrii{7U^EFOAe5Z1v6I+t-_yYT+s0ZSG3P38|M~_wJfCY>!PVmW2{uJi)t) z^r9~IH{e`xvVE+_aifhU^X-ek)0AZL#a2f1HuICz6!o_F(RW^5?(+XvDOVj8)z_{? zI)+ZEk#2?=W`;&UVgNz91RNUaP6bA~a{v)gM5H?;rCU&>OB(4C5COUP{qDWrPyN=t zYklAO^IiLW_g?#)^*sB$&vTBe_gjCDsbXE1v)=htxO{!&R&}rG@Kt(qrnFPIksR7| z03elz2}Cvj;$C0X4!Yqp~}dwu`FK#13GPo1p1c*xVIE(s5SeX=aK7i zUJ<<1n#4jqVcQ}t>WBw2w8wr4diP*i*x_WX>QlDQEc;w(L|cK*44=%Z`H@$-<8G-+#j&QP=8U&nJW;W zkk!-lfsFYc;0r~O2)(!50cOS}X<2Ei&^gsDp6b?N+@kDxEe6QPx8{CIG_{B*HPXcA zzywyKNQ$Jpc96AJ3)_y9S+c;a!b=lEd7Y}dt8s)$3<-bc5y7f%*Es)_n3^jk($RFu<(QS;k5 zD~H^c=Yt6DS5K^2?>B!c=2A}F?u*~!_apa6B>5`?g1k2}#dAd{p+a7mfbA}r;(PWzps8y|*EU`HdoTnyfTcqA)luvR?#3LCvE z{CE>6*5o4s7iS^5H?Fx_^g7ToB0 z0_JQF_}<~Po8A$rC;7yIV5+Y(9pN`b@+$1-;TZ1ljiJBHC3(sF@!Oba< zBrLW0n=r$-n~cOsXSvZCWpy=4Ivp!?Q-V?6dpkZt1`U>Xy_J=r3(e(v)uQ%qG7RX{ zouS^J2WIk0De8bvm*iV$dSi5b7kASY-4iD;+4dW5yzr5{dOCg?C=na6emL?z`hnPSPQk4FwJ| zKzxFYX{VW}+G^KPq zFm}jK2(X;E(5+Zrp^oM!P@`%|!DdLA6(uQsH{ur*zqNNU4Iz7ZmlQ>gdp?XMc{ABS zs}L*pB@f;xVSne3)2GD8qhOg9@-3{}`5`FasIp9a-)mI)2YlNau(L~?S$Z0~aShQc zgdk0DhNd9iIL+V{pG*w-zaY`yWT^jyME@efe}_bcfq%V^BcQr77$IZUAUM{~Xb7sDo}@II+66i7Q#$nk z9%q;u&(O=zg(7Gc(QJRF)Nj;^SVTpLw71OrGt`r6Dn&1ttPF-li?Qt`4mPXiVA2IR zxa)9;`l%kyM#P9QJsI&>MsW!=GNE@^5E->2DHH@-)c929O<&(axOu208Q4A<@B}Sn zEhMzR4RGHH=HB3DP7Z%KkvB@&{B49V#uPmnqp5$ap8g?<+>e82gjQh_(KuMF*X zX_i~~b9~`XljNVyzAnU(>8+HZt#l+^b6*7R*AzTsM~E>BzEc$MZM9w6So?}~3|v4Q zZmfjmW$TEB*@ci~wi#Rk!?D7+zsry=cCnp>Paa`1U55L6Z+9sZtD{K{(LC8|w;~R& zi~3&|Jp+P#mN!JsBsVv-2e>yk^8Tv0Df5D~j|k-~iFV9heY&wYm0Sj8QfQ0C9uIsxYMHcJl#qPcuh6|B zcox+T7#sgkbC6~LI=X>UO*PQiJ7u87HE`JT zE1&H%HsejBaa#0RUT8M8!RmG+ZyhP1k6*-myMFBSWoQZ(jbUb0eV=Qcs$LdwfK8oE zx`l<&OSNj0%4jq9wl9h=Nn)|%vHDs)VlU`2H}S3&S9Kd`{>^)3yo%muILTdKC-P9R zK57JFspmxL!lionDt^@CM7~O}Rekv`OzF9Xcm9Q|@x-=3fu5y0t3s$!=VGakv6U&( z_6-T5Fw>Y&i-lq$w4E;B#3(!M>>{Eww3WHPlUM*4V${qNzf)TIdGYC;uVNP`=~W%L zk;}w_lj4~INnjPE*q!%T8(5B$iheY{3&;0}ZKnOIY8H{Xu~ zWtC5 zRz;?GWNOyFqH5e$4>>2$tSo!61F1t{X~y5go?@kGL``97yI<(PjhbNIrF4cgynUdq zzuj!|MLD&=ZL`Y7jP>Fh9d$)_<8%*G)qyvG-vWOO6@1bf@(X9rF zvh<;0wu*W7JV_HUdvYjP_*o(g@lD)gVIQCds~pUT+ad}PensUs2kZX94h%UEF4z_J zudTf2qP~OW`ihsg7>g)yyf~ZfU3^ID(6g4!0sHeoZpi1oUR8Gs1s;q8hy{mQ3f&bQ zSWW@&x$8Fy;n0}-4Yko7%*Cwsi{4aylY2TJukT-^1zV$zFj)R0+Tf@fF_L~cRO)eL zQ|PBWySN+Q*mtzO5rkeQWp0j(-3N!C-*(EXm(wL9Hkj7X)*C|huw2feqTMoKI_POt zs_`3kTrvvAyfh9=+X%G&ZjGu4USd9JENIw(<0WyZ2!CRs&(P?jldwk|qQL!awZ-*D z@m#p`^reZ(?x~NTWv9=(XxQ*`OSb(Ovm53^oPKAO8UPtCmT71OF?u$!JfsMo+^iS; zkxXsUt*^Sb_x^njF|uGq8^ImGts2RP5M3PTNZXI4$QPff>xO5eqIQXpF4&Ezr|VVg zuii*JjX3`Xr6-`DJ3R)(Z;9?2<}eOoH7w46)vBDT@3QW94yjYhy4Ri77SAxC*faNp z_D9&Tg9we6OA5BJ&+XG+pS~_dtOG4r7K&e#=R`F*C|Ii)Q{_3@h>KO08+Bdw$LN$f z!{hAdPV$uI)0xi_mZK+>F#?ZZeUU`eqougw7dY2??RLwE}g5H1AEB_OE|BIsk9eRfW|IuU@L|n^=Kil@dHPn9={(l?l zLPD^=@q4D;J*Q|HMTlnM)JOMVb15eUO$H`$wO%M__Wih(^r^ztrPM@!or!73XUYyNIIRutbP z-04W#e<+wZ6?+wM_8bLY&Y2TlJs}svS(Ndl{gG~OSao4NKH{|en(Hl zCuwn3G@GSQn{hkSnCyj=YAW$j{s67wsfd@Pg0suPvV}2a#B}?;`s6|-caDMVya4f6 z8#8x1N$JipigsAB0U!yQO0IFsygFxo=pZ@&sJKMJ%eHWrY$lssL4mRb4XgV5`#`j8 zgsXs>>xXAg6&{mU;(lGSxj4@8RbRwHx+%Xm+*Rd!MCUXXDi9PgNP$iNid-{DgEu=g zU*29$3$ne0H9;NPtlRya(%eUx?>M##X6IRv>sHOsHI%3v6YG++@W@PdSm#R>5wtUo>A>0$#` z^24EnfS&N@oMI(FZW<6`RU!Y85?=esN}eXCX!JxEYpAw>U5iYmIGcO;N1#o|C_IeH z2yIr{Wfs3kOjbb$yM1(%=E|(ke{rG&5KwZQsYl1xXvH%6^Y9VSSeEwJNA?`yx= z4eyayH^x>jMF>xZT#d?2J6hAWo=VC$BPk!2-5th@H*R(2-b=*$bj)K)_$^WUs?Haa zsm{1Tz|gK3CADo)M&Rwuc3f_idaKqJVV>-pt;}y~QA#0^dY(&pM*2AD^CrF8hkBGR z5e^n%5K(=N5G|nPwDx#RF+7@r&s9$M=z^GrWti7HtF2intHgum>w*_g2c#B&>7o0H ziQI0_YaX zI!8rkx!=C89xA~E6do;q>DX*YtI*DOK(m zyMzIITz#Ny6P(YpuvqROjMjDiy9oOpMwk&s^=u4%6o48pZ-!(Hm%-)?M~t)+umJ9$ zgtLx5dWak2yFWg^MZAf-=&1E32&OXrW8+-LJdg~sX({qabz)P9x8$@mVf_r?&y%d| zoalGjy{l~Z(saz+Y=@@%*3qrrA$8;PDXdX3`0ijW17{gqcEYQ`-PCOi_AmJe0?^)zRbmQl)_7q_W zC7!hxd#%L!x=0*KqTp3tRSkRvh8;R7Dmt1SmL9OH4b^pZMQIeB?tpp|qtFC%2%B1# zb*jFr)CfV-IEBGnr8b(qs1hAN5AxmK_8ihbpCqgungGLFd5xpS>38QJC*XW}#O|$3 zgPO}^d>U2__s%B6O-??${iXhXw3VITr~9|{JsAY1*tspwg7lb~_+0CD|14wm$e_(bI^VpAEv#{es!#M9K z{s6F!WN&ESq%6xELX_kXtWxYR2hfTy#a6^RHd3bToVh_0IX=+d+Mgv>hVBrmc<0*& zZ{^8D+mSM~siThDO%!Jc(ohAOERl4?TPHg{eKrH2loSn3o7Of=03;sVB!f*!kJ&sP znu0kK^mRvku`<`NL)JB@PlE6?Si7U5E~)UmLA&mx)*HJ7T|C^Sl;PCP<4}gy-ZMQJ zJbZ@#0RXoZQtCx6?Hazea$p#^VeQ1joL2e93iGPCsG3SRl;?%n``GsF3!E5D3G?^y zHCV<=-0$>r)3zg57&UUe1G4VdY}7ft#<5_GJ*}xx@ni)Sl_g%a(>BBdw7wq;n-bA{ z{j?-Io)6R~_%2BN0;f?P=Ib06{6w0)v?2ZJ3p(N&EquR^$TqzY;X@e$IUfRELm`)& zwsqMw(x3oPjp2SIU~4-5tJcz*xCMjy$Ld0cZhqQxKWD;6(K=m-8luFOjsS+<+H5N) zRu#`)jW~Y+(t6ohTpXv*!KiZPo1aYiaTt=Jo^c4Lc zhKzI_TSgaxSv>gJ0#5UI($1LxywXFL1>#9-OmeT%9odk64A`<621}J`ZF@(P_9GVl{H1g`lHonmb%$Jx#VVYW;eE=g0wGm)5h~1pSs1` z=I0vEYH3)1D>jrH(hsEv(-wMX**&=H+?47LAgq0(dF~3up74BQxY(&5S8F+S1+na) z;K~F|uSDv#r%U$1EB%d`?WjGkisSbJKvb3*ybceicMPjej&l~DrOsyc@*BA}z1m-& zkXYw_>O=)!P}oCSEvOr4-{OF_90*zS1_#V{csN*VvZiqFqh7{gf56rwDt+Tf)V7+d zvKBCegIn?^Pz(S^@tVy9T147tryav1@b4?=d0B^-1y9 zaZu5p-iu#iLJ;V+&E>b4C$Y$nW)Fa3SdLxiGlMPdm;pxv*=$$nR^uUb67@@%`6v*Dkg{az#a9 zzsKMp5cK!;!9hPQXusBjgG5ArpBD}m`AH?e%zM34@IUGa!{C493XA-)&u|z_^!IxS zhlxP{m_r2gXRZhs^0z&3cSYLTTe=cRNDv5W+4@@keAWatot&<}`S?kA1X5B2Zth4| U_kTQza8U?Ulz^RGUR~k80Nf73bpQYW literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/fixtures/flat_roof_001431_before.pdf b/tests/domain/modelling/fixtures/flat_roof_001431_before.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2220f6169d7b9a1b84e08f6a5db9557050fa2d20 GIT binary patch literal 80928 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 JOfqV+{{y&a$+G|e literal 0 HcmV?d00001 diff --git a/tests/domain/modelling/test_elmhurst_cascade_pins.py b/tests/domain/modelling/test_elmhurst_cascade_pins.py index d6e38983..704cc1fb 100644 --- a/tests/domain/modelling/test_elmhurst_cascade_pins.py +++ b/tests/domain/modelling/test_elmhurst_cascade_pins.py @@ -392,6 +392,32 @@ def test_roof_generator_insulates_a_thatched_roof_as_loft_pinning_its_after() -> ) +def test_roof_generator_insulates_a_flat_roof_pinning_its_after() -> None: + # Arrange — a flat roof, uninsulated (As Built → None on the Elmhurst path); + # the re-lodged after raises it to 200 mm (ADR-0021). + before: EpcPropertyData = parse_recommendation_summary( + "flat_roof_001431_before.pdf" + ) + after: EpcPropertyData = parse_recommendation_summary( + "flat_roof_001431_after.pdf" + ) + + # Act + recommendation: Recommendation | None = recommend_roof_insulation( + before, _AnyProduct() + ) + assert recommendation is not None + options: dict[str, MeasureOption] = { + option.measure_type: option for option in recommendation.options + } + + # Assert — one flat-roof Option whose overlay reproduces the after. + assert set(options) == {"flat_roof_insulation"} + _assert_overlay_reproduces_after( + before, after, options["flat_roof_insulation"].overlay + ) + + def test_solid_floor_overlay_reproduces_the_relodged_after() -> None: # Arrange before: EpcPropertyData = parse_recommendation_summary(