/** * intentParserDirectFix.test.ts — S478 DIRECT-FIX: intentParser gate per domande definitorie * * Copertura (20 test): * Gruppo A — Domande definitorie → null (no tool pre-exec, risposta LLM diretta) * Gruppo B — Query live legittime → tool corretto (web_search, get_weather, ecc.) * Gruppo C — Pattern edge-case: "chi è attuale/in carica" → live (politica) * Gruppo D — Domande storiche brevi → null * * SESSIONE: S478 — DIRECT_RESPONSE_MODE */ import { describe, it, expect } from "vitest"; import { detectIntent } from "@/lib/agentLoop/intentParser"; // ─── Gruppo A: Domande definitorie → null ───────────────────────────────────── describe("S478: detectIntent — domande definitorie → null (no tool pre-exec)", () => { it("A-1. 'chi è Einstein?' → null (storico, LLM sa già)", () => { expect(detectIntent("chi è Einstein?")).toBeNull(); }); it("A-2. 'chi era Napoleone?' → null (_isHistoricalPerson)", () => { expect(detectIntent("chi era Napoleone?")).toBeNull(); }); it("A-3. 'cos'è il DNA?' → null (_isDefinitionalShort)", () => { expect(detectIntent("cos'è il DNA?")).toBeNull(); }); it("A-4. 'cosa è il quantum computing?' → null", () => { expect(detectIntent("cosa è il quantum computing?")).toBeNull(); }); it("A-5. 'cosa sono i quark?' → null", () => { expect(detectIntent("cosa sono i quark?")).toBeNull(); }); it("A-6. 'what is machine learning?' → null (_isDefinitionalShort EN)", () => { expect(detectIntent("what is machine learning?")).toBeNull(); }); it("A-7. 'what are neural networks?' → null", () => { expect(detectIntent("what are neural networks?")).toBeNull(); }); it("A-8. 'who is Marie Curie?' → null", () => { expect(detectIntent("who is Marie Curie?")).toBeNull(); }); it("A-9. 'who was Leonardo da Vinci?' → null (_isHistoricalPerson EN)", () => { expect(detectIntent("who was Leonardo da Vinci?")).toBeNull(); }); it("A-10. 'dimmi chi è Darwin' → null (_isInlineDefinitional)", () => { expect(detectIntent("dimmi chi è Darwin")).toBeNull(); }); it("A-11. 'sai chi è Tesla?' → null (_isInlineDefinitional)", () => { expect(detectIntent("sai chi è Tesla?")).toBeNull(); }); it("A-12. 'mi spieghi chi è Platone?' → null", () => { expect(detectIntent("mi spieghi chi è Platone?")).toBeNull(); }); }); // ─── Gruppo B: Query live → tool corretto ───────────────────────────────────── describe("S478: detectIntent — query live → tool corretto (non bloccato)", () => { it("B-1. 'meteo a Milano domani' → get_weather", () => { const r = detectIntent("meteo a Milano domani"); expect(r?.tool).toBe("get_weather"); }); it("B-2. 'ultime notizie di oggi' → get_news", () => { const r = detectIntent("ultime notizie di oggi"); expect(r?.tool).toBe("get_news"); }); it("B-3. 'quanto costa Bitcoin adesso?' → web_search o get_currency", () => { const r = detectIntent("quanto costa Bitcoin adesso?"); expect(r).not.toBeNull(); expect(["web_search", "get_currency", "math_eval"]).toContain(r?.tool); }); it("B-4. 'chi ha vinto la Champions ieri sera?' → web_search (live: partita)", () => { const r = detectIntent("chi ha vinto la Champions ieri sera?"); expect(r?.tool).toBe("web_search"); }); it("B-5. 'cerca su internet le ultime su OpenAI' → web_search (meta-search)", () => { const r = detectIntent("cerca su internet le ultime su OpenAI"); expect(r?.tool).toBe("web_search"); }); it("B-6. 'genera un'immagine di un tramonto sul mare' → generate_image", () => { const r = detectIntent("genera un'immagine di un tramonto sul mare"); expect(r?.tool).toBe("generate_image"); }); }); // ─── Gruppo C: Edge case — "chi è attuale/in carica" → live ────────────────── describe("S478: detectIntent — 'chi è attuale/in carica' = live, non bloccato", () => { it("C-1. 'chi è il presidente degli USA adesso?' → web_search (live: adesso)", () => { const r = detectIntent("chi è il presidente degli USA adesso?"); expect(r?.tool).toBe("web_search"); }); it("C-2. 'chi è il governo attuale italiano?' → web_search (live: governo + attuale)", () => { const r = detectIntent("chi è il governo attuale italiano?"); expect(r?.tool).toBe("web_search"); }); it("C-3. 'chi è in carica come ministro?' → web_search (live: in carica)", () => { const r = detectIntent("chi è in carica come ministro?"); expect(r?.tool).toBe("web_search"); }); }); // ─── Gruppo D: Math eval — non bloccato da guard definitorio ───────────────── describe("S478: detectIntent — math eval non interferisce con guard", () => { it("D-1. '123 * 456' → math_eval (non bloccato da _isDefinitionalShort)", () => { const r = detectIntent("123 * 456"); expect(r?.tool).toBe("math_eval"); }); it("D-2. 'calcola sqrt(144)' → math_eval", () => { const r = detectIntent("calcola sqrt(144)"); expect(r?.tool).toBe("math_eval"); }); });