test.govlab/context/core/factories/grammar.factory.test.ts

test.govlab/context/core/factories/grammar.factory.test.ts is a file in Codebase Testing. 148 lines of code and 0 definitions.

import { PAG_FACE, createGovlabContext, createPagGrammar, keywordIdOf, validate } from "@govlab/context";
import assert from "node:assert/strict";
import { test } from "vitest";

const pag = createPagGrammar();

const emptyData = { documentTypes: [], keywords: [], productions: [], templates: [], terminals: [] };

const slot = (name: string): { description: string; kind: string; name: string; required: boolean } => ({
    description: name,
    kind: "text",
    name,
    required: true,
});

test("the bundled grammar loads its keywords, document types, productions, templates and categories", () => {
    assert.ok(pag.keywords().length > 0);
    assert.ok(pag.documentTypes().length > 0);
    assert.ok(pag.productions().length > 0);
    assert.ok(pag.templates().length > 0);
    for (const category of ["action", "semantic_operation", "validation", "report", "invariant", "coordination"]) {
        assert.ok(pag.categories().includes(category), category);
    }
    assert.equal(PAG_FACE.name, "pag");
});

test("a keyword id is its token, finds its keyword back, and a token defined once holds every role it plays", () => {
    const [keyword] = pag.keywords();
    assert.ok(keyword, "the grammar holds a keyword");
    assert.equal(pag.keyword(keywordIdOf(keyword))?.keyword, keyword.keyword);
    assert.ok(pag.keyword("READ")?.roles[0].meaning.startsWith("Input acquisition") === true);
    assert.ok(pag.keyword("POPULATION")?.roles[0].grounds?.includes("reasoning:node:ver-population") === true);
    assert.equal(pag.keyword("action:READ"), null, "a keyword is addressed by its token alone");
    const wait = pag.keyword("WAIT");
    assert.ok(wait, "the grammar holds WAIT");
    assert.deepEqual(
        wait.roles.map((role) => role.category),
        ["action", "coordination"],
    );
    assert.ok(pag.keywords("action").includes(wait));
    assert.ok(pag.keywords("coordination").includes(wait));
});

test("every keyword role outside contextual grounds into the reasoning collection", () => {
    const ungrounded = pag
        .keywords()
        .flatMap((keyword) => keyword.roles.map((role) => ({ keyword: keyword.keyword, role })))
        .filter((entry) => entry.role.category !== "contextual" && (entry.role.grounds ?? []).length === 0)
        .map((entry) => entry.keyword);
    assert.deepEqual(ungrounded, []);
    const coordination = new Set(pag.keywords("coordination").map((keyword) => keyword.keyword));
    for (const token of ["SURFACE", "RECORD", "ITEM", "SATISFIED_BY", "WAIT", "BARRIER", "SWAP"]) {
        assert.ok(coordination.has(token), token);
    }
    const validation = new Set(pag.keywords("validation").map((keyword) => keyword.keyword));
    for (const token of ["POPULATION", "REFUSE", "FRESHNESS", "STANDING", "UNKNOWN", "BLOCKED", "PROMOTE", "PUBLISH"]) {
        assert.ok(validation.has(token), token);
    }
});

test("the bundled grammar validates clean", () => {
    const issues = pag.validateOntology();
    assert.deepEqual(issues.duplicateKeywordIds, []);
    assert.deepEqual(issues.danglingTemplateSlots, []);
    assert.deepEqual(issues.docTypesWithoutVerb, []);
    assert.deepEqual(issues.unknownTemplateTypes, []);
    assert.deepEqual(issues.unrecognizedDocumentTypes, []);
    assert.deepEqual(issues.unrecognizedDocumentVerbs, []);
    assert.deepEqual(issues.danglingNonterminals, []);
    assert.deepEqual(issues.unusedTerminals, []);
});

test("a right-hand reference that is neither a production nor a terminal dangles, and a declared one does not", () => {
    const dangling = createPagGrammar({
        data: {
            ...emptyData,
            productions: [
                { group: "g", lhs: "root", rhs: "<known> <ghost>" },
                { group: "g", lhs: "known", rhs: '"x"' },
            ],
        },
    }).validateOntology();
    assert.deepEqual(dangling.danglingNonterminals, [{ production: "root", ref: "ghost" }]);
    const resolved = createPagGrammar({
        data: {
            ...emptyData,
            productions: [
                { group: "g", lhs: "root", rhs: "<leaf> <known>" },
                { group: "g", lhs: "known", rhs: '"x"' },
            ],
            terminals: ["leaf"],
        },
    }).validateOntology();
    assert.deepEqual(resolved.danglingNonterminals, []);
    assert.deepEqual(resolved.unusedTerminals, []);
});

test("a declared terminal no production names is unused", () => {
    const issues = createPagGrammar({
        data: { ...emptyData, productions: [{ group: "g", lhs: "root", rhs: '"x"' }], terminals: ["orphan"] },
    }).validateOntology();
    assert.deepEqual(issues.unusedTerminals, ["orphan"]);
});

test("a document type or verb the keyword vocabulary lacks is unrecognized, and one it covers is not", () => {
    const documentTypes = [{ defaultVerb: "DOES", purpose: "x", type: "GHOST", verbs: ["DOES"] }];
    const bare = createPagGrammar({ data: { ...emptyData, documentTypes } }).validateOntology();
    assert.deepEqual(bare.unrecognizedDocumentTypes, ["GHOST"]);
    assert.ok(bare.unrecognizedDocumentVerbs.some((entry) => entry.type === "GHOST" && entry.verb === "DOES"));
    const covered = createPagGrammar({
        data: {
            ...emptyData,
            documentTypes,
            keywords: [
                { keyword: "GHOST", roles: [{ category: "document_type", example: "", meaning: "" }] },
                { keyword: "DOES", roles: [{ category: "document_verb", example: "", meaning: "" }] },
            ],
        },
    }).validateOntology();
    assert.deepEqual(covered.unrecognizedDocumentTypes, []);
    assert.deepEqual(covered.unrecognizedDocumentVerbs, []);
});

test("a slot the body never carries dangles, and a template of an unregistered type is unknown", () => {
    const issues = createPagGrammar({
        data: {
            ...emptyData,
            documentTypes: [{ defaultVerb: "DOES", purpose: "x", type: "KNOWN", verbs: ["DOES"] }],
            templates: [
                {
                    body: "{present}",
                    constraints: [],
                    slots: [slot("present"), slot("absent")],
                    title: "t",
                    type: "KNOWN",
                },
                { body: "", constraints: [], slots: [], title: "g", type: "GHOST" },
            ],
        },
    }).validateOntology();
    assert.deepEqual(issues.danglingTemplateSlots, [{ slot: "absent", type: "KNOWN" }]);
    assert.deepEqual(issues.unknownTemplateTypes, ["GHOST"]);
});

test("every bundled template resolves with every slot filled and validates clean", () => {
    for (const template of pag.templates()) {
        const slots = Object.fromEntries(
            template.slots.map((entry) => [entry.name, entry.name.toLowerCase().split("_").join(" ")]),
        );
        const resolved = pag.resolvePagTemplate(template.type, slots);
        assert.deepEqual(resolved.violations, [], template.type);
        assert.deepEqual(resolved.unresolved, [], template.type);
        assert.deepEqual(validate(resolved.text).defects, [], template.type);
    }
});

test("contextFor surfaces the resolver's contracts for an applicable type and none for an inapplicable one", () => {
    const context = createGovlabContext();
    assert.ok(context.pag.contextFor("AGENT").contracts.length > 0);
    assert.deepEqual(context.pag.contextFor("NONSENSE").contracts, []);
});