@open3cl/engine 1.7.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/10_besoin_fr.spec.js +1 -0
  2. package/10_clim.spec.js +1 -0
  3. package/11_besoin_ecs.spec.js +1 -0
  4. package/11_ecs.spec.js +1 -0
  5. package/12.4_pac.spec.js +1 -0
  6. package/13.2_generateur_combustion.spec.js +3 -3
  7. package/13.2_generateur_combustion_ch.spec.js +3 -3
  8. package/14_generateur_ecs.spec.js +1 -0
  9. package/15_conso_aux.spec.js +3 -3
  10. package/2021_04_13_confort_ete.spec.js +1 -0
  11. package/3.1_b.spec.js +1 -0
  12. package/3.2.1_mur.spec.js +1 -0
  13. package/3.2.2_plancher_bas.spec.js +1 -0
  14. package/3.2.3_plancher_haut.spec.js +1 -0
  15. package/3.3.1.4_porte.spec.js +1 -0
  16. package/3.3_baie_vitree.spec.js +1 -0
  17. package/3.4_pont_thermique.spec.js +1 -0
  18. package/4_ventilation.spec.js +1 -0
  19. package/5_conso_ventilation.spec.js +1 -0
  20. package/6.2_surface_sud_equivalente.spec.js +1 -0
  21. package/9_besoin_ch.spec.js +1 -0
  22. package/9_chauffage.spec.js +3 -3
  23. package/9_conso_ch.spec.js +1 -0
  24. package/9_emetteur_ch.spec.js +1 -0
  25. package/9_generateur_ch.spec.js +1 -0
  26. package/README.md +412 -291
  27. package/conso.spec.js +1 -0
  28. package/engine.js +3 -1
  29. package/engine.spec.js +1 -0
  30. package/package.json +15 -14
  31. package/features/engine/domain/apport_et_besoin/apport-et-besoin.service.spec.js +0 -222
  32. package/features/engine/domain/apport_et_besoin/ch/perte-ch-recup.service.spec.js +0 -345
  33. package/features/engine/domain/apport_et_besoin/ecs/besoin-ecs.service.spec.js +0 -87
  34. package/features/engine/domain/apport_et_besoin/ecs/perte-ecs-recup.service.spec.js +0 -260
  35. package/features/engine/domain/apport_et_besoin/froid/besoin-froid.service.spec.js +0 -272
  36. package/features/engine/domain/apport_et_besoin/surface-sud-equivalente.service.spec.js +0 -231
  37. package/features/engine/domain/ch/generateur-ch.service.spec.js +0 -849
  38. package/features/engine/domain/conso/froid/conso-froid.service.spec.js +0 -233
  39. package/features/engine/domain/ecs/installation-ecs.service.spec.js +0 -337
  40. package/features/engine/domain/enveloppe/baie_vitree/deperdition-baie-vitree.service.spec.js +0 -607
  41. package/features/engine/domain/enveloppe/deperdition-enveloppe.service.spec.js +0 -550
  42. package/features/engine/domain/enveloppe/espace_tampon/espace-tampon.service.spec.js +0 -82
  43. package/features/engine/domain/enveloppe/mur/deperdition-mur.service.spec.js +0 -542
  44. package/features/engine/domain/enveloppe/plancher_bas/deperdition-plancher-bas.service.spec.js +0 -430
  45. package/features/engine/domain/enveloppe/plancher_haut/deperdition-plancher-haut.service.spec.js +0 -411
  46. package/features/engine/domain/enveloppe/pont_thermique/deperdition-pont-thermique.service.spec.js +0 -653
  47. package/features/engine/domain/enveloppe/porte/deperdition-porte.service.spec.js +0 -117
  48. package/features/engine/domain/enveloppe/ventilation/deperdition-ventilation.service.spec.js +0 -508
@@ -1,550 +0,0 @@
1
- import { DeperditionEnveloppeService } from './deperdition-enveloppe.service.js';
2
- import corpus from '../../../../../test/corpus-sano.json';
3
- import { getAdemeFileJson } from '../../../../../test/test-helpers.js';
4
- import { ContexteBuilder } from '../contexte.builder.js';
5
- import { DeperditionPlancherBasService } from './plancher_bas/deperdition-plancher-bas.service.js';
6
- import { DeperditionMurService } from './mur/deperdition-mur.service.js';
7
- import { DeperditionPorteService } from './porte/deperdition-porte.service.js';
8
- import { DeperditionPlancherHautService } from './plancher_haut/deperdition-plancher-haut.service.js';
9
- import { DpeNormalizerService } from '../../../normalizer/domain/dpe-normalizer.service.js';
10
- import { TvStore } from '../../../dpe/infrastructure/tv.store.js';
11
- import { beforeEach, describe, expect, test, vi } from 'vitest';
12
- import b from '../../../../3.1_b.js';
13
- import { describeIntegration } from '../../../../../test/helpers/integration-test.js';
14
-
15
- /** @type {DeperditionPorteService} **/
16
- let deperditionPorteService;
17
-
18
- /** @type {DeperditionMurService} **/
19
- let deperditionMurService;
20
-
21
- /** @type {DeperditionPlancherBasService} **/
22
- let deperditionPlancherBasService;
23
-
24
- /** @type {DeperditionPlancherHautService} **/
25
- let deperditionPlancherHautService;
26
-
27
- /** @type {DpeNormalizerService} **/
28
- let normalizerService;
29
-
30
- /** @type {ContexteBuilder} **/
31
- let contexteBuilder;
32
-
33
- /** @type {TvStore} **/
34
- let tvStore;
35
-
36
- /** @type {DeperditionEnveloppeService} **/
37
- let service;
38
-
39
- describe('Calcul des déperditions', () => {
40
- beforeEach(() => {
41
- tvStore = new TvStore();
42
- deperditionPorteService = new DeperditionPorteService(tvStore);
43
- deperditionMurService = new DeperditionMurService(tvStore);
44
- deperditionPlancherBasService = new DeperditionPlancherBasService(tvStore);
45
- deperditionPlancherHautService = new DeperditionPlancherHautService(tvStore);
46
- normalizerService = new DpeNormalizerService();
47
- contexteBuilder = new ContexteBuilder();
48
-
49
- service = new DeperditionEnveloppeService(
50
- deperditionMurService,
51
- deperditionPorteService,
52
- deperditionPlancherBasService,
53
- deperditionPlancherHautService
54
- );
55
- });
56
-
57
- describe('Détermination du coefficient de réduction des déperditions b', () => {
58
- test.each([
59
- { enumTypeAdjacenceId: '1', label: 'extérieur', bExpected: 1 },
60
- { enumTypeAdjacenceId: '2', label: 'paroi enterrée', bExpected: 1 },
61
- { enumTypeAdjacenceId: '3', label: 'vide sanitaire', bExpected: 1 },
62
- {
63
- enumTypeAdjacenceId: '4',
64
- label: "bâtiment ou local à usage autre que d'habitation",
65
- bExpected: 0.2
66
- },
67
- { enumTypeAdjacenceId: '5', label: 'terre-plein', bExpected: 1 },
68
- { enumTypeAdjacenceId: '6', label: 'sous-sol non chauffé', bExpected: 1 },
69
- {
70
- enumTypeAdjacenceId: '7',
71
- enumCfgIsolationLncId: '1',
72
- label: 'locaux non chauffés non accessible',
73
- bExpected: 0.95
74
- },
75
- {
76
- enumTypeAdjacenceId: '8',
77
- surfaceAiu: 14.75,
78
- surfaceAue: 300,
79
- enumCfgIsolationLncId: '2',
80
- label: 'garage',
81
- bExpected: 0.9
82
- },
83
- {
84
- enumTypeAdjacenceId: '9',
85
- surfaceAiu: 8.14,
86
- surfaceAue: 22.8,
87
- enumCfgIsolationLncId: '4',
88
- label: 'cellier',
89
- bExpected: 0.95
90
- },
91
- {
92
- enumTypeAdjacenceId: '10',
93
- surfaceAiu: 8.14,
94
- surfaceAue: 22.8,
95
- enumCfgIsolationLncId: '9',
96
- label: 'espace tampon solarisé (véranda,loggia fermée)',
97
- bExpected: undefined
98
- },
99
- {
100
- enumTypeAdjacenceId: '10',
101
- surfaceAiu: 8.14,
102
- surfaceAue: 22.8,
103
- zoneClimatique: 'h2c',
104
- enumCfgIsolationLncId: '9',
105
- label: 'espace tampon solarisé (véranda,loggia fermée)',
106
- bExpected: 0.85
107
- },
108
- {
109
- enumTypeAdjacenceId: '11',
110
- surfaceAiu: 50.2,
111
- surfaceAue: 60,
112
- enumCfgIsolationLncId: '4',
113
- label: 'comble fortement ventilé',
114
- bExpected: 0.95
115
- },
116
- {
117
- enumTypeAdjacenceId: '12',
118
- surfaceAiu: 74,
119
- surfaceAue: 110,
120
- enumCfgIsolationLncId: '4',
121
- label: 'comble faiblement ventilé',
122
- bExpected: 0.95
123
- },
124
- {
125
- enumTypeAdjacenceId: '13',
126
- surfaceAiu: 30,
127
- surfaceAue: 45,
128
- enumCfgIsolationLncId: '2',
129
- label: 'comble très faiblement ventilé',
130
- bExpected: 0.65
131
- },
132
- {
133
- enumTypeAdjacenceId: '14',
134
- surfaceAiu: 22,
135
- surfaceAue: 15,
136
- enumCfgIsolationLncId: '2',
137
- label: "circulation sans ouverture directe sur l'extérieur",
138
- bExpected: 0.35
139
- },
140
- {
141
- enumTypeAdjacenceId: '15',
142
- surfaceAiu: 20,
143
- surfaceAue: 2.5,
144
- enumCfgIsolationLncId: '2',
145
- label: "circulation avec ouverture directe sur l'extérieur",
146
- bExpected: 0.15
147
- },
148
- {
149
- enumTypeAdjacenceId: '16',
150
- surfaceAiu: 120,
151
- surfaceAue: 300,
152
- enumCfgIsolationLncId: '3',
153
- label: 'circulation avec bouche ou gaine de désenfumage ouverte en permanence',
154
- bExpected: 0.7
155
- },
156
- {
157
- enumTypeAdjacenceId: '17',
158
- label: "hall d'entrée avec dispositif de fermeture automatique",
159
- bExpected: 0
160
- },
161
- {
162
- enumTypeAdjacenceId: '18',
163
- surfaceAiu: 335.22,
164
- surfaceAue: 29.18,
165
- enumCfgIsolationLncId: '2',
166
- label: "hall d'entrée sans dispositif de fermeture automatique",
167
- bExpected: 0.15
168
- },
169
- {
170
- enumTypeAdjacenceId: '19',
171
- surfaceAiu: 49,
172
- surfaceAue: 65,
173
- enumCfgIsolationLncId: '2',
174
- label: 'garage privé collectif',
175
- bExpected: 0.7
176
- },
177
- {
178
- enumTypeAdjacenceId: '20',
179
- label: "local tertiaire à l'intérieur de l'immeuble en contact avec l'appartement",
180
- bExpected: 0.2
181
- },
182
- {
183
- enumTypeAdjacenceId: '21',
184
- surfaceAiu: 4.94,
185
- surfaceAue: 8.8,
186
- enumCfgIsolationLncId: '2',
187
- label: 'autres dépendances',
188
- bExpected: 0.75
189
- },
190
- {
191
- enumTypeAdjacenceId: '22',
192
- label: "local non déperditif (local à usage d'habitation chauffé)",
193
- bExpected: 0
194
- }
195
- ])(
196
- '$label (id:$enumTypeAdjacenceId)',
197
- ({
198
- enumTypeAdjacenceId,
199
- surfaceAiu = undefined,
200
- surfaceAue = undefined,
201
- zoneClimatique = undefined,
202
- enumCfgIsolationLncId = undefined,
203
- bExpected
204
- }) => {
205
- const data = {
206
- enumTypeAdjacenceId,
207
- surfaceAiu,
208
- surfaceAue,
209
- enumCfgIsolationLncId,
210
- zoneClimatique
211
- };
212
-
213
- const b = deperditionMurService.b(data);
214
- expect(b).toBe(bExpected);
215
- }
216
- );
217
- });
218
-
219
- describe('deperditions (agrégation GV + ventilation) avec des doubles de test', () => {
220
- /**
221
- * Construit un service avec huit doubles de test dont la méthode `execute`
222
- * renvoie le `__di` (donnée intermédiaire) attaché à chaque donnée d'entrée.
223
- */
224
- const buildService = () => {
225
- const murService = { execute: vi.fn((ctx, de) => de.__di) };
226
- const porteService = { execute: vi.fn((ctx, de) => de.__di) };
227
- const plancherBasService = { execute: vi.fn((ctx, de) => de.__di) };
228
- const plancherHautService = { execute: vi.fn((ctx, de) => de.__di) };
229
- const baieVitreeService = { execute: vi.fn((ctx, bv) => bv.donnee_entree.__di) };
230
- const espaceTamponService = { execute: vi.fn(() => ({ tag: 'ets-di' })) };
231
- const pontThermiqueService = { execute: vi.fn((ctx, env, de) => de.__di) };
232
- const ventilationService = { execute: vi.fn((ctx, de) => de.__di) };
233
-
234
- const service = new DeperditionEnveloppeService(
235
- murService,
236
- porteService,
237
- plancherBasService,
238
- plancherHautService,
239
- baieVitreeService,
240
- espaceTamponService,
241
- pontThermiqueService,
242
- ventilationService
243
- );
244
-
245
- return {
246
- service,
247
- murService,
248
- porteService,
249
- plancherBasService,
250
- plancherHautService,
251
- baieVitreeService,
252
- espaceTamponService,
253
- pontThermiqueService,
254
- ventilationService
255
- };
256
- };
257
-
258
- test('somme les contributions de chaque paroi et alimente la ventilation avec les surfaces', () => {
259
- const { service, espaceTamponService, ventilationService } = buildService();
260
-
261
- const enveloppe = {
262
- mur_collection: {
263
- mur: [
264
- {
265
- // déperditif, isolé "connu" (1) => surfaceNonIsolee
266
- donnee_entree: {
267
- surface_paroi_opaque: 10,
268
- enum_type_adjacence_id: '1',
269
- enum_type_isolation_id: '1',
270
- __di: { b: 0.5, umur: 2 }
271
- }
272
- },
273
- {
274
- // b > 0 mais adjacence 22 (local non déperditif) => non compté en surface déperditive,
275
- // isolation hors ['1','2'] => surfaceIsolee
276
- donnee_entree: {
277
- surface_paroi_opaque: 20,
278
- enum_type_adjacence_id: '22',
279
- enum_type_isolation_id: '3',
280
- __di: { b: 0.8, umur: 1 }
281
- }
282
- },
283
- {
284
- // b = 0 => aucune surface comptée
285
- donnee_entree: {
286
- surface_paroi_opaque: 5,
287
- enum_type_adjacence_id: '1',
288
- enum_type_isolation_id: '2',
289
- __di: { b: 0, umur: 3 }
290
- }
291
- }
292
- ]
293
- },
294
- porte_collection: {
295
- porte: [
296
- {
297
- donnee_entree: {
298
- surface_porte: 2,
299
- presence_joint: true,
300
- __di: { b: 0.5, uporte: 3 }
301
- }
302
- },
303
- {
304
- donnee_entree: {
305
- surface_porte: 4,
306
- presence_joint: false,
307
- __di: { b: 0, uporte: 2 }
308
- }
309
- }
310
- ]
311
- },
312
- plancher_bas_collection: {
313
- plancher_bas: [
314
- {
315
- donnee_entree: {
316
- surface_paroi_opaque: 8,
317
- __di: { b: 0.9, upb_final: 1.5 }
318
- }
319
- }
320
- ]
321
- },
322
- plancher_haut_collection: {
323
- plancher_haut: [
324
- {
325
- donnee_entree: {
326
- surface_paroi_opaque: 12,
327
- enum_type_adjacence_id: '1',
328
- enum_type_isolation_id: '1',
329
- __di: { b: 0.7, uph: 1 }
330
- }
331
- },
332
- {
333
- donnee_entree: {
334
- surface_paroi_opaque: 6,
335
- enum_type_adjacence_id: '22',
336
- enum_type_isolation_id: '5',
337
- __di: { b: 0.5, uph: 2 }
338
- }
339
- },
340
- {
341
- donnee_entree: {
342
- surface_paroi_opaque: 3,
343
- enum_type_adjacence_id: '1',
344
- enum_type_isolation_id: '1',
345
- __di: { b: 0, uph: 1 }
346
- }
347
- }
348
- ]
349
- },
350
- baie_vitree_collection: {
351
- baie_vitree: [
352
- {
353
- donnee_entree: {
354
- surface_totale_baie: 5,
355
- presence_joint: true,
356
- __di: { b: 0.6, u_menuiserie: 2 }
357
- }
358
- },
359
- {
360
- donnee_entree: {
361
- surface_totale_baie: 3,
362
- presence_joint: false,
363
- __di: { b: 0, u_menuiserie: 1 }
364
- }
365
- }
366
- ]
367
- },
368
- ets_collection: {
369
- ets: { donnee_entree: {} }
370
- },
371
- pont_thermique_collection: {
372
- pont_thermique: [
373
- {
374
- // pourcentage explicite
375
- donnee_entree: { l: 4, pourcentage_valeur_pont_thermique: 0.5, __di: { k: 0.2 } }
376
- },
377
- {
378
- // pourcentage absent => 1 par défaut
379
- donnee_entree: { l: 2, __di: { k: 0.3 } }
380
- }
381
- ]
382
- }
383
- };
384
-
385
- const logement = {
386
- enveloppe,
387
- ventilation_collection: {
388
- ventilation: [{ donnee_entree: { __di: { hvent: 100, hperm: 50 } } }]
389
- }
390
- };
391
-
392
- const ctx = { zoneClimatique: { value: 'h1a' } };
393
- const resultat = service.deperditions(ctx, logement);
394
-
395
- // Contributions GV (b * surface * u)
396
- expect(resultat.deperdition_mur).toBeCloseTo(0.5 * 10 * 2 + 0.8 * 20 * 1 + 0, 9); // 26
397
- expect(resultat.deperdition_porte).toBeCloseTo(0.5 * 2 * 3, 9); // 3
398
- expect(resultat.deperdition_plancher_bas).toBeCloseTo(0.9 * 8 * 1.5, 9); // 10.8
399
- expect(resultat.deperdition_plancher_haut).toBeCloseTo(0.7 * 12 * 1 + 0.5 * 6 * 2, 9); // 14.4
400
- expect(resultat.deperdition_baie_vitree).toBeCloseTo(0.6 * 5 * 2, 9); // 6
401
- expect(resultat.deperdition_pont_thermique).toBeCloseTo(4 * 0.2 * 0.5 + 2 * 0.3 * 1, 9); // 1
402
- expect(resultat.hvent).toBe(100);
403
- expect(resultat.hperm).toBe(50);
404
-
405
- // deperdition_enveloppe = somme GV + hvent + hperm
406
- expect(resultat.deperdition_enveloppe).toBeCloseTo(
407
- 26 + 3 + 10.8 + 14.4 + 6 + 1 + 100 + 50,
408
- 9
409
- );
410
-
411
- // L'espace tampon a bien été calculé et stocké
412
- expect(espaceTamponService.execute).toHaveBeenCalledOnce();
413
- expect(enveloppe.ets_collection.ets.donnee_intermediaire).toStrictEqual({ tag: 'ets-di' });
414
-
415
- // La ventilation reçoit les surfaces agrégées :
416
- // déperditive = 10 (mur A) + 2 (porte A) + 12 (ph A) + 5 (baie A) = 29
417
- // isolée = 20 (mur B) + 6 (ph B) = 26
418
- // non isolée = 10 (mur A) + 12 (ph A) = 22
419
- // menuiserie avec joint = 2 (porte A) + 5 (baie A) = 7
420
- // menuiserie sans joint = 4 (porte B) + 3 (baie B) = 7
421
- expect(ventilationService.execute).toHaveBeenCalledWith(
422
- ctx,
423
- { __di: { hvent: 100, hperm: 50 } },
424
- 29,
425
- 26,
426
- 22,
427
- 7,
428
- 7
429
- );
430
- });
431
-
432
- test('utilise la première véranda lorsque les ETS sont dupliqués (tableau)', () => {
433
- const { service, espaceTamponService } = buildService();
434
-
435
- const premierEts = { donnee_entree: { reference: 'ets-1' } };
436
- const enveloppe = {
437
- mur_collection: {},
438
- porte_collection: {},
439
- plancher_bas_collection: {},
440
- plancher_haut_collection: {},
441
- baie_vitree_collection: {},
442
- ets_collection: { ets: [premierEts, { donnee_entree: { reference: 'ets-2' } }] },
443
- pont_thermique_collection: {}
444
- };
445
- const logement = { enveloppe, ventilation_collection: {} };
446
-
447
- service.deperditions({ zoneClimatique: { value: 'h1a' } }, logement);
448
-
449
- // Seule la première véranda est traitée
450
- expect(espaceTamponService.execute).toHaveBeenCalledOnce();
451
- expect(premierEts.donnee_intermediaire).toStrictEqual({ tag: 'ets-di' });
452
- });
453
-
454
- test('renvoie des déperditions nulles pour une enveloppe et une ventilation vides', () => {
455
- const { service, espaceTamponService, ventilationService } = buildService();
456
-
457
- const enveloppe = {
458
- mur_collection: {},
459
- porte_collection: {},
460
- plancher_bas_collection: {},
461
- plancher_haut_collection: {},
462
- baie_vitree_collection: {},
463
- pont_thermique_collection: {}
464
- };
465
- const logement = { enveloppe, ventilation_collection: {} };
466
-
467
- const resultat = service.deperditions({ zoneClimatique: { value: 'h1a' } }, logement);
468
-
469
- // Aucune paroi, aucun ETS, aucune ventilation
470
- expect(espaceTamponService.execute).not.toHaveBeenCalled();
471
- expect(ventilationService.execute).not.toHaveBeenCalled();
472
- expect(resultat).toStrictEqual({
473
- deperdition_mur: 0,
474
- deperdition_plancher_bas: 0,
475
- deperdition_plancher_haut: 0,
476
- deperdition_baie_vitree: 0,
477
- deperdition_pont_thermique: 0,
478
- deperdition_porte: 0,
479
- hperm: 0,
480
- hvent: 0,
481
- deperdition_enveloppe: 0
482
- });
483
- });
484
- });
485
-
486
- describe.skip('Benchmark', () => {
487
- test('reworked', () => {
488
- const data = {
489
- enumTypeAdjacenceId: '8',
490
- surfaceAiu: 2.82,
491
- surfaceAue: 300,
492
- enumCfgIsolationLncId: '2',
493
- label: 'garage'
494
- };
495
-
496
- for (let i = 0; i < 1000; i++) {
497
- const b = deperditionMurService.b(data);
498
- expect(b).toBe(0.9);
499
- }
500
- });
501
-
502
- test('legacy', () => {
503
- const di = { b: undefined };
504
- const de = {
505
- enum_type_adjacence_id: '8',
506
- surface_aiu: 2.82,
507
- surface_aue: 300,
508
- enum_cfg_isolation_lnc_id: '2'
509
- };
510
- const du = {};
511
- const zc = '1';
512
-
513
- for (let i = 0; i < 1000; i++) {
514
- b(di, de, du, zc);
515
- expect(di.b).toBe(0.9);
516
- }
517
- });
518
- });
519
-
520
- describeIntegration("Test d'intégration de calcul des deperditions", () => {
521
- test.each(corpus)('deperditions pour dpe %s', (ademeId) => {
522
- let dpeRequest = getAdemeFileJson(ademeId);
523
- dpeRequest = normalizerService.normalize(dpeRequest);
524
-
525
- /** @type {Contexte} */
526
- const ctx = contexteBuilder.fromDpe(dpeRequest);
527
- /** @type {Logement} */
528
- const logement = dpeRequest.logement;
529
- /** @type {Deperdition} */
530
- const deperditions = service.deperditions(ctx, logement);
531
-
532
- expect(deperditions.deperdition_mur).toBeCloseTo(
533
- dpeRequest.logement.sortie.deperdition.deperdition_mur,
534
- 1
535
- );
536
- expect(deperditions.deperdition_porte).toBeCloseTo(
537
- dpeRequest.logement.sortie.deperdition.deperdition_porte,
538
- 1
539
- );
540
- expect(deperditions.deperdition_plancher_bas).toBeCloseTo(
541
- dpeRequest.logement.sortie.deperdition.deperdition_plancher_bas,
542
- 1
543
- );
544
- expect(deperditions.deperdition_plancher_haut).toBeCloseTo(
545
- dpeRequest.logement.sortie.deperdition.deperdition_plancher_haut,
546
- 1
547
- );
548
- });
549
- });
550
- });
@@ -1,82 +0,0 @@
1
- import { ContexteBuilder } from '../../contexte.builder.js';
2
- import { DpeNormalizerService } from '../../../../normalizer/domain/dpe-normalizer.service.js';
3
- import { beforeEach, describe, expect, test, vi } from 'vitest';
4
- import { BaieVitreeTvStore } from '../../../../dpe/infrastructure/enveloppe/baieVitreeTv.store.js';
5
- import { EspaceTamponService } from './espace-tampon.service.js';
6
- import { getAdemeFileJson } from '../../../../../../test/test-helpers.js';
7
- import { describeIntegration } from '../../../../../../test/helpers/integration-test.js';
8
-
9
- /** @type {EspaceTamponService} **/
10
- let service;
11
-
12
- /** @type {DpeNormalizerService} **/
13
- let normalizerService;
14
-
15
- /** @type {BaieVitreeTvStore} **/
16
- let tvStore;
17
-
18
- /** @type {ContexteBuilder} **/
19
- let contexteBuilder;
20
-
21
- describe('Calcul de déperdition des baies vitrées', () => {
22
- beforeEach(() => {
23
- tvStore = new BaieVitreeTvStore();
24
- service = new EspaceTamponService(tvStore);
25
- normalizerService = new DpeNormalizerService();
26
- contexteBuilder = new ContexteBuilder();
27
- });
28
-
29
- describe('Determination des données intermédiaires', () => {
30
- test('Doit retourner bver et directement', () => {
31
- vi.spyOn(tvStore, 'getBver').mockReturnValue(0.55);
32
- vi.spyOn(tvStore, 'getCoefTransparenceEts').mockReturnValue(0.62);
33
-
34
- /**
35
- * @type {Contexte}
36
- */
37
- const ctx = {
38
- zoneClimatique: { value: 'h1a' }
39
- };
40
-
41
- /**
42
- * @type {Ets}
43
- */
44
- const ets = {
45
- donnee_entree: {
46
- enum_cfg_isolation_lnc_id: '10',
47
- tv_coef_transparence_ets_id: '2'
48
- }
49
- };
50
-
51
- let etsDI = service.execute(ctx, ets);
52
- expect(tvStore.getBver).toHaveBeenCalledWith('h1a', 10);
53
- expect(tvStore.getCoefTransparenceEts).toHaveBeenCalledWith(2);
54
- expect(etsDI).toStrictEqual({ bver: 0.55, coef_transparence_ets: 0.62 });
55
- });
56
- });
57
-
58
- describeIntegration("Test d'intégration des ets", () => {
59
- test.each(['2273E0303205P', '2364E0984413P', '2283E0131604Y'])(
60
- 'vérification des DI des ets pour dpe %s',
61
- (ademeId) => {
62
- let dpeRequest = getAdemeFileJson(ademeId);
63
- dpeRequest = normalizerService.normalize(dpeRequest);
64
-
65
- /** @type {Contexte} */
66
- const ctx = contexteBuilder.fromDpe(dpeRequest);
67
-
68
- let ets = dpeRequest.logement.enveloppe.ets_collection?.ets || {};
69
- if (ets && Array.isArray(ets)) {
70
- ets = ets[0];
71
- }
72
-
73
- const di = service.execute(ctx, ets);
74
- expect(di.bver).toBeCloseTo(ets.donnee_intermediaire.bver, 2);
75
- expect(di.coef_transparence_ets).toBeCloseTo(
76
- ets.donnee_intermediaire.coef_transparence_ets,
77
- 2
78
- );
79
- }
80
- );
81
- });
82
- });