1import { describe, expect, it } from "vite-plus/test";
2
3import { detectComposerTrigger, serializeComposerFileLink } from "./composerTrigger.ts";
4
5describe("detectComposerTrigger", () => {
6 it.each(["Use ", "Use\t", "Use\n "])("detects inline slash skills after %j", (prefix) => {
7 const text = `${prefix}/skill:review later`;
8 const cursor = `${prefix}/skill:review`.length;
9 expect(detectComposerTrigger(text, cursor)).toEqual({
10 kind: "slash-command",
11 query: "skill:review",
12 rangeStart: prefix.length,
13 rangeEnd: cursor,
14 });
15 });
16
17 it.each(["Use /", "Use /review"])("detects the inline slash token in %j", (text) => {
18 expect(detectComposerTrigger(text, text.length)).toEqual({
19 kind: "slash-command",
20 query: text.slice(5),
21 rangeStart: 4,
22 rangeEnd: text.length,
23 });
24 });
25
26 it.each(["Use/review", "https://example.com/review", "Use /review "])(
27 "does not trigger for %j",
28 (text) => expect(detectComposerTrigger(text, text.length)).toBeNull(),
29 );
30
31 it.each(["$", "€", "£", "¥", "₹", "₩", "₿", "𑿝"])(
32 "detects %s skill prefixes and their source range",
33 (prefix) => {
34 const text = `Use ${prefix}review`;
35 expect(detectComposerTrigger(text, text.length)).toEqual({
36 kind: "skill",
37 query: "review",
38 rangeStart: 4,
39 rangeEnd: text.length,
40 });
41 },
42 );
43});
44
45describe("serializeComposerFileLink", () => {
46 it("uses the basename as the markdown label", () => {
47 expect(serializeComposerFileLink("path/to/package.json")).toBe(
48 "[package.json](path/to/package.json)",
49 );
50 });
51
52 it("encodes markdown-sensitive destination characters", () => {
53 expect(serializeComposerFileLink("docs/My File (draft).md")).toBe(
54 "[My File (draft).md](docs/My%20File%20%28draft%29.md)",
55 );
56 });
57
58 it("supports windows paths", () => {
59 expect(serializeComposerFileLink("C:\\repo\\src\\index.ts")).toBe(
60 "[index.ts](C:%5Crepo%5Csrc%5Cindex.ts)",
61 );
62 });
63
64 it("preserves paths that legitimately start with an at sign", () => {
65 expect(serializeComposerFileLink("@scope/package.json")).toBe(
66 "[package.json](@scope/package.json)",
67 );
68 });
69});