doomemacs/modules/ui/popup/test/test-popup.el

212 lines
7.6 KiB
EmacsLisp
Raw Normal View History

2018-06-23 22:17:56 +02:00
;; -*- no-byte-compile: t; -*-
;;; ui/popup/test/test-popup.el
(describe "ui/popup"
:var (display-buffer-alist
+popup-default-display-buffer-actions
+popup--display-buffer-alist
+popup-defaults
wconf)
(before-all
(require! :ui popup)
(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)
+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)
2018-06-23 22:17:56 +02:00
(display-buffer a)
(expect mode-line-format :to-equal '("x")))
2018-06-23 22:17:56 +02:00
(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!"))