Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 31 additions & 7 deletions test/test_ai-code-eca.el
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@
(should-not ai-code-eca--menu-group-added)))

(ert-deftest ai-code-test-eca-menu-group-appears-in-layout ()
"ECA group should appear in the transient layout after adding.
This test verifies the actual layout exposes the expected suffixes."
"ECA commands should exist in the ECA transient, and selected ones
should be reachable from ai-code layouts where not shadowed."
(skip-unless (and (featurep 'transient)
(fboundp 'transient-define-group)))
(condition-case nil
Expand All @@ -81,21 +81,45 @@ This test verifies the actual layout exposes the expected suffixes."
(ai-code-eca--add-menu-group)
(unwind-protect
(progn
;; The default layout already uses "F" for an infix in Other Tools.
;; The narrower two-column layout still exposes the ECA file-context
;; command directly, so assert the actual behavior for both layouts.
;; Canonical source of truth: the dedicated ECA submenu.
;; All ECA bindings must be present here.
(dolist (expected '(("E" . ai-code-eca-create-session-for-workspace)
("W" . ai-code-eca-switch-session)
("D" . eca-workspaces)
("A" . ai-code-eca-add-workspace-folder)
("X" . ai-code-eca-remove-workspace-folder)
("F" . ai-code-eca-share-file-context)
("M" . ai-code-eca-share-repo-map-context)
("B" . ai-code-eca-chat-add-clipboard-context-now)
("Y" . ai-code-eca-clear-shared-context)))
(dolist (prefix '(ai-code-menu-default ai-code-menu-2-columns))
(let ((suffix (transient-get-suffix 'ai-code-eca-menu (car expected))))
(should suffix)
(should (eq (plist-get (cdr suffix) :command) (cdr expected)))))

;; Parent layouts may already bind some keys; only assert
;; bindings that are intentionally exposed and not shadowed.
;; "A" is intentionally excluded here: it may be claimed by
;; another command in the parent layout (e.g.
;; ai-code-derive-architecture-guardrails).
(dolist (prefix '(ai-code-menu-default ai-code-menu-2-columns))
(dolist (expected '(("E" . ai-code-eca-create-session-for-workspace)
("W" . ai-code-eca-switch-session)
("D" . eca-workspaces)
("X" . ai-code-eca-remove-workspace-folder)
("M" . ai-code-eca-share-repo-map-context)
("B" . ai-code-eca-chat-add-clipboard-context-now)
("Y" . ai-code-eca-clear-shared-context)))
(let ((suffix (transient-get-suffix prefix (car expected))))
(should suffix)
(should (eq (plist-get (cdr suffix) :command) (cdr expected))))))
(should (eq (plist-get (cdr suffix) :command) (cdr expected)))))

;; "A" is a known potential collision point; just assert that
;; some command is bound to it (without dictating which one).
(should (transient-get-suffix prefix "A")))

;; "F" is handled specially: the default layout keeps its
;; pre-existing infix while the two-column layout and the
;; dedicated ECA menu both expose the ECA file-context command.
(let ((default-f-suffix (transient-get-suffix 'ai-code-menu-default "F"))
(two-column-f-suffix (transient-get-suffix 'ai-code-menu-2-columns "F"))
(eca-menu-f-suffix (transient-get-suffix 'ai-code-eca-menu "F")))
Expand Down
Loading