/* Unit tests for effect classifier covering EffectClassifier. It also guards the documented public contract and regression-sensitive edge cases. Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only. RFC-1311: Compass header sweep — declares the effect suite's contract for test-file scaffold coverage. */ import { describe, it, expect } from "vitest"; import { EffectClassifier, getDefaultEffectClassifier, resetDefaultEffectClassifier, } from "../effect-classifier.ts"; import type { EffectDeclarationExt } from "@warpgogol/werkstatt-shared/component"; describe("EffectClassifier", () => { it("classifies known operations", () => { const classifier = getDefaultEffectClassifier(); expect(classifier.classify("leitstand.propagate")).toBe("compensatable"); expect(classifier.classify("mission.close")).toBe("irreversible-emission"); expect(classifier.classify("sternsystem.sync")).toBe("compensatable"); expect(classifier.classify("release.prepare")).toBe("irreversible-emission"); }); it("throws EFFECT-03 for unknown operations", () => { const classifier = getDefaultEffectClassifier(); expect(() => classifier.classify("unknown.operation")).toThrow(/EFFECT-03/); }); it("getDeclaration returns the full declaration", () => { const classifier = getDefaultEffectClassifier(); const decl = classifier.getDeclaration("leitstand.propagate"); expect(decl).not.toBeNull(); expect(decl?.effectClass).toBe("compensatable"); expect(decl?.compensation).toBeDefined(); expect(decl?.compensation?.verificationProbes.length).toBeGreaterThan(0); }); it("getDeclaration returns null for unknown operations", () => { const classifier = getDefaultEffectClassifier(); expect(classifier.getDeclaration("unknown.operation")).toBeNull(); }); it("has() checks operation existence", () => { const classifier = getDefaultEffectClassifier(); expect(classifier.has("leitstand.propagate")).toBe(true); expect(classifier.has("unknown.operation")).toBe(false); }); it("supports custom declarations", () => { const customDecls: EffectDeclarationExt[] = [ { effectClass: "revertible", description: "Custom revertible op", recoveryCommand: "custom.revert", commitMetadata: null, }, ]; const classifier = new EffectClassifier(customDecls); expect(classifier.classify("custom.revert")).toBe("revertible"); }); it("default classifier is a singleton", () => { const a = getDefaultEffectClassifier(); const b = getDefaultEffectClassifier(); expect(a).toBe(b); }); it("resetDefaultEffectClassifier creates a new singleton", () => { const a = getDefaultEffectClassifier(); resetDefaultEffectClassifier(); const b = getDefaultEffectClassifier(); expect(a).not.toBe(b); }); });