212 lines
7.6 KiB
EmacsLisp
212 lines
7.6 KiB
EmacsLisp
;; -*- no-byte-compile: t; -*-
|
|
;;; ui/popup/test/test-popup.el
|
|
|
|
(require! :ui popup)
|
|
|
|
(describe "ui/popup"
|
|
:var (display-buffer-alist
|
|
+popup-default-display-buffer-actions
|
|
+popup--display-buffer-alist
|
|
+popup-defaults
|
|
wconf)
|
|
|
|
(before-all
|
|
(delete-other-windows)
|
|
(switch-to-buffer "*scratch*")
|
|
(setq wconf (current-window-configuration))
|
|
(+popup-mode +1))
|
|
(after-all
|
|
(+popup-mode -1))
|
|
|
|
(before-each
|
|
(setq display-buffer-alist nil
|
|
+popup--display-buffer-alist nil
|
|
+popup-default-display-buffer-actions '(+popup-display-buffer-stacked-side-window-fn)
|
|
+popup-defaults '(:side bottom :select ignore :ttl nil :slot 1 :vslot 1)))
|
|
(after-each
|
|
(set-window-configuration wconf))
|
|
|
|
(describe "set-popup-rule!"
|
|
(it "sets popup rules"
|
|
(set-popup-rule! "does-not-exist" :size 10)
|
|
(let ((rule (cdr (assoc "does-not-exist" display-buffer-alist))))
|
|
(expect rule :to-contain '(+popup-buffer))
|
|
(expect rule :to-contain '(size . 10))))
|
|
(it "shadows old rules"
|
|
(set-popup-rule! "a" :size 10)
|
|
(set-popup-rule! "a" :size 20)
|
|
(expect (cdr (assoc "a" display-buffer-alist))
|
|
:to-contain '(size . 20)))
|
|
(it "resolves to defaults"
|
|
(let ((+popup-defaults '(:size 5)))
|
|
(set-popup-rule! "a")
|
|
(expect (cdr (assoc "a" display-buffer-alist))
|
|
:to-contain '(size . 5)))))
|
|
|
|
(describe "popup rules"
|
|
:var (origin a b c d e f g)
|
|
(before-all (setq origin (current-buffer)))
|
|
(before-each
|
|
(dolist (name '(a b c d e f g))
|
|
(set name (get-buffer-create (symbol-name name)))))
|
|
(after-each
|
|
(let (kill-buffer-query-functions kill-buffer-hook)
|
|
(dolist (x (list a b c d e f g))
|
|
(ignore-errors (delete-window (get-buffer-window x)))
|
|
(kill-buffer x))))
|
|
|
|
(describe "slot positioning"
|
|
(before-each
|
|
(set-popup-rules!
|
|
'(("a" :slot 1 :vslot 1)
|
|
("b" :slot 2 :vslot 1)
|
|
("c" :slot 1 :vslot 2)
|
|
("d" :slot 2 :vslot 2)
|
|
("e" :slot 1 :vslot 3)
|
|
("f" :slot 1 :vslot 3)
|
|
("g"))))
|
|
|
|
(it "replaces popups with the same slots"
|
|
(mapc #'display-buffer (list e f))
|
|
(expect (length (+popup-windows)) :to-be 1))
|
|
|
|
(it "replaces popups among multiple that have the same slots"
|
|
(let ((first (display-buffer a))
|
|
(second (display-buffer b))
|
|
(third (display-buffer e))
|
|
(fourth (display-buffer f)))
|
|
(expect (+popup-windows) :to-have-same-items-as
|
|
(list first second fourth))))
|
|
|
|
(describe ":slot"
|
|
(it "opens left of others if lower"
|
|
(let ((first (display-buffer b))
|
|
(second (display-buffer a)))
|
|
(expect (length (+popup-windows)) :to-be 2)
|
|
(expect (window-in-direction 'left first t)
|
|
:to-equal second)))
|
|
(it "opens right of others if higher"
|
|
(let ((first (display-buffer a))
|
|
(second (display-buffer b)))
|
|
(expect (length (+popup-windows)) :to-be 2)
|
|
(expect (window-in-direction 'right first t)
|
|
:to-equal second)))
|
|
(it "obeys default :slot"
|
|
(let ((window (display-buffer g)))
|
|
(expect (window-parameter window 'window-slot) :to-be 1)
|
|
(expect (window-parameter window 'window-vslot) :to-be 1))))
|
|
|
|
(describe ":vslot"
|
|
;; TODO Implement this, somehow
|
|
(xit "opens lower :vslot popups above others"
|
|
(let ((first (display-buffer c))
|
|
(second (display-buffer a)))
|
|
(expect (length (+popup-windows)) :to-be 2)
|
|
(expect (window-in-direction 'above first t)
|
|
:to-equal second)))
|
|
(it "opens higher :vslot popups below others"
|
|
(let ((first (display-buffer c))
|
|
(second (display-buffer e)))
|
|
(expect (length (+popup-windows)) :to-be 2)
|
|
(expect (window-in-direction 'below first t)
|
|
:to-equal second)))))
|
|
|
|
(describe ":select"
|
|
(it "selects the popup if non-nil"
|
|
(set-popup-rule! "^a$" :select t)
|
|
(display-buffer a)
|
|
(expect (current-buffer) :to-equal a))
|
|
(it "selects the originating window if nil"
|
|
(set-popup-rule! "^a$" :select nil)
|
|
(display-buffer a)
|
|
(expect (current-buffer) :to-equal origin))
|
|
(it "fall back to base selection if passed #'ignore"
|
|
(spy-on 'ignore)
|
|
(set-popup-rule! "^a$" :select #'ignore)
|
|
(save-window-excursion
|
|
(display-buffer a)
|
|
(expect (current-buffer) :to-equal origin))
|
|
(save-window-excursion
|
|
(pop-to-buffer a)
|
|
(expect (current-buffer) :to-equal a))
|
|
(expect 'ignore :to-have-been-called-times 2)))
|
|
|
|
(describe ":modeline"
|
|
(it "disables the mode-line if nil"
|
|
(set-popup-rule! "a" :modeline nil :select t)
|
|
(display-buffer a)
|
|
(expect mode-line-format :to-be nil))
|
|
(it "uses the default mode-line if t"
|
|
(set-popup-rule! "a" :modeline t :select t)
|
|
(display-buffer a)
|
|
(expect mode-line-format :to-equal (default-value 'mode-line-format)))
|
|
(it "uses a predefined mode-line if passed a symbol"
|
|
(set-popup-rule! "a" :modeline '("x") :select t)
|
|
(display-buffer a)
|
|
(expect mode-line-format :to-equal '("x")))
|
|
(it "runs the handler if passed a function"
|
|
(set-popup-rule! "a" :modeline (lambda () (setq mode-line-format '("x"))) :select t)
|
|
(display-buffer a)
|
|
(expect mode-line-format :to-equal '("x"))))
|
|
|
|
;; TODO
|
|
(xdescribe ":autosave")
|
|
|
|
(describe ":quit"
|
|
(it "will close from anywhere if :quit = t"
|
|
(set-popup-rule! "a" :quit t)
|
|
(save-window-excursion
|
|
(display-buffer a)
|
|
(call-interactively #'+popup/close-all)
|
|
(expect (get-buffer-window a) :to-be nil))
|
|
(save-window-excursion
|
|
(pop-to-buffer a)
|
|
(call-interactively #'+popup/close)
|
|
(expect (get-buffer-window a) :to-be nil)))
|
|
(it "will only close from outside if :quit = 'other"
|
|
(set-popup-rule! "a" :quit 'other)
|
|
(save-window-excursion
|
|
(display-buffer a)
|
|
(call-interactively #'+popup/close-all)
|
|
(expect (get-buffer-window a) :to-be nil))
|
|
(save-window-excursion
|
|
(pop-to-buffer a)
|
|
(call-interactively #'+popup/close)
|
|
(expect (get-buffer-window a))))
|
|
(it "will only close from inside if :quit = 'current"
|
|
(set-popup-rule! "a" :quit 'current)
|
|
(save-window-excursion
|
|
(display-buffer a)
|
|
(call-interactively #'+popup/close-all)
|
|
(expect (get-buffer-window a)))
|
|
(save-window-excursion
|
|
(pop-to-buffer a)
|
|
(call-interactively #'+popup/close)
|
|
(expect (get-buffer-window a) :to-be nil)))
|
|
(it "never close a if :quit = nil"
|
|
(set-popup-rule! "a" :quit nil)
|
|
(save-window-excursion
|
|
(display-buffer a)
|
|
(call-interactively #'+popup/close-all)
|
|
(expect (get-buffer-window a)))
|
|
(save-window-excursion
|
|
(pop-to-buffer a)
|
|
(call-interactively #'+popup/close)
|
|
(expect (get-buffer-window a)))))
|
|
|
|
;; TODO
|
|
(xdescribe ":ttl")
|
|
(xdescribe ":size")
|
|
(xdescribe ":width")
|
|
(xdescribe ":height")
|
|
(xdescribe ":side")
|
|
(xdescribe ":actions"))
|
|
|
|
;; TODO
|
|
(xdescribe "predicate functions"
|
|
(describe "buffer-p")
|
|
(describe "window-p"))
|
|
|
|
;; TODO
|
|
(xdescribe "save-popups!")
|
|
(xdescribe "with-popup-rules!"))
|