;;; lang/emacs-lisp/autoload.el

;; ---- emacs-lisp ---------------------------------------------------

;;;###autoload
(defun +emacs-lisp/find-function (&optional arg)
  "Jump to the definition of the function at point. If ARG (the prefix) is
non-nil, the function will be revealed in another window. If ARG is 16 (C-u
C-u), then reveal the function in a popup window."
  (interactive "p")
  (when-let (func (function-called-at-point))
    (cond ((= arg 16)
           (let ((buf (find-function-noselect func t)))
             (doom-popup-buffer (car buf) :align t :size 30 :select t)
             (goto-char (cdr buf))))
          ((> arg 1)
           (find-function-other-window func))
          (t
           (find-function func)))))

;;;###autoload
(defun +emacs-lisp/repl ()
  "Open an ielm REPL for Emacs Lisp."
  (interactive)
  (ielm)
  (let ((buf (current-buffer)))
    (bury-buffer)
    (pop-to-buffer buf)))


;; ---- ert ---------------------------------------------------

(defsubst +ert--pre ()
  (save-buffer) (eval-buffer))

;;;###autoload
(defun +ert/run-test ()
  (interactive)
  (let (case-fold-search thing)
    (+ert--pre)
    (setq thing (thing-at-point 'defun t))
    (if thing
        (if (string-match "(ert-deftest \\([^ ]+\\)" thing)
            (ert-run-tests-interactively
             (substring thing (match-beginning 1) (match-end 1)))
          (user-error "Invalid test at point"))
      (user-error "No test found at point"))))

;;;###autoload
(defun +ert/rerun-test ()
  (interactive)
  (let (case-fold-search thing)
    (+ert--pre)
    (setq thing (car-safe ert--selector-history))
    (if thing
        (ert-run-tests-interactively thing)
      (message "No test found in history, looking for test at point")
      (+ert-run-test))))

;;;###autoload
(defun +ert/run-all-tests ()
  (interactive)
  (ert-delete-all-tests)
  (+ert--pre)
  (ert-run-tests-interactively t))