import { expect, test } from "bun:test"; import { parse } from "@wrnexus/syntax"; import { generate } from "../src/codegen.ts"; const SOURCE = `page Home { view { plain } }`; test("an island tag emits an island marker instead of a component mount", () => { const out = generate(parse(SOURCE), { islands: new Set(["Chart"]) }); expect(out).toContain("data-wrn-island="); expect(out).toContain("Chart"); expect(out).toContain('data-wrn-island-strategy="visible"'); // Non-island components still mount the normal way. expect(out).toContain('data-component="Card"'); }); test("without the island set the same tag stays a normal component", () => { const out = generate(parse(SOURCE)); expect(out).not.toContain("data-wrn-island="); expect(out).toContain('data-component="Chart"'); }); test("island props are serialized into the marker", () => { const out = generate(parse(SOURCE), { islands: new Set(["Chart"]) }); expect(out).toContain("Revenue"); }); test("numeric and boolean island props keep their types through the marker", () => { const source = `page Home { view { } }`; const out = generate(parse(source), { islands: new Set(["Chart"]) }); expect(out).toContain(""start":3"); expect(out).toContain(""live":true"); expect(out).toContain(""title":"Revenue""); }); test("a runtime expression prop fails the build with WRN-ISLAND-PROPS", () => { const source = `page Home { state count = 1 view { } }`; expect(() => generate(parse(source), { islands: new Set(["Chart"]) })).toThrow( /WRN-ISLAND-PROPS/, ); });