import { mapSchema, spriteSchema, soundSchema } from "@nengine/core-schema"; import { describe, expect, it } from "vitest"; import type { EditorContentListing } from "../src/ipc.js"; import { deriveFormSchema } from "../src/renderer/form-schema.js"; import { refIdList } from "../src/renderer/form-panel.js"; function listing(overrides?: Partial): EditorContentListing { return { kinds: [ { kind: "sprite", count: 2, files: [{ id: "player", name: "player.yaml", path: "content/sprites/player.yaml" }] }, { kind: "sound", count: 1, files: [{ id: "click", name: "click.yaml", path: "content/sounds/click.yaml" }] }, ], mods: [], assets: ["grass-1", "water-1"], ...overrides, }; } function field(schema: Parameters[0], name: string) { const found = deriveFormSchema(schema).fields.find((f) => f.name === name); if (found === undefined) throw new Error(`no field "${name}"`); return found; } describe("form-ref asset fields (F2)", () => { it("sprite image layer src and sound src already resolve to the asset kind", () => { const frames = field(spriteSchema, "frames"); expect(frames.type).toBe("array"); const layers = frames.element?.fields?.find((f) => f.name === "layers"); expect(layers?.type).toBe("array"); const layer = layers?.element; expect(layer?.type).toBe("union"); const imageBranch = layer?.branches?.find((b) => b.id === "image"); const src = imageBranch?.fields?.find((f) => f.name === "src"); expect(src?.type).toBe("ref"); expect(src?.refKind).toBe("asset"); const soundSrc = field(soundSchema, "src"); expect(soundSrc.type).toBe("ref"); expect(soundSrc.refKind).toBe("asset"); }); it("map tiles record values resolve to the asset kind (tile id → asset id)", () => { const tiles = field(mapSchema, "tiles"); expect(tiles.type).toBe("record"); expect(tiles.optional).toBe(true); expect(tiles.recordValue?.type).toBe("ref"); expect(tiles.recordValue?.refKind).toBe("asset"); }); it("refIdList feeds asset ids for asset refs and kind ids for content refs", () => { const l = listing(); expect(refIdList(l, "asset")).toEqual(["grass-1", "water-1"]); expect(refIdList(l, "sprite")).toEqual(["player"]); expect(refIdList(l, "sound")).toEqual(["click"]); }); it("an empty asset list yields [] — the free-text fallback path", () => { const l = listing({ assets: [] }); expect(refIdList(l, "asset")).toEqual([]); expect(refIdList(l, "unknown-kind")).toEqual([]); }); });