@open3cl/engine
Version:
Open Source 3CL-DPE engine
231 lines (208 loc) • 6.77 kB
JavaScript
import corpus from '../../../../../test/corpus-sano.json';
import { beforeEach, describe, expect, test, vi } from 'vitest';
import { DpeNormalizerService } from '../../../normalizer/domain/dpe-normalizer.service.js';
import { ContexteBuilder } from '../contexte.builder.js';
import { SurfaceSudEquivalenteService } from './surface-sud-equivalente.service.js';
import { getAdemeFileJson } from '../../../../../test/test-helpers.js';
import { BaieVitreeTvStore } from '../../../dpe/infrastructure/enveloppe/baieVitreeTv.store.js';
/** @type {SurfaceSudEquivalenteService} **/
let service;
/** @type {DpeNormalizerService} **/
let normalizerService;
/** @type {ContexteBuilder} **/
let contexteBuilder;
/** @type {BaieVitreeTvStore} **/
let tvStore;
describe('Calcul de la surface sud équivalente du logement', () => {
beforeEach(() => {
tvStore = new BaieVitreeTvStore();
service = new SurfaceSudEquivalenteService(tvStore);
normalizerService = new DpeNormalizerService();
contexteBuilder = new ContexteBuilder();
});
describe('Determination de la surface sud équivalente pour une baie vitrée bv et pendant un mois donné', () => {
test.each([
{
enumOrientationId: 2,
enumInclinaisonVitrageId: 3,
fe1: 1,
fe2: 1,
sw: 0.2,
coeff: 1,
expected: 5
},
{
enumOrientationId: 2,
enumInclinaisonVitrageId: undefined,
fe1: 1,
fe2: 1,
sw: 0.2,
coeff: 1,
expected: 5
},
{
enumOrientationId: 2,
enumInclinaisonVitrageId: undefined,
fe1: 1,
fe2: 1,
sw: 0.2,
coeff: undefined,
expected: 1
},
{
enumOrientationId: 2,
enumInclinaisonVitrageId: 3,
fe1: 0.5,
fe2: 0.5,
sw: 0.2,
coeff: 1,
expected: 1.25
},
{
enumOrientationId: 2,
enumInclinaisonVitrageId: 3,
fe1: undefined,
fe2: undefined,
sw: 0.2,
coeff: 1,
expected: 5
}
])(
'enumOrientationId: $enumOrientationId, enumInclinaisonVitrageId: $enumInclinaisonVitrageId, fe1: $fe1,' +
'fe2: $fe2, sw: $sw, coeff: $coeff',
({
enumOrientationId,
enumInclinaisonVitrageId = undefined,
fe1,
fe2,
sw,
coeff = undefined,
expected
}) => {
vi.spyOn(tvStore, 'getCoefficientBaieVitree').mockReturnValue(0.5);
/** @type {BaieVitree} */
const baieVitree = {
donnee_entree: {
enum_orientation_id: enumOrientationId,
enum_inclinaison_vitrage_id: enumInclinaisonVitrageId,
surface_totale_baie: 10
},
donnee_intermediaire: { fe1, fe2, sw }
};
const ssd = service.ssdBaieMois(baieVitree, '1', 'Janvier', coeff);
if (enumInclinaisonVitrageId === undefined) {
enumInclinaisonVitrageId = 3;
}
expect(tvStore.getCoefficientBaieVitree).toHaveBeenCalledWith(
enumOrientationId,
enumInclinaisonVitrageId,
1,
'Janvier'
);
expect(ssd).toBe(expected);
}
);
});
describe('Determination de la surface sud équivalente des baies vitrées bv', () => {
test("Aucune pour les baies vitrées qui ne donnent pas sur l'extérieur", () => {
expect(service.execute({}, [])).toBe(0);
/** @type {Enveloppe} */
const enveloppe = {
baie_vitree_collection: {
baie_vitree: [
{
donnee_entree: { enum_type_adjacence_id: 18 }
}
]
}
};
expect(service.ssdMois({}, enveloppe, 'Janvier')).toBe(0);
});
test("Baies vitrées donnant sur l'extérieur", () => {
vi.spyOn(tvStore, 'getCoefficientBaieVitree').mockReturnValue(0.5);
/** @type {Contexte} */
const ctx = { zoneClimatique: { id: 1 } };
/** @type {Enveloppe} */
const enveloppe = {
baie_vitree_collection: {
baie_vitree: [
{
donnee_entree: {
enum_type_adjacence_id: 1,
enum_orientation_id: 2,
surface_totale_baie: 10
},
donnee_intermediaire: { sw: 1 }
}
]
}
};
expect(service.ssdMois(ctx, enveloppe, 'Janvier')).toBe(5);
expect(tvStore.getCoefficientBaieVitree).toHaveBeenCalledWith(2, 3, 1, 'Janvier');
});
test('Baies vitrées donnant sur un espace tampon solarisé', () => {
vi.spyOn(tvStore, 'getCoefficientBaieVitree').mockReturnValue(0.5);
/** @type {Contexte} */
const ctx = { zoneClimatique: { id: 1 } };
/** @type {Enveloppe} */
const enveloppe = {
baie_vitree_collection: {
baie_vitree: [
{
donnee_entree: {
enum_type_adjacence_id: 10,
enum_orientation_id: 2,
surface_totale_baie: 10
},
donnee_intermediaire: { sw: 1 }
},
{
donnee_entree: {
enum_type_adjacence_id: 1,
enum_orientation_id: 2,
surface_totale_baie: 10
},
donnee_intermediaire: { sw: 1 }
}
]
},
ets_collection: {
ets: {
donnee_intermediaire: { bver: 0.6, coef_transparence_ets: 0.4 },
baie_ets_collection: {
baie_ets: {
donnee_entree: {
enum_inclinaison_vitrage_id: 3,
enum_orientation_id: 1,
surface_totale_baie: 7
}
}
}
}
}
};
expect(service.ssdMois(ctx, enveloppe, 'Janvier')).toBe(6.5224);
expect(tvStore.getCoefficientBaieVitree).toHaveBeenCalledWith(2, 3, 1, 'Janvier');
expect(tvStore.getCoefficientBaieVitree).toHaveBeenCalledWith(1, 3, 1, 'Janvier');
});
});
describe("Test d'intégration pour surface sud équivalente", () => {
test.each(corpus)(
'vérification des DI de la surface sud équivalente pour dpe %s',
(ademeId) => {
/**
* @type {Dpe}
*/
let dpeRequest = getAdemeFileJson(ademeId);
dpeRequest = normalizerService.normalize(dpeRequest);
/** @type {Contexte} */
const ctx = contexteBuilder.fromDpe(dpeRequest);
const sse = service.execute(ctx, dpeRequest.logement.enveloppe);
expect(sse).toBeCloseTo(
dpeRequest.logement.sortie.apport_et_besoin.surface_sud_equivalente,
2
);
}
);
});
});