import { describe, it } from "vitest"; import { assertProperty, fc } from "../../../test/property.ts"; import { parseDocumentId } from "../system-config.ts"; const upper = fc.constantFrom(..."ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("")); const alnum = fc.constantFrom( ..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split(""), ); const tokenChar = fc.constantFrom( ..."ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-".split(""), ); const prefix = fc .tuple(upper, fc.array(alnum, { minLength: 1, maxLength: 7 })) .map(([head, tail]) => head + tail.join("")); const token = fc .array(tokenChar, { minLength: 8, maxLength: 8 }) .map((chars) => chars.join("")); const typeToken = fc.constantFrom("SPEC", "PHASE", "PLAN", "ISSUE", "RESEARCH"); describe("parseDocumentId (property)", () => { it("round-trips every well-formed ID into its parts", () => { assertProperty( import.meta.url, "parseDocumentId round-trips valid IDs", fc.property(prefix, typeToken, token, (p, ty, tok) => { const id = `${p}-${ty}-${tok}`; const parsed = parseDocumentId(id); return ( parsed.id === id && parsed.prefix === p && parsed.token === tok && parsed.type === ty.toLowerCase() ); }), ); }); it("rejects case-folded prefixes (IDs are case-sensitive)", () => { assertProperty( import.meta.url, "parseDocumentId rejects lowercase prefixes", fc.property(prefix, typeToken, token, (p, ty, tok) => { const bad = `${p.toLowerCase()}-${ty}-${tok}`; try { parseDocumentId(bad); return false; } catch { return true; } }), ); }); });