import { describe, expect, it } from "vitest"; import { createDesignTokenRegistry, DESIGN_TOKEN_CATEGORIES, DESIGN_TOKEN_VALUE_MAX_LENGTH, DesignTokenError, type DesignTokenInput, } from "../src/index.js"; function tokens(...overrides: readonly Partial[]): readonly DesignTokenInput[] { return overrides.map((override) => ({ description: "A token used by this test.", label: "Test token", name: "background.page", value: "#ffffff", ...override, })); } describe("design token validation", () => { it("accepts a minimal well-formed declaration and derives category and CSS variable", () => { const registry = createDesignTokenRegistry(tokens({ name: "spacing.2xs", value: "0.125rem" })); const token = registry.get("spacing.2xs"); expect(token).toEqual({ category: "spacing", cssVariable: "--ekklesia-spacing-2xs", description: "A token used by this test.", label: "Test token", name: "spacing.2xs", value: "0.125rem", }); expect(Object.isFrozen(token)).toBe(true); }); it("rejects a duplicate token name", () => { expect(() => createDesignTokenRegistry(tokens({}, {}))).toThrowError( expect.objectContaining({ code: "DESIGN_TOKEN_DUPLICATE" }), ); }); it.each([ ["a single segment", "page"], ["an empty name", ""], ["an uppercase segment", "background.Page"], ["an underscore", "background.page_alt"], ["a trailing dot", "background.page."], ["a space", "background.page alt"], ])("rejects %s as a token name", (_label, name) => { expect(() => createDesignTokenRegistry(tokens({ name }))).toThrowError( expect.objectContaining({ code: "DESIGN_TOKEN_NAME_INVALID" }), ); }); it("rejects a name whose first segment is not a known category", () => { expect(() => createDesignTokenRegistry(tokens({ name: "brand.primary" }))).toThrowError( expect.objectContaining({ code: "DESIGN_TOKEN_CATEGORY_UNKNOWN" }), ); }); it.each([ ["a declaration terminator", "#fff; color: red"], ["a rule block", "#fff } body { display: none"], ["a comment", "#fff /* hidden */"], ["an at-rule", "@import 'evil.css'"], ["a url reference", "url(https://example.invalid/x.png)"], ["an override", "#fff !important"], ["a markup fragment", "