import { describe, test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';

// Lint-test for the language-reviewer fasit fixture.
// Mirrors the structure-only discipline of editorial-reviewer-fixture.test.mjs,
// persona-reviewer-fixture.test.mjs and fact-checker-fixture.test.mjs: this test
// asserts the SHAPE of the fixture — the one judging axis (norsk-språkkvalitet),
// all five checks (L1–L5), the three severities, the six Del 4 cases that form
// the gold standard, the direction-not-copy boundary, and the cold-reader /
// context-isolation principle. Whether the agent's live flags actually reproduce
// the fasit directions is [GATE]/[OPERATØR], never self-certified here.

const FIXTURE_PATH = fileURLToPath(
  new URL('./fixtures/language-reviewer-cases.md', import.meta.url)
);

const fixture = readFileSync(FIXTURE_PATH, 'utf8');

// The five checks of the one axis.
const CHECKS = ['L1', 'L2', 'L3', 'L4', 'L5'];

// The single axis name (Norwegian, as the agent and the writing contract use it).
const AXIS = 'norsk-språkkvalitet';

// The three-rung severity scale.
const SEVERITIES = ['BLOCK', 'REWORK', 'NICE'];

describe('language-reviewer fixture structure', () => {
  test('names the judging axis (norsk-språkkvalitet)', () => {
    assert.ok(
      new RegExp(AXIS, 'i').test(fixture),
      `fixture must name the axis "${AXIS}"`
    );
  });

  test('documents all five checks (L1–L5)', () => {
    for (const check of CHECKS) {
      assert.ok(
        fixture.includes(check),
        `fixture must reference the check "${check}"`
      );
    }
  });

  test('defines the three-rung severity scale', () => {
    for (const sev of SEVERITIES) {
      assert.ok(
        fixture.includes(sev),
        `fixture must define the severity "${sev}"`
      );
    }
  });

  test('documents the six Del 4 cases', () => {
    const cases = fixture.match(/^###\s+Case\s+\d+\b/gim) || [];
    assert.equal(
      cases.length,
      6,
      `fixture must document exactly 6 Del 4 cases (found ${cases.length})`
    );
  });

  test('keeps the jury-judges-writer-writes boundary (direction, not copy)', () => {
    assert.ok(
      /direction, not rewritten copy/i.test(fixture),
      'fixture must state the direction-not-copy boundary'
    );
  });

  test('documents the cold-reader / context-isolation principle', () => {
    assert.ok(
      /cold/i.test(fixture) &&
        /(context pollution|framing-bias)/i.test(fixture),
      'fixture must document the cold-reader / context-isolation principle ' +
        '(context pollution / framing-bias)'
    );
  });
});
