@open3cl/engine
Version:
Open Source 3CL-DPE engine
283 lines (263 loc) • 8.6 kB
JavaScript
import { DeperditionEnveloppeService } from './deperdition-enveloppe.service.js';
import corpus from '../../../../../test/corpus-sano.json';
import { getAdemeFileJson } from '../../../../../test/test-helpers.js';
import { ContexteBuilder } from '../contexte.builder.js';
import { DeperditionPlancherBasService } from './plancher_bas/deperdition-plancher-bas.service.js';
import { DeperditionMurService } from './mur/deperdition-mur.service.js';
import { DeperditionPorteService } from './porte/deperdition-porte.service.js';
import { DeperditionPlancherHautService } from './plancher_haut/deperdition-plancher-haut.service.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';
import b from '../../../../3.1_b.js';
/** @type {DeperditionPorteService} **/
let deperditionPorteService;
/** @type {DeperditionMurService} **/
let deperditionMurService;
/** @type {DeperditionPlancherBasService} **/
let deperditionPlancherBasService;
/** @type {DeperditionPlancherHautService} **/
let deperditionPlancherHautService;
/** @type {DpeNormalizerService} **/
let normalizerService;
/** @type {ContexteBuilder} **/
let contexteBuilder;
/** @type {TvStore} **/
let tvStore;
/** @type {DeperditionEnveloppeService} **/
let service;
describe('Calcul des déperditions', () => {
beforeEach(() => {
tvStore = new TvStore();
deperditionPorteService = new DeperditionPorteService(tvStore);
deperditionMurService = new DeperditionMurService(tvStore);
deperditionPlancherBasService = new DeperditionPlancherBasService(tvStore);
deperditionPlancherHautService = new DeperditionPlancherHautService(tvStore);
normalizerService = new DpeNormalizerService();
contexteBuilder = new ContexteBuilder();
service = new DeperditionEnveloppeService(
deperditionMurService,
deperditionPorteService,
deperditionPlancherBasService,
deperditionPlancherHautService
);
});
describe('Détermination du coefficient de réduction des déperditions 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',
label: 'locaux non chauffés non accessible',
bExpected: 0.95
},
{
enumTypeAdjacenceId: '8',
surfaceAiu: 14.75,
surfaceAue: 300,
enumCfgIsolationLncId: '2',
label: 'garage',
bExpected: 0.9
},
{
enumTypeAdjacenceId: '9',
surfaceAiu: 8.14,
surfaceAue: 22.8,
enumCfgIsolationLncId: '4',
label: 'cellier',
bExpected: 0.95
},
{
enumTypeAdjacenceId: '10',
surfaceAiu: 8.14,
surfaceAue: 22.8,
enumCfgIsolationLncId: '9',
label: 'espace tampon solarisé (véranda,loggia fermée)',
bExpected: undefined
},
{
enumTypeAdjacenceId: '10',
surfaceAiu: 8.14,
surfaceAue: 22.8,
zoneClimatique: 'h2c',
enumCfgIsolationLncId: '9',
label: 'espace tampon solarisé (véranda,loggia fermée)',
bExpected: 0.85
},
{
enumTypeAdjacenceId: '11',
surfaceAiu: 50.2,
surfaceAue: 60,
enumCfgIsolationLncId: '4',
label: 'comble fortement ventilé',
bExpected: 0.95
},
{
enumTypeAdjacenceId: '12',
surfaceAiu: 74,
surfaceAue: 110,
enumCfgIsolationLncId: '4',
label: 'comble faiblement ventilé',
bExpected: 0.95
},
{
enumTypeAdjacenceId: '13',
surfaceAiu: 30,
surfaceAue: 45,
enumCfgIsolationLncId: '2',
label: 'comble très faiblement ventilé',
bExpected: 0.65
},
{
enumTypeAdjacenceId: '14',
surfaceAiu: 22,
surfaceAue: 15,
enumCfgIsolationLncId: '2',
label: "circulation sans ouverture directe sur l'extérieur",
bExpected: 0.35
},
{
enumTypeAdjacenceId: '15',
surfaceAiu: 20,
surfaceAue: 2.5,
enumCfgIsolationLncId: '2',
label: "circulation avec ouverture directe sur l'extérieur",
bExpected: 0.15
},
{
enumTypeAdjacenceId: '16',
surfaceAiu: 120,
surfaceAue: 300,
enumCfgIsolationLncId: '3',
label: 'circulation avec bouche ou gaine de désenfumage ouverte en permanence',
bExpected: 0.7
},
{
enumTypeAdjacenceId: '17',
label: "hall d'entrée avec dispositif de fermeture automatique",
bExpected: 0
},
{
enumTypeAdjacenceId: '18',
surfaceAiu: 335.22,
surfaceAue: 29.18,
enumCfgIsolationLncId: '2',
label: "hall d'entrée sans dispositif de fermeture automatique",
bExpected: 0.15
},
{
enumTypeAdjacenceId: '19',
surfaceAiu: 49,
surfaceAue: 65,
enumCfgIsolationLncId: '2',
label: 'garage privé collectif',
bExpected: 0.7
},
{
enumTypeAdjacenceId: '20',
label: "local tertiaire à l'intérieur de l'immeuble en contact avec l'appartement",
bExpected: 0.2
},
{
enumTypeAdjacenceId: '21',
surfaceAiu: 4.94,
surfaceAue: 8.8,
enumCfgIsolationLncId: '2',
label: 'autres dépendances',
bExpected: 0.75
},
{
enumTypeAdjacenceId: '22',
label: "local non déperditif (local à usage d'habitation chauffé)",
bExpected: 0
}
])(
'$label (id:$enumTypeAdjacenceId)',
({
enumTypeAdjacenceId,
surfaceAiu = undefined,
surfaceAue = undefined,
zoneClimatique = undefined,
enumCfgIsolationLncId = undefined,
bExpected
}) => {
const data = {
enumTypeAdjacenceId,
surfaceAiu,
surfaceAue,
enumCfgIsolationLncId,
zoneClimatique
};
const b = deperditionMurService.b(data);
expect(b).toBe(bExpected);
}
);
});
describe.skip('Benchmark', () => {
test('reworked', () => {
const data = {
enumTypeAdjacenceId: '8',
surfaceAiu: 2.82,
surfaceAue: 300,
enumCfgIsolationLncId: '2',
label: 'garage'
};
for (let i = 0; i < 1000; i++) {
const b = deperditionMurService.b(data);
expect(b).toBe(0.9);
}
});
test('legacy', () => {
const di = { b: undefined };
const de = {
enum_type_adjacence_id: '8',
surface_aiu: 2.82,
surface_aue: 300,
enum_cfg_isolation_lnc_id: '2'
};
const du = {};
const zc = '1';
for (let i = 0; i < 1000; i++) {
b(di, de, du, zc);
expect(di.b).toBe(0.9);
}
});
});
describe("Test d'intégration de calcul des deperditions", () => {
test.each(corpus)('deperditions pour dpe %s', (ademeId) => {
let dpeRequest = getAdemeFileJson(ademeId);
dpeRequest = normalizerService.normalize(dpeRequest);
/** @type {Contexte} */
const ctx = contexteBuilder.fromDpe(dpeRequest);
/** @type {Logement} */
const logement = dpeRequest.logement;
/** @type {Deperdition} */
const deperditions = service.deperditions(ctx, logement);
expect(deperditions.deperdition_mur).toBeCloseTo(
dpeRequest.logement.sortie.deperdition.deperdition_mur,
1
);
expect(deperditions.deperdition_porte).toBeCloseTo(
dpeRequest.logement.sortie.deperdition.deperdition_porte,
1
);
expect(deperditions.deperdition_plancher_bas).toBeCloseTo(
dpeRequest.logement.sortie.deperdition.deperdition_plancher_bas,
1
);
expect(deperditions.deperdition_plancher_haut).toBeCloseTo(
dpeRequest.logement.sortie.deperdition.deperdition_plancher_haut,
1
);
});
});
});