I tre contatori (serieAllenamenti, seriePartite, serieConferme) e streak erano zero fisso in useRosa(): la sezione Serie di presenze del profilo mostrava sempre progresso nullo, i badge legati alla costanza erano impossibili da sbloccare e l'obiettivo Continuita di squadra restava a 0/12. serieConsecutiva() e serieConferme() (src/lib/presenze.ts) derivano le serie dagli eventi passati e da risposte_presenze gia in cache, senza query aggiuntive. Migration m9: nuova colonna risposto_il con l'istante della prima risposta, resa immutabile da un trigger, confrontata con eventi_app.creato_il per le conferme entro 24 ore. Serviva perche aggiornato_il registra l'ultima modifica, quindi chi rispondeva subito e cambiava idea dopo risultava lento. Corregge anche la barra di progresso, che misurava valore/prossimo e tornava indietro a ogni traguardo raggiunto (2/3 = 67%, poi 3/6 = 50%). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
68 lines
3.1 KiB
TypeScript
68 lines
3.1 KiB
TypeScript
/** Check delle serie consecutive: `bun test/unit/serie.test.ts`. */
|
|
import assert from "node:assert/strict";
|
|
import { giocatori, type Giocatore } from "@/lib/crapp-data";
|
|
import { aggiornaSerie, serieDefs, serieGiocatore, serieMigliore, statoSerie } from "@/lib/serie";
|
|
|
|
function g(valori: Partial<Giocatore> = {}): Giocatore {
|
|
return { ...giocatori[0]!, serieAllenamenti: 0, seriePartite: 0, serieConferme: 0, ...valori };
|
|
}
|
|
|
|
const allenamenti = serieDefs.find((d) => d.tipo === "allenamenti")!;
|
|
|
|
// --- aggiornaSerie: si azzera solo la serie non onorata -----------------------
|
|
assert.equal(aggiornaSerie(4, true), 5);
|
|
assert.equal(aggiornaSerie(4, false), 0, "un buco azzera la serie");
|
|
assert.equal(aggiornaSerie(0, true), 1, "si riparte da uno");
|
|
|
|
// --- statoSerie: traguardi 3 / 6 / 10 / 15 -----------------------------------
|
|
const partenza = statoSerie(allenamenti, g());
|
|
assert.deepEqual(
|
|
[partenza.valore, partenza.prossimo, partenza.manca, partenza.progresso],
|
|
[0, 3, 3, 0],
|
|
);
|
|
assert.equal(partenza.messaggio, "Serie allenamenti azzerata: riparti dal prossimo.");
|
|
|
|
const aDue = statoSerie(allenamenti, g({ serieAllenamenti: 2 }));
|
|
assert.deepEqual([aDue.prossimo, aDue.manca, aDue.progresso], [3, 1, 67]);
|
|
assert.equal(aDue.messaggio, "Manca solo una volta al prossimo traguardo!");
|
|
|
|
const sulTraguardo = statoSerie(allenamenti, g({ serieAllenamenti: 3 }));
|
|
assert.equal(sulTraguardo.prossimo, 6, "raggiunto un traguardo si punta al successivo");
|
|
assert.equal(sulTraguardo.progresso, 0, "nuovo livello: la barra riparte dal traguardo preso");
|
|
|
|
// La barra non torna mai indietro dentro lo stesso livello.
|
|
const dentroIlLivello = [3, 4, 5].map((v) => statoSerie(allenamenti, g({ serieAllenamenti: v })));
|
|
assert.deepEqual(
|
|
dentroIlLivello.map((s) => s.progresso),
|
|
[0, 33, 67],
|
|
);
|
|
|
|
const veterano = statoSerie(allenamenti, g({ serieAllenamenti: 7 }));
|
|
assert.equal(veterano.messaggio, "Che continuità: ancora 3 e sali di livello.");
|
|
|
|
const fuoriScala = statoSerie(allenamenti, g({ serieAllenamenti: 20 }));
|
|
assert.deepEqual([fuoriScala.prossimo, fuoriScala.manca, fuoriScala.progresso], [null, 0, 100]);
|
|
assert.equal(fuoriScala.messaggio, "Serie leggendaria: sei fuori scala!");
|
|
|
|
// --- serieGiocatore / serieMigliore ------------------------------------------
|
|
const tutte = serieGiocatore(g({ serieAllenamenti: 4, seriePartite: 1, serieConferme: 9 }));
|
|
assert.equal(tutte.length, serieDefs.length, "tre serie indipendenti");
|
|
assert.deepEqual(
|
|
tutte.map((s) => s.valore),
|
|
[4, 1, 9],
|
|
"ogni serie legge il proprio contatore",
|
|
);
|
|
|
|
const migliore = serieMigliore(g({ serieAllenamenti: 4, seriePartite: 1, serieConferme: 9 }));
|
|
assert.equal(migliore.def.tipo, "conferme", "in home si mostra la serie più lunga");
|
|
assert.ok(serieMigliore(g()), "anche a zero c'è sempre una serie da mostrare");
|
|
|
|
// --- invarianti sulle definizioni --------------------------------------------
|
|
for (const def of serieDefs) {
|
|
const ordinati = [...def.traguardi].sort((a, b) => a - b);
|
|
assert.deepEqual(def.traguardi, ordinati, `${def.tipo}: traguardi crescenti`);
|
|
assert.ok(def.traguardi.length > 0 && def.label && def.descrizione);
|
|
}
|
|
|
|
console.log("serie: ok");
|