test.coordination/core/validators/venue.validator.test.ts

test.coordination/core/validators/venue.validator.test.ts is a file in Codebase Testing. 79 lines of code and 0 definitions.

import { describe, it } from "vitest";
import {
    positionFieldLabels,
    positionsOutsideRecords,
    selfCorrections,
    venueFieldsFrom,
    venueSchemaGaps,
} from "coordination-surface/tools/core/validators/venue.validator.ts";
import assert from "node:assert/strict";

const RECORD_A = "Agent A — role";
const RECORD_CLOSE = "└───";

const TEMPLATE = ["```text", RECORD_A, "  Needs: what", "  Durable: where", RECORD_CLOSE, "```"].join("\n");

const item = function item(key: string, body: string): string[] {
    return [`┌─── AGENT ${key} at:1 to:*`, body, `└─── END AGENT ${key}`];
};

describe("venueSchemaGaps", () => {
    it("names a field the template does not declare and a declared field a record leaves out", () => {
        assert.deepEqual(venueFieldsFrom(TEMPLATE), ["Needs", "Durable"]);
        const source = [
            RECORD_A,
            "  Needs: x",
            "  Extra: y",
            "    deeper: ignored",
            RECORD_CLOSE,
            "Agent B — role",
            "  Needs: z",
            "  Durable: kept",
        ].join("\n");
        assert.deepEqual(
            venueSchemaGaps(source, TEMPLATE).map((gap) => [gap.record, gap.field, gap.state]),
            [
                [RECORD_A, "Extra", "undeclared"],
                [RECORD_A, "Durable", "absent"],
            ],
        );
        assert.deepEqual(venueSchemaGaps(source, "no records"), []);
    });
});

describe("positionFieldLabels", () => {
    it("reads the labels of the field block after its lead, past the signature line and up to the first blank", () => {
        const template = [
            "A position carries these fields:",
            "",
            "Signed: A",
            "Claim: text",
            "Evidence: path",
            "",
            "After: no",
        ].join("\n");
        assert.deepEqual(positionFieldLabels(template), ["Claim", "Evidence"]);
        assert.deepEqual(positionFieldLabels("no block"), []);
    });
});

describe("selfCorrections", () => {
    it("names an item whose contradiction clause cites its own seat's letter before the signature", () => {
        const source = [
            ...item("A-2", "Contradicts: A-1, the draft"),
            ...item("B-1", "Contradicts: A-1"),
            ...item("A-3", "Contradicts: nothing. Signed: A-3"),
        ].join("\n");
        assert.deepEqual(selfCorrections(source), ["A-2"]);
    });
});

describe("positionsOutsideRecords", () => {
    it("names a position opened outside every item and every fence", () => {
        const source = [
            "Position A-1 — stray",
            ...item("A-2", "Position A-2 — held"),
            "```",
            "Position A-3 — quoted",
            "```",
            "Position B-1",
        ].join("\n");
        assert.deepEqual(positionsOutsideRecords(source), [
            { key: "A-1", line: 1 },
            { key: "B-1", line: 8 },
        ]);
    });
});