form-ref-assets.test.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { mapSchema, spriteSchema, soundSchema } from "@nengine/core-schema";
  2. import { describe, expect, it } from "vitest";
  3. import type { EditorContentListing } from "../src/ipc.js";
  4. import { deriveFormSchema } from "../src/renderer/form-schema.js";
  5. import { refIdList } from "../src/renderer/form-panel.js";
  6. function listing(overrides?: Partial<EditorContentListing>): EditorContentListing {
  7. return {
  8. kinds: [
  9. { kind: "sprite", count: 2, files: [{ id: "player", name: "player.yaml", path: "content/sprites/player.yaml" }] },
  10. { kind: "sound", count: 1, files: [{ id: "click", name: "click.yaml", path: "content/sounds/click.yaml" }] },
  11. ],
  12. mods: [],
  13. assets: ["grass-1", "water-1"],
  14. ...overrides,
  15. };
  16. }
  17. function field(schema: Parameters<typeof deriveFormSchema>[0], name: string) {
  18. const found = deriveFormSchema(schema).fields.find((f) => f.name === name);
  19. if (found === undefined) throw new Error(`no field "${name}"`);
  20. return found;
  21. }
  22. describe("form-ref asset fields (F2)", () => {
  23. it("sprite image layer src and sound src already resolve to the asset kind", () => {
  24. const frames = field(spriteSchema, "frames");
  25. expect(frames.type).toBe("array");
  26. const layers = frames.element?.fields?.find((f) => f.name === "layers");
  27. expect(layers?.type).toBe("array");
  28. const layer = layers?.element;
  29. expect(layer?.type).toBe("union");
  30. const imageBranch = layer?.branches?.find((b) => b.id === "image");
  31. const src = imageBranch?.fields?.find((f) => f.name === "src");
  32. expect(src?.type).toBe("ref");
  33. expect(src?.refKind).toBe("asset");
  34. const soundSrc = field(soundSchema, "src");
  35. expect(soundSrc.type).toBe("ref");
  36. expect(soundSrc.refKind).toBe("asset");
  37. });
  38. it("map tiles record values resolve to the asset kind (tile id → asset id)", () => {
  39. const tiles = field(mapSchema, "tiles");
  40. expect(tiles.type).toBe("record");
  41. expect(tiles.optional).toBe(true);
  42. expect(tiles.recordValue?.type).toBe("ref");
  43. expect(tiles.recordValue?.refKind).toBe("asset");
  44. });
  45. it("refIdList feeds asset ids for asset refs and kind ids for content refs", () => {
  46. const l = listing();
  47. expect(refIdList(l, "asset")).toEqual(["grass-1", "water-1"]);
  48. expect(refIdList(l, "sprite")).toEqual(["player"]);
  49. expect(refIdList(l, "sound")).toEqual(["click"]);
  50. });
  51. it("an empty asset list yields [] — the free-text fallback path", () => {
  52. const l = listing({ assets: [] });
  53. expect(refIdList(l, "asset")).toEqual([]);
  54. expect(refIdList(l, "unknown-kind")).toEqual([]);
  55. });
  56. });