import { describe, expect, it } from "vitest"; import { detectComposerTrigger, expandCollapsedComposerCursor, replaceTextRange, } from "./composer-logic"; describe("detectComposerTrigger", () => { it("detects @path trigger at cursor", () => { const text = "Please check @src/com"; const trigger = detectComposerTrigger(text, text.length); expect(trigger).toEqual({ kind: "path", query: "src/com", rangeStart: "Please check ".length, rangeEnd: text.length, }); }); it("detects slash command token while typing command name", () => { const text = "/mo"; const trigger = detectComposerTrigger(text, text.length); expect(trigger).toEqual({ kind: "slash-command", query: "mo", rangeStart: 0, rangeEnd: text.length, }); }); it("detects slash model query after /model", () => { const text = "/model spark"; const trigger = detectComposerTrigger(text, text.length); expect(trigger).toEqual({ kind: "slash-model", query: "spark", rangeStart: 0, rangeEnd: text.length, }); }); }); describe("replaceTextRange", () => { it("replaces a text range and returns new cursor", () => { const replaced = replaceTextRange("hello @src", 6, 10, ""); expect(replaced).toEqual({ text: "hello ", cursor: 6, }); }); }); describe("expandCollapsedComposerCursor", () => { it("keeps cursor unchanged when no mention segment is present", () => { expect(expandCollapsedComposerCursor("plain text", 5)).toBe(5); }); it("maps collapsed mention cursor to expanded text cursor", () => { const text = "what's in my @AGENTS.md fsfdas"; const collapsedCursorAfterMention = "what's in my ".length + 2; const expandedCursorAfterMention = "what's in my @AGENTS.md ".length; expect(expandCollapsedComposerCursor(text, collapsedCursorAfterMention)).toBe( expandedCursorAfterMention, ); }); it("allows path trigger detection to close after selecting a mention", () => { const text = "what's in my @AGENTS.md "; const collapsedCursorAfterMention = "what's in my ".length + 2; const expandedCursor = expandCollapsedComposerCursor(text, collapsedCursorAfterMention); expect(detectComposerTrigger(text, expandedCursor)).toBeNull(); }); });