You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

201 lines
8.0 KiB

;;; test-error-list.el --- Flycheck Specs: Error List -*- lexical-binding: t; -*-
;; Copyright (C) 2013-2016 Sebastian Wiesner and Flycheck contributors
;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
;; This file is not part of GNU Emacs.
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Specs for the error list.
;;; Code:
(require 'flycheck-buttercup)
(defmacro flycheck/with-error-list-buffer (&rest body)
"Run BODY in a temporary error list buffer."
(declare (indent 0))
`(with-current-buffer (get-buffer-create flycheck-error-list-buffer)
(delay-mode-hooks (flycheck-error-list-mode))
(setq delayed-mode-hooks nil)
(prog1 (progn ,@body)
(kill-buffer flycheck-error-list-buffer))))
(describe "Error List"
(it "has the correct buffer name"
(expect flycheck-error-list-buffer :to-equal "*Flycheck errors*"))
(it "has a permanently local source buffer"
(flycheck/with-error-list-buffer
(expect (get 'flycheck-error-list-source-buffer 'permanent-local)
:to-be-truthy)))
(it "derives from Tabulated List Mode"
(flycheck/with-error-list-buffer
(expect (derived-mode-p 'tabulated-list-mode) :to-be-truthy)))
(describe "Format"
(it "sets the error list format locally"
(flycheck/with-error-list-buffer
(expect tabulated-list-format :not :to-equal nil)
(expect 'tabulated-list-format :to-be-local)))
(it "sets a proper padding locally"
(flycheck/with-error-list-buffer
(expect tabulated-list-padding :to-equal 1)
(expect 'tabulated-list-padding :to-be-local)))
(it "sets the list entries locally"
(flycheck/with-error-list-buffer
(expect tabulated-list-entries :to-equal 'flycheck-error-list-entries)
(expect 'tabulated-list-entries :to-be-local)))
(it "has a local header line"
(flycheck/with-error-list-buffer
(expect header-line-format
:to-equal " File Line Col Level ID Message (Checker) ")
(expect 'header-line-format :to-be-local))))
(describe "Columns"
(it "has the file name in the 1st column"
(flycheck/with-error-list-buffer
(expect (aref tabulated-list-format 0)
:to-equal
'("File" 6))))
(it "has the line number in the 2nd column"
(flycheck/with-error-list-buffer
(expect (aref tabulated-list-format 1)
:to-equal
'("Line" 5 flycheck-error-list-entry-< :right-align t))))
(it "has the column number in the 3rd column"
(flycheck/with-error-list-buffer
(expect (aref tabulated-list-format 2)
:to-equal '("Col" 3 nil :right-align t))))
(it "has the error level in the 4th column"
(flycheck/with-error-list-buffer
(expect (aref tabulated-list-format 3)
:to-equal '("Level" 8 flycheck-error-list-entry-level-<))))
(it "has the error ID in the 5th column"
(flycheck/with-error-list-buffer
(expect (aref tabulated-list-format 4)
:to-equal '("ID" 6 t))))
(it "has the error message in the 6th column"
(flycheck/with-error-list-buffer
(expect (aref tabulated-list-format 5)
:to-equal '("Message (Checker)" 0 t)))))
(describe "Entry"
(let* ((warning (flycheck-error-new-at 10 12 'warning "A foo warning"
:checker 'emacs-lisp-checkdoc
:id "W1"))
(entry (flycheck-error-list-make-entry warning))
(cells (cadr entry)))
(it "has the error object as ID"
(expect (car entry) :to-be warning))
(it "has the line number in the 2nd cell"
(expect (aref cells 1) :to-equal
(list "10"
'type 'flycheck-error-list
'face 'flycheck-error-list-line-number)))
(it "has the column number in the 3rd cell"
(expect (aref cells 2) :to-equal
(list "12"
'type 'flycheck-error-list
'face 'flycheck-error-list-column-number)))
(it "has an empty 3rd cell if there is no column number"
(cl-letf* (((flycheck-error-column warning) nil)
(entry (flycheck-error-list-make-entry warning))
(cells (cadr entry)))
(expect (aref cells 2) :to-equal
(list ""
'type 'flycheck-error-list
'face 'flycheck-error-list-column-number))))
(it "has the error level in the 4th cell"
(expect (aref cells 3) :to-equal
(list "warning"
'type 'flycheck-error-list
'face (flycheck-error-level-error-list-face 'warning))))
(it "has the error ID in the 5th cell"
(expect (aref cells 4) :to-equal
(list "W1"
'type 'flycheck-error-list-explain-error
'face 'flycheck-error-list-id
'help-echo "W1")))
(let ((checker-name (propertize "emacs-lisp-checkdoc"
'face 'flycheck-error-list-checker-name)))
(it "has the error message in the 6th cell"
(let* ((message (format (propertize "A foo warning (%s)"
'face 'default)
checker-name)))
(expect (aref cells 5) :to-equal
(list message 'type 'flycheck-error-list
'help-echo message))))
(it "has a default message in the 6th cell if there is no message"
(cl-letf* (((flycheck-error-message warning) nil)
(entry (flycheck-error-list-make-entry warning))
(cells (cadr entry))
(message (format (propertize "Unknown warning (%s)"
'face 'default)
checker-name)))
(expect (aref cells 5) :to-equal
(list message 'type 'flycheck-error-list
'help-echo message)))))))
(describe "Filter"
(it "kills the filter variable when resetting the filter"
(flycheck/with-error-list-buffer
(setq-local flycheck-error-list-minimum-level 'error)
(expect 'flycheck-error-list-minimum-level :to-be-local)
(flycheck-error-list-reset-filter)
(expect 'flycheck-error-list-minimum-level :not :to-be-local)))
(it "filters errors with lower levels"
(let ((flycheck-error-list-minimum-level 'warning)
(errors (list (flycheck-error-new-at 10 10 'error)
(flycheck-error-new-at 20 20 'warning)
(flycheck-error-new-at 30 30 'info))))
(expect (flycheck-error-list-apply-filter errors)
:to-be-equal-flycheck-errors
(list (flycheck-error-new-at 10 10 'error)
(flycheck-error-new-at 20 20 'warning)))))
(describe "Mode Line"
(it "shows no mode line indicator if no filter is set"
(let ((flycheck-error-list-minimum-level nil))
(expect (flycheck-error-list-mode-line-filter-indicator)
:to-be-empty-string)))
(it "shows the level filter in the mode line if set"
(let ((flycheck-error-list-minimum-level 'warning))
(expect (flycheck-error-list-mode-line-filter-indicator)
:to-equal " [>= warning]"))))))
;;; test-error-list.el ends here