import { describe, expect, it } from "vitest";
import { maakPerceptieRegister, type ExtractorRegistratie } from "./perceptie";
import { seedExtractors } from "./extractors";
import { perceptieRegister } from "./perceptie-register";

const nulExtractor = () => [];

describe("extractorregister (AUT-F4)", () => {
  it("vouwt registraties tot een register per brontype", () => {
    const registraties: ExtractorRegistratie[] = [
      { bronType: "compromis", extractor: nulExtractor },
      { bronType: "epc", extractor: nulExtractor },
    ];
    const register = maakPerceptieRegister(registraties);
    expect(register.compromis).toBe(nulExtractor);
    expect(register.epc).toBe(nulExtractor);
    expect(register.eigendomstitel).toBeUndefined();
  });

  it("faalt luid op een dubbele registratie voor hetzelfde brontype", () => {
    const registraties: ExtractorRegistratie[] = [
      { bronType: "compromis", extractor: nulExtractor },
      { bronType: "compromis", extractor: nulExtractor },
    ];
    expect(() => maakPerceptieRegister(registraties)).toThrow(/Dubbele extractor/);
  });

  it("het app-brede register volgt exact de gegenereerde barrel (geen dubbels)", () => {
    // Bouwbaarheid is de kerninvariant: een dubbele registratie in de barrel
    // zou hier werpen. De dekkingsgraad zelf wordt geratchet in
    // lib/fundament-ratchet.test.ts.
    expect(perceptieRegister).toEqual(maakPerceptieRegister(seedExtractors));
    expect(Object.keys(perceptieRegister).length).toBe(seedExtractors.length);
  });
});
