59 lines
3.5 KiB
JavaScript
59 lines
3.5 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { readFileSync } from "node:fs";
|
|
import test from "node:test";
|
|
import { findProviderCatalogEntry, mergeProviderAdvertisement } from "./provider-advertisements.mjs";
|
|
|
|
const catalog = JSON.parse(readFileSync(new URL("./local-provider-catalog.json", import.meta.url), "utf8"));
|
|
const worldSmokeAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/eve-world-smoke.provider-advertisement.json", import.meta.url), "utf8"));
|
|
const saiAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/sai-vn.provider-advertisement.json", import.meta.url), "utf8"));
|
|
const saiSurface = JSON.parse(readFileSync(new URL("./fixtures/sai-vn-surface.json", import.meta.url), "utf8"));
|
|
|
|
test("merges generic world fixture transport with advertised world interaction", () => {
|
|
const catalogProvider = findProviderCatalogEntry(catalog, "eve.world-smoke");
|
|
const provider = mergeProviderAdvertisement(catalogProvider, worldSmokeAdvertisement);
|
|
const surface = provider.surfaces.find(candidate => candidate.surfaceId === "eve.world-smoke.surface");
|
|
|
|
assert.equal(surface.transport, "local-json");
|
|
assert.equal(surface.url, "./fixtures/eve-world-smoke-surface.json");
|
|
assert.equal(surface.surfaceKind, "interactive-world");
|
|
assert.equal(surface.worldInteraction.projectionKind, "provider-authored-world-surface");
|
|
assert.equal(surface.worldInteraction.commandBoundary, "eve.world-smoke.commands");
|
|
assert.equal(surface.worldInteraction.receiptSchema, "eve.world_smoke.command_receipt.v1");
|
|
assert.deepEqual(surface.worldInteraction.loweringTargets, ["web-reference", "unity-uitoolkit", "unity-scene", "electron-shell", "tui"]);
|
|
});
|
|
|
|
test("preserves Sai required and optional nested plugin requirements from advertisement", () => {
|
|
const catalogProvider = findProviderCatalogEntry(catalog, "gamecult.home.vn");
|
|
const provider = mergeProviderAdvertisement(catalogProvider, saiAdvertisement);
|
|
const surface = provider.surfaces.find(candidate => candidate.surfaceId === "sai.visual_novel.surface");
|
|
const byPlugin = new Map(surface.requiresPlugins.map(requirement => [requirement.pluginId, requirement]));
|
|
|
|
assert.equal(surface.transport, "local-json");
|
|
assert.equal(surface.url, "./fixtures/sai-vn-surface.json");
|
|
assert.equal(byPlugin.get("sai.vn").availability, "required");
|
|
assert.deepEqual(byPlugin.get("sai.vn").requiredCapabilities, [
|
|
"vn.stage",
|
|
"story.choose",
|
|
"story.continue",
|
|
"story.jump",
|
|
]);
|
|
assert.equal(byPlugin.get("norn.graph").availability, "optional-nested");
|
|
assert.deepEqual(byPlugin.get("norn.graph").requiredCapabilities, []);
|
|
assert.deepEqual(byPlugin.get("norn.graph").optionalCapabilities, ["embed.norn"]);
|
|
assert.equal(byPlugin.get("tex.math").availability, "optional-nested");
|
|
assert.deepEqual(byPlugin.get("tex.math").requiredCapabilities, []);
|
|
assert.deepEqual(byPlugin.get("tex.math").optionalCapabilities, ["embed.tex"]);
|
|
});
|
|
|
|
test("composes Norn by advertised capability and owner document", () => {
|
|
const norn = saiSurface.surface.root.children.find(component => component.kind === "embed.norn");
|
|
const [graphDocument] = norn.embeddedDocuments;
|
|
|
|
assert.equal(norn.props.pluginId, "norn.graph");
|
|
assert.equal(norn.props.capability, "embed.norn");
|
|
assert.equal(graphDocument.schemaId, "norn.graph.document.v1");
|
|
assert.equal(graphDocument.documentId, "cultmesh://norn/graphs/sai-nested-norn");
|
|
assert.equal("engine" in norn.props, false);
|
|
assert.equal("layout" in norn.props, false);
|
|
assert.equal("graph" in norn.props, false);
|
|
});
|