TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1import { describe, expect, it } from "vitest";2import { initialCardState, reviewCard } from "../lib/learning/sm2.ts";34describe("SM-2 (répétition espacée)", () => {5 it("suit la progression 1j → 6j → ~15j pour des rappels « Bien »", () => {6 let s = initialCardState();7 let r = reviewCard(s, 4);8 expect(r.intervalDays).toBe(1);9 r = reviewCard(r, 4);10 expect(r.intervalDays).toBe(6);11 r = reviewCard(r, 4);12 expect(r.intervalDays).toBeGreaterThanOrEqual(13);13 expect(r.intervalDays).toBeLessThanOrEqual(17);14 });1516 it("réinitialise la carte en cas d'échec (Encore) et compte la défaillance", () => {17 let s = { ef: 2.5, intervalDays: 30, reps: 5, lapses: 0 };18 const r = reviewCard(s, 2);19 expect(r.reps).toBe(0);20 expect(r.lapses).toBe(1);21 expect(r.dueInDays).toBe(0);22 });2324 it("borne le facteur de facilité à 1.3 minimum", () => {25 let s = initialCardState();26 for (let i = 0; i < 20; i++) s = reviewCard(s, 2);27 expect(s.ef).toBeGreaterThanOrEqual(1.3);28 });2930 it("« Facile » allonge davantage que « Difficile »", () => {31 const base = { ef: 2.5, intervalDays: 10, reps: 3, lapses: 0 };32 const easy = reviewCard({ ...base }, 5);33 const hard = reviewCard({ ...base }, 3);34 expect(easy.intervalDays).toBeGreaterThan(hard.intervalDays);35 });3637 it("plafonne l'intervalle à 365 jours", () => {38 let s = { ef: 2.5, intervalDays: 300, reps: 8, lapses: 0 };39 const r = reviewCard(s, 5);40 expect(r.intervalDays).toBeLessThanOrEqual(365);41 });42});43