blob: 633d6612546403b93bd91d4c5683aadb747e07c3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
;;; test-dashboard-config-launchers.el --- Tests for the dashboard launcher table -*- lexical-binding: t; -*-
;;; Commentary:
;; Locks the single-source launcher table that drives both the dashboard
;; navigator icon rows and the dashboard-mode-map keybindings. The bug this
;; guards against: the icon row and the keymap were maintained as two separate
;; inline lists that could drift in order or wiring. These tests assert the
;; table, the derived 3x4 navigator rows, and that every key binds to the
;; right command (including Music's two-call action).
;;; Code:
(require 'ert)
(require 'cl-lib)
(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
(add-to-list 'load-path (expand-file-name "tests" user-emacs-directory))
(setq load-prefer-newer t)
;; deps dashboard-config pulls transitively / actions reference
(unless (fboundp 'cj/kill-all-other-buffers-and-windows)
(defun cj/kill-all-other-buffers-and-windows () nil))
(unless (fboundp 'cj/make-buffer-undead) (defun cj/make-buffer-undead (_n) nil))
(defvar user-home-dir "/tmp/")
(require 'dashboard-config)
(defconst test-dash--keys '("c" "d" "t" "a" "r" "b" "f" "m" "e" "i" "s" "g"))
;; ----------------------------- launcher table --------------------------------
(ert-deftest test-dashboard-launchers-keys-in-order ()
"Normal: 12 launchers with the expected keys in display order."
(should (= 12 (length cj/dashboard--launchers)))
(should (equal test-dash--keys (mapcar (lambda (l) (nth 0 l)) cj/dashboard--launchers))))
(ert-deftest test-dashboard-launchers-labels-in-order ()
"Normal: labels in display order."
(should (equal '("Code" "Files" "Terminal" "Agenda" "Feeds" "Books"
"Flashcards" "Music" "Email" "IRC" "Slack" "Telegram")
(mapcar (lambda (l) (nth 3 l)) cj/dashboard--launchers))))
;; --------------------------- navigator rows ----------------------------------
(ert-deftest test-dashboard-navigator-rows-three-rows-of-four ()
"Normal: navigator derives 3 rows of 4, with the right labels and button shape."
(cl-letf (((symbol-function 'nerd-icons-faicon) (lambda (n &rest _) (concat "I:" n)))
((symbol-function 'nerd-icons-devicon) (lambda (n &rest _) (concat "I:" n)))
((symbol-function 'nerd-icons-mdicon) (lambda (n &rest _) (concat "I:" n))))
(let ((rows (cj/dashboard--navigator-rows)))
(should (= 3 (length rows)))
(should (cl-every (lambda (r) (= 4 (length r))) rows))
(should (equal '("Code" "Files" "Terminal" "Agenda")
(mapcar (lambda (b) (nth 1 b)) (nth 0 rows))))
(let ((btn (car (car rows)))) ; (icon label tooltip action nil " " "")
(should (string= "I:nf-fa-code" (nth 0 btn)))
(should (string= "Code" (nth 1 btn)))
(should (functionp (nth 3 btn)))
(should (null (nth 4 btn)))))))
;; ---------------------------- keymap binding ---------------------------------
(ert-deftest test-dashboard-bind-launchers-binds-every-key ()
"Normal: every launcher key binds to a command; q is left to the caller."
(let ((map (make-sparse-keymap)))
(cj/dashboard--bind-launchers map)
(dolist (key test-dash--keys)
(should (commandp (keymap-lookup map key))))
(should-not (keymap-lookup map "q"))))
(ert-deftest test-dashboard-bind-launchers-each-key-runs-its-command ()
"Behavior: invoking each key runs its launcher's command(s) — Music runs two."
(let ((map (make-sparse-keymap)) (calls nil))
(cl-letf (((symbol-function 'projectile-switch-project) (lambda (&rest _) (push 'code calls)))
((symbol-function 'dirvish) (lambda (&rest _) (push 'files calls)))
((symbol-function 'vterm) (lambda (&rest _) (push 'term calls)))
((symbol-function 'cj/main-agenda-display) (lambda (&rest _) (push 'agenda calls)))
((symbol-function 'cj/elfeed-open) (lambda (&rest _) (push 'feeds calls)))
((symbol-function 'calibredb) (lambda (&rest _) (push 'books calls)))
((symbol-function 'cj/drill-start) (lambda (&rest _) (push 'cards calls)))
((symbol-function 'cj/music-playlist-toggle) (lambda (&rest _) (push 'm-toggle calls)))
((symbol-function 'cj/music-playlist-load) (lambda (&rest _) (push 'm-load calls)))
((symbol-function 'mu4e) (lambda (&rest _) (push 'email calls)))
((symbol-function 'cj/erc-switch-to-buffer-with-completion) (lambda (&rest _) (push 'irc calls)))
((symbol-function 'cj/slack-start) (lambda (&rest _) (push 'slack calls)))
((symbol-function 'cj/telega) (lambda (&rest _) (push 'tg calls))))
(cj/dashboard--bind-launchers map)
(dolist (key test-dash--keys)
(call-interactively (keymap-lookup map key)))
(should (memq 'code calls))
(should (memq 'tg calls))
(should (memq 'm-toggle calls))
(should (memq 'm-load calls))
(should (= 13 (length calls)))))) ; 12 keys, Music fires two
(provide 'test-dashboard-config-launchers)
;;; test-dashboard-config-launchers.el ends here
|