import { describe, expect, it } from "vitest"; import { initialCardState, reviewCard } from "../lib/learning/sm2.ts"; describe("SM-2 (répétition espacée)", () => { it("suit la progression 1j → 6j → ~15j pour des rappels « Bien »", () => { let s = initialCardState(); let r = reviewCard(s, 4); expect(r.intervalDays).toBe(1); r = reviewCard(r, 4); expect(r.intervalDays).toBe(6); r = reviewCard(r, 4); expect(r.intervalDays).toBeGreaterThanOrEqual(13); expect(r.intervalDays).toBeLessThanOrEqual(17); }); it("réinitialise la carte en cas d'échec (Encore) et compte la défaillance", () => { let s = { ef: 2.5, intervalDays: 30, reps: 5, lapses: 0 }; const r = reviewCard(s, 2); expect(r.reps).toBe(0); expect(r.lapses).toBe(1); expect(r.dueInDays).toBe(0); }); it("borne le facteur de facilité à 1.3 minimum", () => { let s = initialCardState(); for (let i = 0; i < 20; i++) s = reviewCard(s, 2); expect(s.ef).toBeGreaterThanOrEqual(1.3); }); it("« Facile » allonge davantage que « Difficile »", () => { const base = { ef: 2.5, intervalDays: 10, reps: 3, lapses: 0 }; const easy = reviewCard({ ...base }, 5); const hard = reviewCard({ ...base }, 3); expect(easy.intervalDays).toBeGreaterThan(hard.intervalDays); }); it("plafonne l'intervalle à 365 jours", () => { let s = { ef: 2.5, intervalDays: 300, reps: 8, lapses: 0 }; const r = reviewCard(s, 5); expect(r.intervalDays).toBeLessThanOrEqual(365); }); });