import { describe, it } from "@std/testing/bdd"; import { expect } from "@std/expect"; import { createSchemaTransformerV2 } from "../../src/plugin.ts"; import { asObjectSchema, getTypeFromCode } from "../utils.ts"; describe("Schema: Nested wrappers (Cell, Stream, Default)", () => { it("Default inside object", async () => { const code = ` interface Default {} interface X { field1: Default; field2: Default; } `; const { type, checker } = await getTypeFromCode(code, "X"); const gen = createSchemaTransformerV2(); const s = asObjectSchema(gen.generateSchema(type, checker)); const field1 = s.properties?.field1 as any; expect(field1?.type).toBe("string"); expect(field1?.default).toBe("hello"); const field2 = s.properties?.field2 as any; expect(field2?.type).toBe("number"); expect(field2?.default).toBe(42); }); it("Cell>", async () => { const code = ` interface Default {} interface X { value: Cell>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const s = asObjectSchema( createSchemaTransformerV2().generateSchema(type, checker), ); const v = s.properties?.value as any; expect(v.type).toBe("string"); expect(v.default).toBe("default"); expect(v.asCell).toBe(true); }); it("Stream>", async () => { const code = ` interface Default {} interface X { events: Stream>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const s = asObjectSchema( createSchemaTransformerV2().generateSchema(type, checker), ); const ev = s.properties?.events as any; expect(ev.type).toBe("string"); expect(ev.default).toBe("initial"); expect(ev.asStream).toBe(true); }); it("Stream> yields array schema with default", async () => { const code = ` interface Default {} interface X { events: Stream>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const s = asObjectSchema( createSchemaTransformerV2().generateSchema(type, checker), ); const ev = s.properties?.events as any; expect(ev.type).toBe("array"); const evItems = ev.items as any; expect(evItems?.type).toBe("string"); expect(ev.default).toEqual(["a"]); expect(ev.asStream).toBe(true); }); it("array of Cell", async () => { const code = ` interface X { items: Array>; } `; const { type, checker } = await getTypeFromCode(code, "X"); const s = asObjectSchema( createSchemaTransformerV2().generateSchema(type, checker), ); const items = s.properties?.items as any; expect(items.type).toBe("array"); const itemsItems = items.items as any; expect(itemsItems?.type).toBe("string"); // Items may carry asCell depending on formatter; assert if present if (Object.prototype.hasOwnProperty.call(itemsItems, "asCell")) { expect(itemsItems.asCell).toBe(true); } }); it("Cell", async () => { const code = ` interface X { tags: Cell; } `; const { type, checker } = await getTypeFromCode(code, "X"); const s = asObjectSchema( createSchemaTransformerV2().generateSchema(type, checker), ); const tags = s.properties?.tags as any; expect(tags.type).toBe("array"); const tagsItems = tags.items as any; expect(tagsItems?.type).toBe("string"); expect(tags.asCell).toBe(true); }); it("complex nesting: Cell> and Default", async () => { const code = ` interface Default {} interface X { cellOfDefault: Cell>; defaultArray: Default; } `; const { type, checker } = await getTypeFromCode(code, "X"); const s = asObjectSchema( createSchemaTransformerV2().generateSchema(type, checker), ); const c = s.properties?.cellOfDefault as any; expect(c.type).toBe("string"); expect(c.default).toBe("d"); expect(c.asCell).toBe(true); const da = s.properties?.defaultArray as any; expect(da.type).toBe("array"); const daItems = da.items as any; expect(daItems?.type).toBe("string"); expect(da.default).toEqual(["a", "b"]); }); });