diff --git a/tests/longevity/motore.test.ts b/tests/longevity/motore.test.ts index 6f674d0..32e6266 100644 --- a/tests/longevity/motore.test.ts +++ b/tests/longevity/motore.test.ts @@ -49,10 +49,17 @@ describe('il motore legge le curve dal registro', () => { // ancora una voce nel registro): siccome un asse insufficiente non porta // 'valore' nel tipo Punteggio, il JSON prima/dopo risultava IDENTICO — la // suite lo ha confermato (verificato eseguendo il test: fallisce con le due - // stringhe uguali). Corretto qui usando 'q_attivita', l'unica voce del - // sotto-dominio 'questionario_lifestyle' che pesa 1.00 dentro "Stile di Vita - // & Sonno": disattivarla fa cadere la copertura di quell'asse da 1.00 a 0 e - // lo stato passa da 'ok' a 'insufficiente' — una differenza vera e osservabile. + // stringhe uguali). Corretto qui usando 'q_attivita': NON e' l'unica voce + // del sotto-dominio 'questionario_lifestyle' (ne ha sei: q_attivita, + // q_alimentazione, q_sigarette, q_alcol_life, q_luce, q_schermi), ma in + // QUESTO fixture e' l'unica delle sei a cui si risponde. Disattivarla + // svuota davvero il sotto-dominio (nessun'altra voce lifestyle compilata a + // sostituirla), la copertura dell'asse "Stile di Vita & Sonno" (peso 1.00 + // su quel solo sotto-dominio) cade da 1.00 a 0 e lo stato passa da 'ok' a + // 'insufficiente' — una differenza vera e osservabile. Se in futuro il + // fixture compilasse anche un'altra risposta lifestyle, questo test + // andrebbe aggiornato: la disattivazione non svuoterebbe piu' il + // sotto-dominio da sola. const db = dbPronto(); salvaCompilazione(db, { client_code: 'ISL-0001', data: '2026-08-22', eta: 35, @@ -68,6 +75,25 @@ describe('il motore legge le curve dal registro', () => { expect(dopo.assi['Stile di Vita & Sonno'].stato).toBe('insufficiente'); expect(JSON.stringify(prima)).not.toBe(JSON.stringify(dopo)); }); + + it('due test dello stesso sotto-dominio danno la MEDIA dei punteggi, non la somma ne un singolo valore', () => { + // q_attivita e q_alimentazione condividono il sotto-dominio 'questionario_lifestyle', + // che pesa 1.00 (unico elemento) dentro l'asse "Stile di Vita & Sonno": il valore + // dell'asse coincide col valore del sotto-dominio, quindi la media si legge diretta. + const db = dbPronto(); + salvaCompilazione(db, { + client_code: 'ISL-0001', data: '2026-08-22', eta: 35, + // q_attivita curva incstep, steps [[0,20],[2,50],[4,80],[999,100]]: valore 3 -> + // lerp fra (2,50) e (4,80) a meta' strada -> punteggio 65. + // q_alimentazione curva x10: valore 6 -> punteggio 60. + // media = (65+60)/2 = 62.5: diversa dalla somma (125) e da ciascun addendo (65, 60). + risposte: { q_attivita: 3, q_alimentazione: 6 }, + }); + const r = calcolaSessione(db, 1); + const asse = r.assi['Stile di Vita & Sonno']; + expect(asse.stato).toBe('ok'); + if (asse.stato === 'ok') expect(asse.valore).toBe(62.5); + }); }); describe('calcolo e congelamento di una sessione', () => {