UNPKG

@open3cl/engine

Version:

Open Source 3CL-DPE engine

620 lines (590 loc) 19.4 kB
import { TvStore } from './tv.store.js'; import { tv } from '../../../utils.js'; import { beforeEach, describe, expect, test } from 'vitest'; import { TypeHabitation } from '../domain/models/type-habitation.model.js'; /** @type {TvStore} **/ let tvStore; describe('Lecture des tables de valeurs', () => { beforeEach(() => { tvStore = new TvStore(); }); describe('lecture des valeurs de b', () => { test.each([ { enumTypeAdjacenceId: '1', label: 'extérieur', bExpected: 1 }, { enumTypeAdjacenceId: '2', label: 'paroi enterrée', bExpected: 1 }, { enumTypeAdjacenceId: '3', label: 'vide sanitaire', bExpected: 1 }, { enumTypeAdjacenceId: '4', label: "bâtiment ou local à usage autre que d'habitation", bExpected: 0.2 }, { enumTypeAdjacenceId: '5', label: 'terre-plein', bExpected: 1 }, { enumTypeAdjacenceId: '6', label: 'sous-sol non chauffé', bExpected: 1 }, { enumTypeAdjacenceId: '7', enumCfgIsolationLncId: '1', uVue: 3, label: 'locaux non chauffés non accessible', bExpected: 0.95 }, { enumTypeAdjacenceId: '22', label: "local non déperditif (local à usage d'habitation chauffé)", bExpected: 0 }, { enumTypeAdjacenceId: '8', uVue: 3, enumCfgIsolationLncId: '2', rAiuAue: 0.1, label: 'garage', bExpected: 0.9 } ])( 'b pour $label (id:$enumTypeAdjacenceId)', ({ enumTypeAdjacenceId, uVue = undefined, enumCfgIsolationLncId = undefined, rAiuAue = undefined, bExpected }) => { const b = tvStore.getB(enumTypeAdjacenceId, uVue, enumCfgIsolationLncId, rAiuAue); expect(b).toBe(bExpected); } ); }); describe('lecture des valeurs de uVue', () => { test.each([ { enumTypeAdjacenceId: '1', label: 'extérieur', expected: undefined }, { enumTypeAdjacenceId: '2', label: 'paroi enterrée', expected: undefined }, { enumTypeAdjacenceId: '3', label: 'vide sanitaire', expected: undefined }, { enumTypeAdjacenceId: '4', label: "bâtiment ou local à usage autre que d'habitation", expected: undefined }, { enumTypeAdjacenceId: '5', label: 'terre-plein', expected: undefined }, { enumTypeAdjacenceId: '6', label: 'sous-sol non chauffé', expected: undefined }, { enumTypeAdjacenceId: '7', label: 'locaux non chauffés non accessible', expected: undefined }, { enumTypeAdjacenceId: '8', label: 'garage', expected: 3 }, { enumTypeAdjacenceId: '9', label: 'cellier', expected: 3 }, { enumTypeAdjacenceId: '10', label: 'espace tampon solarisé (véranda,loggia fermée)', expected: undefined }, { enumTypeAdjacenceId: '11', label: 'comble fortement ventilé', expected: 9 }, { enumTypeAdjacenceId: '12', label: 'comble faiblement ventilé', expected: 3 }, { enumTypeAdjacenceId: '13', label: 'comble très faiblement ventilé', expected: 0.3 }, { enumTypeAdjacenceId: '14', label: "circulation sans ouverture directe sur l'extérieur", expected: 0 }, { enumTypeAdjacenceId: '15', label: "circulation avec ouverture directe sur l'extérieur", expected: 0.3 }, { enumTypeAdjacenceId: '16', label: 'circulation avec bouche ou gaine de désenfumage ouverte en permanence', expected: 3 }, { enumTypeAdjacenceId: '17', label: "hall d'entrée avec dispositif de fermeture automatique", expected: 0.3 }, { enumTypeAdjacenceId: '18', label: "hall d'entrée sans dispositif de fermeture automatique", expected: 3 }, { enumTypeAdjacenceId: '19', label: 'garage privé collectif', expected: 3 }, { enumTypeAdjacenceId: '20', label: "local tertiaire à l'intérieur de l'immeuble en contact avec l'appartement", expected: undefined }, { enumTypeAdjacenceId: '21', label: 'autres dépendances', expected: 3 }, { enumTypeAdjacenceId: '22', label: "local non déperditif (local à usage d'habitation chauffé)", expected: undefined } ])('uVue pour $label (id:$enumTypeAdjacenceId)', ({ enumTypeAdjacenceId, expected }) => { const uVue = tvStore.getUVue(enumTypeAdjacenceId); expect(uVue).toBe(expected); }); }); describe('lecture des valeurs de umur0', () => { test.each([ { label: 'mur inconnu', enumMateriauxStructureMurId: '1', expected: 2.5 }, { label: "Murs en pierre de taille et moellons constitué d'un seul matériaux 18cm", enumMateriauxStructureMurId: '2', epaisseurStructure: 18, expected: 3.2 }, { label: "Murs en pierre de taille et moellons constitué d'un seul matériaux 37cm", enumMateriauxStructureMurId: '2', epaisseurStructure: 37, expected: 2.45 }, { label: "Murs en pierre de taille et moellons constitué d'un seul matériaux 30cm", enumMateriauxStructureMurId: '2', epaisseurStructure: 30, expected: 2.65 }, { label: "Murs en pierre de taille et moellons constitué d'un seul matériaux 39cm", enumMateriauxStructureMurId: '2', epaisseurStructure: 39, expected: 2.45 }, { label: "Murs en pierre de taille et moellons constitué d'un seul matériaux 98cm", enumMateriauxStructureMurId: '2', epaisseurStructure: 98, expected: 1.5 }, { label: 'Murs en pan de bois sans remplissage tout venant', enumMateriauxStructureMurId: '5', epaisseurStructure: 12, expected: 2.7 } ])( 'umur pour $label (id:$enumMateriauxStructureMurId)', ({ enumMateriauxStructureMurId, epaisseurStructure, expected }) => { const umur0 = tvStore.getUmur0(enumMateriauxStructureMurId, epaisseurStructure); expect(umur0).toBe(expected); } ); test('pas de valeur de umur0', () => { const umur0 = tvStore.getUmur0('0'); expect(umur0).toBeUndefined(); }); }); describe('lecture des valeurs de umur', () => { test.each([ { label: 'mur année de construction avant 1948 zone climatique h1a', enumPeriodeConstructionId: '1', enumZoneClimatiqueId: '1', expected: 2.5 }, { label: 'mur année de construction 1983-1988 zone climatique h1a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '1', expected: 0.8 }, { label: 'mur année de construction 1983-1988 zone climatique h2a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '4', expected: 0.84 }, { label: 'mur année de construction 1983-1988 zone climatique h3', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '8', effetJoule: false, expected: 0.89 }, { label: 'mur année de construction 1983-1988 zone climatique h1a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '1', effetJoule: true, expected: 0.7 }, { label: 'mur année de construction 1983-1988 zone climatique h2a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '4', effetJoule: true, expected: 0.74 }, { label: 'mur année de construction 1983-1988 zone climatique h3', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '8', effetJoule: true, expected: 0.78 } ])( 'umur pour $label', ({ enumPeriodeConstructionId, enumZoneClimatiqueId, effetJoule, expected }) => { const umur = tvStore.getUmur(enumPeriodeConstructionId, enumZoneClimatiqueId, effetJoule); expect(umur).toBe(expected); } ); test('pas de valeur de umur', () => { const umur = tvStore.getUmur('0', '1', true); expect(umur).toBeUndefined(); }); }); describe('lecture des valeurs de upb0', () => { test.each([ { enumTypePlancherBasId: '1', expected: 2 }, { enumTypePlancherBasId: '2', expected: 1.45 }, { enumTypePlancherBasId: '3', expected: 1.45 }, { enumTypePlancherBasId: '4', expected: 1.1 }, { enumTypePlancherBasId: '5', expected: 1.6 }, { enumTypePlancherBasId: '6', expected: 1.1 }, { enumTypePlancherBasId: '7', expected: 1.75 }, { enumTypePlancherBasId: '8', expected: 0.8 }, { enumTypePlancherBasId: '9', expected: 2 }, { enumTypePlancherBasId: '10', expected: 1.6 }, { enumTypePlancherBasId: '11', expected: 2 }, { enumTypePlancherBasId: '12', expected: 0.45 } ])( 'upb0 pour type plancher bas $enumTypePlancherBasId', ({ enumTypePlancherBasId, expected }) => { const upb0 = tvStore.getUpb0(enumTypePlancherBasId); expect(upb0).toBe(expected); } ); test('pas de valeur de upb0', () => { const upb0 = tvStore.getUpb0('0'); expect(upb0).toBeUndefined(); }); }); describe('lecture des valeurs de upb', () => { test.each([ { label: 'pb année de construction avant 1948 zone climatique h1a', enumPeriodeConstructionId: '1', enumZoneClimatiqueId: '1', expected: 2 }, { label: 'pb année de construction 1983-1988 zone climatique h1a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '1', expected: 0.8 }, { label: 'pb année de construction 1983-1988 zone climatique h2a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '4', expected: 0.74 }, { label: 'pb année de construction 1983-1988 zone climatique h3', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '8', effetJoule: false, expected: 0.89 }, { label: 'pb année de construction 1983-1988 zone climatique h1a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '1', effetJoule: true, expected: 0.55 }, { label: 'pb année de construction 1983-1988 zone climatique h2a', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '4', effetJoule: true, expected: 0.58 }, { label: 'pb année de construction 1983-1988 zone climatique h3', enumPeriodeConstructionId: '5', enumZoneClimatiqueId: '8', effetJoule: true, expected: 0.78 } ])( 'upb pour $label', ({ enumPeriodeConstructionId, enumZoneClimatiqueId, effetJoule, expected }) => { const upb = tvStore.getUpb(enumPeriodeConstructionId, enumZoneClimatiqueId, effetJoule); expect(upb).toBe(expected); } ); test('pas de valeur de upb', () => { const upb = tvStore.getUpb('0', '1', true); expect(upb).toBeUndefined(); }); }); describe('lecture des valeurs de ue par upb', () => { test.each([ { label: 'ue non extrapolé (upb = min des ue disponibles)', enumTypeAdjacenceId: '3', enumPeriodeConstructionId: '1', dsp: 4, upb: 0.31, expected: 0.25 }, { label: 'ue non extrapolé (upb = max des ue disponibles)', enumTypeAdjacenceId: '3', enumPeriodeConstructionId: '1', dsp: 4, upb: 3.33, expected: 0.43 }, { label: 'ue extrapolé', enumTypeAdjacenceId: '3', enumPeriodeConstructionId: '1', dsp: 4, upb: 3, expected: 0.42 }, { label: 'ue extrapolé', enumTypeAdjacenceId: '3', enumPeriodeConstructionId: '1', dsp: 4, upb: 3, expected: 0.42 } ])( 'ue pour $label', ({ enumTypeAdjacenceId, enumPeriodeConstructionId, dsp, upb, expected }) => { const ue = tvStore.getUeByUpd(enumTypeAdjacenceId, enumPeriodeConstructionId, dsp, upb); expect(ue).toBeCloseTo(expected); } ); test('pas de valeur de ue', () => { const ue = tvStore.getUeByUpd('0', '1', 0, 0); expect(ue).toBeUndefined(); }); }); describe('lecture des valeurs de uph0', () => { test.each([ { enumTypePlancherHautId: '1', expected: 2.5 }, { enumTypePlancherHautId: '2', expected: 1.45 }, { enumTypePlancherHautId: '3', expected: 1.45 }, { enumTypePlancherHautId: '4', expected: 1.2 }, { enumTypePlancherHautId: '5', expected: 2.5 }, { enumTypePlancherHautId: '6', expected: 2.5 }, { enumTypePlancherHautId: '7', expected: 1.2 }, { enumTypePlancherHautId: '8', expected: 2.5 }, { enumTypePlancherHautId: '9', expected: 2 }, { enumTypePlancherHautId: '10', expected: 2.3 }, { enumTypePlancherHautId: '11', expected: 2.5 }, { enumTypePlancherHautId: '12', expected: 2.5 }, { enumTypePlancherHautId: '13', expected: 0.24 }, { enumTypePlancherHautId: '14', expected: 2.5 }, { enumTypePlancherHautId: '15', expected: undefined }, { enumTypePlancherHautId: '16', expected: 2.5 } ])( 'uph0 pour type plancher Haut $enumTypePlancherHautId', ({ enumTypePlancherHautId, expected }) => { const uph0 = tvStore.getUph0(enumTypePlancherHautId); expect(uph0).toBe(expected); } ); test('pas de valeur de uph0', () => { const uph0 = tvStore.getUph0('0'); expect(uph0).toBeUndefined(); }); }); describe('lecture des valeurs de uph', () => { test.each([ { enumPeriodeConstructionId: '1', typeToiture: 'terrasse', enumZoneClimatiqueId: '1', effetJoule: false, expected: 2.5 }, { enumPeriodeConstructionId: '4', typeToiture: 'combles', enumZoneClimatiqueId: '4', effetJoule: true, expected: 0.42 }, { enumPeriodeConstructionId: '8', typeToiture: 'combles', enumZoneClimatiqueId: '6', effetJoule: true, expected: 0.2 } ])( 'uph pour type plancher Haut', ({ enumPeriodeConstructionId, typeToiture, enumZoneClimatiqueId, effetJoule, expected }) => { expect( tvStore.getUph(enumPeriodeConstructionId, typeToiture, enumZoneClimatiqueId, effetJoule) ).toBe(expected); } ); test('pas de valeur de uph', () => { const uph = tvStore.getUph('0', 'terrasse', '1', false); expect(uph).toBeUndefined(); }); }); describe('lecture des valeurs de debits_ventilation', () => { test.each([ { label: 'Ventilation par ouverture des fenêtres', enumTypeVentilation: '1', expected: { qvarep_conv: '1.2', qvasouf_conv: '1.2', smea_conv: '0' } }, { label: 'VMC SF Auto réglable de 2001 à 2012', enumTypeVentilation: '5', expected: { qvarep_conv: '1.5', qvasouf_conv: '0', smea_conv: '2' } } ])(`debitsVentilation pour ventilation $label`, ({ enumTypeVentilation, expected }) => { expect(tvStore.getDebitsVentilation(enumTypeVentilation)).toMatchObject(expected); }); test('pas de valeur de debits_ventilation', () => { const ug = tvStore.getDebitsVentilation('0'); expect(ug).toBeUndefined(); }); }); describe('lecture des valeurs de q4paConv', () => { test.each([ { label: 'Ventilation avant 1948, appartement', periodConstruction: '1', typeHabitation: TypeHabitation.APPARTEMENT, isolationSurface: '0', expected: { q4pa_conv: '4.6' } }, { label: 'Ventilation avant 1948, appartement', periodConstruction: '1', typeHabitation: TypeHabitation.APPARTEMENT, isolationSurface: undefined, expected: { q4pa_conv: '4.6' } }, { label: 'Ventilation 1948-1974, maison', periodConstruction: '2', typeHabitation: TypeHabitation.MAISON, isolationSurface: undefined, expected: { q4pa_conv: '2.2' } }, { label: 'Ventilation 1948-1974, maison surfaces isolées', periodConstruction: '2', typeHabitation: TypeHabitation.MAISON, isolationSurface: '1', expected: { q4pa_conv: '1.9' } }, { label: 'Ventilation avant 1948, maison avec joints', periodConstruction: '1', typeHabitation: TypeHabitation.MAISON, isolationSurface: undefined, presenceJointsMenuiserie: '1', expected: { q4pa_conv: '2.5' } }, { label: 'Ventilation avant 1948, maison avec joints', periodConstruction: '1', typeHabitation: TypeHabitation.MAISON, isolationSurface: '0', presenceJointsMenuiserie: '1', expected: { q4pa_conv: '2.5' } } ])( `q4paConv pour ventilation $label`, ({ periodConstruction, typeHabitation, isolationSurface, presenceJointsMenuiserie, expected }) => { expect( tvStore.getQ4paConv( periodConstruction, typeHabitation, isolationSurface, presenceJointsMenuiserie ) ).toMatchObject(expected); } ); test('pas de valeur de debits_ventilation', () => { const ug = tvStore.getQ4paConv('2', TypeHabitation.MAISON, '0', '1'); expect(ug).toBeUndefined(); }); }); test('lecture des valeurs de tempBase', () => { expect(tvStore.getTempBase('1', 'h1')).toBe(-9.5); expect(tvStore.getTempBase('1', 'h2')).toBe(-6.5); expect(tvStore.getTempBase('1', 'h3')).toBe(-3.5); expect(tvStore.getTempBase('2', 'h1')).toBe(-11.5); expect(tvStore.getTempBase('2', 'h2')).toBe(-8.5); expect(tvStore.getTempBase('2', 'h3')).toBe(-5.5); expect(tvStore.getTempBase('3', 'h1')).toBe(-13.5); expect(tvStore.getTempBase('3', 'h2')).toBe(-10.5); expect(tvStore.getTempBase('3', 'h3')).toBe(-7.5); }); describe.skip('Benchmark b', () => { test('reworked', () => { for (let i = 0; i < 1000; i++) { const b = tvStore.getB('8'); expect(b).toBe(1); } }); test('legacy', () => { const matcher = { enum_type_adjacence_id: '8' }; for (let i = 0; i < 1000; i++) { const result = tv('coef_reduction_deperdition', matcher); expect(result.b).toBe('1'); } }); }); describe.skip('Benchmark uVue', () => { test('reworked', () => { for (let i = 0; i < 1000; i++) { const uVue = tvStore.getUVue('8'); expect(uVue).toBe(3); } }); test('legacy', () => { const matcher = { enum_type_adjacence_id: '8' }; for (let i = 0; i < 1000; i++) { const result = tv('uvue', matcher); expect(result.uvue).toBe('3'); } }); }); });