import { describe, expect, it } from "vitest"; import { readBentext, splitIngredientLine } from "./parse-bentext.mjs"; describe("readBentext", () => { it("parse header, ingredients, steps (3 blocs)", () => { const raw = `Blinis 4 Petites crêpes épaisses. --- Farine|200|g Œufs|2|pcs --- Mélanger la farine. Cuire dans une poêle. `; const result = readBentext(raw); expect(result.title).toBe("Blinis"); expect(result.version).toBe("4"); expect(result.servings).toBe(4); expect(result.description).toBe("Petites crêpes épaisses."); expect(result.ingredients).toEqual([ { name: "Farine", quantity: 200, unit: "g", note: "" }, { name: "Œufs", quantity: 2, unit: "pcs", note: "" } ]); expect(result.steps).toEqual([ { id: "step-1", priority: 10, phase: "cook", dependsOn: [], text: "Mélanger la farine." }, { id: "step-2", priority: 20, phase: "cook", dependsOn: ["step-1"], text: "Cuire dans une poêle." } ]); expect(result.notes).toEqual([]); expect(result.tags).toEqual([]); expect(result.meta).toEqual([]); }); it("lit les tags, notes et meta quand 6 blocs --- sont présents", () => { const raw = `Title 1 Description. --- Farine|100|g --- Mélanger. --- Note A Note B --- apéritif blinis sprite:blinis --- Meta X Meta Y `; const result = readBentext(raw); expect(result.notes).toEqual(["Note A", "Note B"]); expect(result.tags).toEqual(["apéritif", "blinis", "sprite:blinis"]); expect(result.meta).toEqual(["Meta X", "Meta Y"]); }); it("ne place les tags qu'à partir de 4 blocs (sans notes ni meta)", () => { const raw = `Title 1 Description. --- Farine|100|g --- Mélanger. --- apéritif blinis `; const result = readBentext(raw); expect(result.tags).toEqual(["apéritif", "blinis"]); expect(result.notes).toEqual([]); expect(result.meta).toEqual([]); }); it("place tags + meta dès 5 blocs (sans notes)", () => { const raw = `Title 1 Description. --- Farine|100|g --- Mélanger. --- apéritif --- Meta X `; const result = readBentext(raw); expect(result.tags).toEqual(["apéritif"]); expect(result.notes).toEqual([]); expect(result.meta).toEqual(["Meta X"]); }); it("convertit les tags en minuscules", () => { const raw = `T 1 D --- A|1|g --- S1 --- Bento CARNET `; const result = readBentext(raw); expect(result.tags).toEqual(["bento", "carnet"]); }); it("gère les notes et tags vides (blocs absents)", () => { const raw = `T D --- --- S1 `; const result = readBentext(raw); expect(result.title).toBe("T"); expect(result.version).toBe(""); expect(result.servings).toBe(1); expect(result.description).toBe("D"); expect(result.ingredients).toEqual([]); expect(result.steps).toEqual([{ id: "step-1", priority: 10, phase: "cook", dependsOn: [], text: "S1" }]); expect(result.notes).toEqual([]); expect(result.tags).toEqual([]); expect(result.meta).toEqual([]); }); it("extrait la note ingrédient après position 3 (parties | supplémentaires)", () => { const raw = `T 1 D --- Farine|200|g|type 55 --- Mélanger. --- --- --- `; const result = readBentext(raw); expect(result.ingredients).toEqual([ { name: "Farine", quantity: 200, unit: "g", note: "type 55" } ]); }); }); describe("splitIngredientLine", () => { it("split name | quantity | unit", () => { expect(splitIngredientLine("Farine|200|g")).toEqual({ name: "Farine", quantity: 200, unit: "g", note: "" }); }); it("renvoie quantity=NaN si non numérique (comportement préservé)", () => { expect(splitIngredientLine("Sel|abc|c. à c.")).toEqual({ name: "Sel", quantity: Number.NaN, unit: "c. à c.", note: "" }); }); it("conserve la note avec | à l'intérieur", () => { expect(splitIngredientLine("Sauce|2|c. à s.|soja | sucrée")).toEqual({ name: "Sauce", quantity: 2, unit: "c. à s.", note: "soja | sucrée" }); }); });