From ac8b377f84e6b9dfb47a5798be04ed02f7830cc2 Mon Sep 17 00:00:00 2001 From: AdrianoDev Date: Sat, 22 Aug 2026 10:02:59 +0200 Subject: [PATCH] longevity test: motivazione corretta per il caso 'test disattivato', e media verificata numericamente MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Il commento del test 'un test disattivato non entra nel calcolo' diceva che q_attivita fosse l'unica voce del sotto-dominio questionario_lifestyle: falso, ne ha sei (q_attivita, q_alimentazione, q_sigarette, q_alcol_life, q_luce, q_schermi). Il motivo vero per cui il test funziona e' che il fixture ne compila solo una delle sei, quindi disattivarla svuota il sotto-dominio. Corretto il commento a dire il motivo vero, con nota su cosa succederebbe se il fixture cambiasse. Aggiunto anche il test mancante sulla regola della media: q_attivita(3)=65 e q_alimentazione(6)=60, stesso sotto-dominio, verificano che il valore dell'asse "Stile di Vita & Sonno" sia la loro media (62.5), diversa sia dalla somma (125) sia da ciascun addendo (65, 60) — nessun test esistente controllava il VALORE della media, solo lo stato. --- tests/longevity/motore.test.ts | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) 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', () => {