UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

427 lines (393 loc) 13.9 kB
import corpus from '../../../../../../test/corpus-sano.json'; import { getAdemeFileJson } from '../../../../../../test/test-helpers.js'; import { DeperditionMurService } from './deperdition-mur.service.js'; import { ContexteBuilder } from '../../contexte.builder.js'; import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js'; import { TvStore } from '../../../../dpe/infrastructure/tv.store.js'; import { beforeEach, describe, expect, test } from 'vitest'; /** @type {DeperditionMurService} **/ let service; /** @type {DpeNormalizerService} **/ let normalizerService; /** @type {ContexteBuilder} **/ let contexteBuilder; describe('Calcul de déperdition des murs', () => { beforeEach(() => { service = new DeperditionMurService(new TvStore()); normalizerService = new DpeNormalizerService(); contexteBuilder = new ContexteBuilder(); }); describe('Determination de uMur et uMur0', () => { test.each([ { label: 'cas 2187E1039187C mur 1', enumMateriauxStructureMurId: '2', enumMethodeSaisieUId: '8', enumMethodeSaisieU0Id: '2', paroiAncienne: false, epaisseurStructure: 60, enumTypeIsolationId: '9', enumTypeDoublageId: '2', enumPeriodeConstructionId: '2', zoneClimatiqueId: '3', umurExpected: 1, umur0Expected: 1.8 }, { label: "(2287E0577966W) Mur 2 Sud, Est, Ouest (p1) - Mur en blocs de béton creux d'épaisseur ≥ 25 cm avec un doublage rapporté donnant sur l'extérieur", enumMateriauxStructureMurId: '12', enumMethodeSaisieUId: '7', enumMethodeSaisieU0Id: '2', paroiAncienne: false, enumTypeIsolationId: '1', enumTypeDoublageId: '4', enumPeriodeConstructionId: '1', enumIsolationId: '5', epaisseurStructure: 25, zoneClimatiqueId: '3', umurExpected: 0.8, // 0.7 dans le DPE original, mais certainement lié à une erreur umur0Expected: 1.55091 } ])( '$label', ({ enumMateriauxStructureMurId, enumMethodeSaisieUId, enumMethodeSaisieU0Id, enumTypeDoublageId, enumTypeIsolationId, umurSaisi, epaisseurStructure, paroiAncienne, resistanceIsolation, umurExpected, umur0Expected, enumPeriodeConstructionId = 1, enumIsolationId, effetJoule = false, zoneClimatiqueId = '1' }) => { /** @type {Contexte} */ const ctx = { effetJoule, enumPeriodeConstructionId, zoneClimatique: { id: zoneClimatiqueId } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: enumMateriauxStructureMurId, enum_methode_saisie_u_id: enumMethodeSaisieUId, enum_methode_saisie_u0_id: enumMethodeSaisieU0Id, umur_saisi: umurSaisi, resistance_isolation: resistanceIsolation, paroi_ancienne: paroiAncienne, epaisseur_structure: epaisseurStructure, enum_type_doublage_id: enumTypeDoublageId, enum_type_isolation_id: enumTypeIsolationId, enum_periode_isolation_id: enumIsolationId }; const di = service.execute(ctx, de); expect(di.umur0).toBe(umur0Expected); expect(di.umur).toBeCloseTo(umurExpected); } ); test("Mur 1 Sud, Est, Ouest (p1) - Mur en blocs de béton pleins d'épaisseur ≤ 20 cm avec isolation intérieure (10 cm) donnant sur l'extérieur", () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '6', zoneClimatique: { id: '3' } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '11', enum_methode_saisie_u_id: '3', enum_methode_saisie_u0_id: '2', paroi_ancienne: false, epaisseur_structure: 20, enum_type_doublage_id: '2', enum_type_isolation_id: '3', epaisseur_isolation: 10 }; const di = service.execute(ctx, de); expect(di.umur0).toBe(2.5); expect(di.umur).toBeCloseTo(0.3448275862068969); }); test('Mur 1 Nord - Mur en pierre de taille et moellons avec remplissage tout venant d'épaisseur 70 cm avec isolation intérieure (10 cm) donnant sur l'extérieur', () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '6', zoneClimatique: { id: '3' } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '3', enum_methode_saisie_u_id: '3', enum_methode_saisie_u0_id: '2', paroi_ancienne: true, epaisseur_structure: 70, enum_type_doublage_id: '2', enum_type_isolation_id: '3', epaisseur_isolation: 10 }; const di = service.execute(ctx, de); expect(di.umur0).toBe(1.45); expect(di.umur).toBeCloseTo(0.31351351351351353); }); test("(2387E0430619S) Mur 3 Nord, Est (p1) - Mur en placoplatre isolé par l'intérieur (environ 10 cm) avec isolation intérieure donnant sur des circulations avec ouverture directe sur l'extérieur", () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '6', zoneClimatique: { id: '3' } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '23', enum_methode_saisie_u_id: '9', enum_methode_saisie_u0_id: '5', paroi_ancienne: false, enum_type_doublage_id: '2', enum_type_isolation_id: '3', umur_saisi: 0.32 }; const di = service.execute(ctx, de); expect(di.umur0).toBeUndefined(); expect(di.umur).toBeCloseTo(0.32); }); test("Mur 1 Nord, Sud, Ouest (p1) - Mur en pierre de taille et moellons avec remplissage tout venant d'épaisseur 50 cm non isolé donnant sur l'extérieur", () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '6', zoneClimatique: { id: '3' } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '3', enum_methode_saisie_u_id: '1', enum_methode_saisie_u0_id: '2', enduit_isolant_paroi_ancienne: true, epaisseur_structure: 50, enum_type_doublage_id: '2', enum_type_isolation_id: '2' }; const di = service.execute(ctx, de); expect(di.umur0).toBeCloseTo(0.81545); expect(di.umur).toBeCloseTo(0.81545); }); test("Mur 8 Est - Mur en pierre de taille et moellons avec remplissage tout venant d'épaisseur 50 cm avec un doublage rapporté non isolé donnant sur l'extérieur", () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '6', zoneClimatique: { id: '3' } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '3', enum_methode_saisie_u_id: '1', enum_methode_saisie_u0_id: '2', paroi_ancienne: true, epaisseur_structure: 50, enum_type_doublage_id: '3', enum_type_isolation_id: '2' }; const di = service.execute(ctx, de); expect(di.umur0).toBeCloseTo(1.59664); expect(di.umur).toBeCloseTo(1.59664); }); test('(2287E0577966W) umur 0.7 au lieu de 0.8', () => { /** @type {Contexte} */ const ctx = { effetJoule: true, enumPeriodeConstructionId: '1', zoneClimatique: { id: '3' } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '12', enum_methode_saisie_u_id: '7', enum_methode_saisie_u0_id: '2', paroi_ancienne: false, epaisseur_structure: 25, enum_type_doublage_id: '4', enum_type_isolation_id: '1', enum_periode_isolation_id: '5' }; const di = service.execute(ctx, de); expect(di.umur0).toBeCloseTo(1.55091); expect(di.umur).toBeCloseTo(0.7); // 0.7 dans le DPE d'origine, comme si effet joule }); test("(2387E0430619S) Mur 3 Nord, Est (p1) - Mur en placoplatre isolé par l'intérieur (environ 10 cm) avec isolation intérieure donnant sur des circulations avec ouverture directe sur l'extérieur", () => { /** @type {Contexte} */ const ctx = { effetJoule: true, enumPeriodeConstructionId: '1', zoneClimatique: { id: 3 } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '23', enum_methode_saisie_u_id: '9', enum_methode_saisie_u0_id: '5', paroi_ancienne: false, umur_saisi: 0.32, epaisseur_structure: 25, enum_type_doublage_id: '2', enum_type_isolation_id: '3' }; const di = service.execute(ctx, de); expect(di.umur0).toBeUndefined(); // umur saisie directement expect(di.umur).toBeCloseTo(0.32); }); test('(2287E1724516Y) Mur 4 Nord, Sud (p1) - Mur en pan de bois sans remplissage tout venant d'épaisseur 18 cm avec isolation intérieure (R=2.5m².K/W) donnant sur l'extérieur', () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '1', zoneClimatique: { id: 3 } }; /** @type {MurDE} */ const de = { enum_materiaux_structure_mur_id: '5', enum_methode_saisie_u_id: '6', enum_methode_saisie_u0_id: '2', enduit_isolant_paroi_ancienne: true, epaisseur_structure: 18, resistance_isolation: 2.5, enum_type_doublage_id: '2', enum_type_isolation_id: '3' }; const di = service.execute(ctx, de); expect(di.umur0).toBeCloseTo(0.82983999999999991); expect(di.umur).toBeCloseTo(0.26990177584075975); }); test('(2187E0982013C) Mur Nord, Sud, Est, Ouest - Mur en pierre de taille et moellons avec remplissage tout venant d'épaisseur 50 cm non isolé donnant sur l'extérieur', () => { /** @type {Contexte} */ const ctx = { effetJoule: false, enumPeriodeConstructionId: '1', zoneClimatique: { id: 3 } }; /** @type {MurDE} */ const de = { enum_type_adjacence_id: '1', enum_materiaux_structure_mur_id: '3', enum_methode_saisie_u_id: '1', enum_methode_saisie_u0_id: '2', enduit_isolant_paroi_ancienne: true, epaisseur_structure: 18, resistance_isolation: 2.5, enum_type_doublage_id: '2', enum_type_isolation_id: '2' }; const di = service.execute(ctx, de); expect(di.umur0).toBeCloseTo(0.81545); expect(di.umur).toBeCloseTo(0.81545); }); }); test.each([ { label: 'mur avec isolation inconnue et période isolation 1975', enumTypeIsolationId: 1, enumPeriodIsolationId: 3, enumPeriodeConstructionId: undefined, typeIsolationExpected: 3 }, { label: 'mur avec isolation inconnue et période construction 1975', enumTypeIsolationId: 1, enumPeriodIsolationId: undefined, enumPeriodeConstructionId: 6, typeIsolationExpected: 3 }, { label: 'mur avec isolation inconnue et période isolation 1974', enumTypeIsolationId: 1, enumPeriodIsolationId: 2, enumPeriodeConstructionId: undefined, typeIsolationExpected: 2 }, { label: 'mur avec isolation inconnue et période construction 1974', enumTypeIsolationId: 1, enumPeriodIsolationId: undefined, enumPeriodeConstructionId: 1, typeIsolationExpected: 2 }, { label: 'mur avec isolation iti+ite', enumTypeIsolationId: 6, enumPeriodIsolationId: 1, enumPeriodeConstructionId: undefined, typeIsolationExpected: 6 } ])( "Récupération du type d'isolation pour $label", ({ enumTypeIsolationId, enumPeriodIsolationId = undefined, enumPeriodeConstructionId = undefined, typeIsolationExpected }) => { /** * @type {MurDE} */ let murDE = { enum_type_isolation_id: enumTypeIsolationId, enum_periode_isolation_id: enumPeriodIsolationId }; /** * @type {Contexte} */ const ctx = { enumPeriodeConstructionId }; expect(service.typeIsolation(ctx, murDE)).toBe(typeIsolationExpected); } ); describe("Test d'intégration de mur", () => { test.each(corpus)('vérification des DI des murs pour dpe %s', (ademeId) => { let dpeRequest = getAdemeFileJson(ademeId); dpeRequest = normalizerService.normalize(dpeRequest); /** @type {Contexte} */ const ctx = contexteBuilder.fromDpe(dpeRequest); const murs = dpeRequest.logement.enveloppe.mur_collection?.mur || []; murs.forEach((m) => { // dans ces cas de figure, les données paroi_ancienne sont bien traitées if (['2187E0982013C', '2287E2336469P', '2387E0045247S'].includes(ademeId)) { m.donnee_entree.enduit_isolant_paroi_ancienne = m.donnee_entree.paroi_ancienne; } const di = service.execute(ctx, m.donnee_entree); if (m.donnee_intermediaire.umur0) { expect(di.umur0).toBeCloseTo(m.donnee_intermediaire.umur0, 2); } else { expect(di.umur0).toBeUndefined(); } expect(di.umur).toBeCloseTo(m.donnee_intermediaire.umur, 2); expect(di.b).toBeCloseTo(m.donnee_intermediaire.b, 2); }); }); }); });