From 1ff650ecd590746bfab569640fad94b5a620bca2 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Sat, 5 Sep 2026 12:42:11 +0200 Subject: [PATCH] Aggiunge i test della proiezione del momento MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `proietta()` decide dove atterra uno swipe, quindi è la funzione che rompe il gesto se sbaglia: il test copre segno, simmetria, linearità nella velocità e il valore atteso della decelerazione esponenziale (1000 px/s -> ~499 px). Copre anche i preset di `molla`, per evitare che un rimbalzo finisca per sbaglio sul default o che una durata esca dalla scala utile. Co-Authored-By: Claude Opus 5 --- test/unit/molla.test.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 test/unit/molla.test.ts diff --git a/test/unit/molla.test.ts b/test/unit/molla.test.ts new file mode 100644 index 0000000..68096b7 --- /dev/null +++ b/test/unit/molla.test.ts @@ -0,0 +1,36 @@ +/** Check della proiezione del momento: `bun test/unit/molla.test.ts`. */ +import assert from "node:assert/strict"; +import { molla, proietta } from "@/lib/molla"; + +// --- proietta: da fermo non si va da nessuna parte ---------------------------- +assert.equal(proietta(0), 0, "velocità zero non proietta nulla"); + +// --- proietta: il segno segue la direzione del gesto -------------------------- +assert.ok(proietta(500) > 0, "un gesto verso destra proietta a destra"); +assert.ok(proietta(-500) < 0, "un gesto verso sinistra proietta a sinistra"); +assert.equal(proietta(-500), -proietta(500), "la proiezione è simmetrica"); + +// --- proietta: più veloce vai, più lontano arrivi (proporzionale) ------------- +assert.ok(proietta(1000) > proietta(500), "più velocità, più distanza"); +assert.equal(proietta(1000), 2 * proietta(500), "la distanza è lineare nella velocità"); + +// --- proietta: i valori sono quelli della decelerazione esponenziale di iOS ---- +// v/1000 * d / (1 - d) con d = 0.998 → 1000 px/s proietta 499 px. +assert.ok( + Math.abs(proietta(1000) - 499) < 0.5, + `1000 px/s deve proiettare ~499 px, non ${proietta(1000)}`, +); + +// Una decelerazione più bassa frena prima: serve per gesti più "corti". +assert.ok(proietta(1000, 0.99) < proietta(1000, 0.998), "meno decelerazione, meno corsa"); + +// --- molla: i preset restano nel dominio utile di bounce/duration ------------- +for (const [nome, preset] of Object.entries(molla)) { + assert.equal(preset.type, "spring", `${nome} deve essere una molla`); + assert.ok(preset.bounce >= 0 && preset.bounce < 1, `${nome}: bounce fuori scala`); + assert.ok(preset.duration > 0 && preset.duration <= 1, `${nome}: duration fuori scala`); +} +assert.equal(molla.ui.bounce, 0, "il default non deve sorpassare il target"); +assert.ok(molla.slancio.bounce > 0, "il preset da gesto ha un rimbalzo"); + +console.log("molla: ok");