158 lines
5.2 KiB
EmacsLisp
158 lines
5.2 KiB
EmacsLisp
|
;;; flycheck-buttercup.el --- Flycheck: Extensions to Buttercup -*- lexical-binding: t; -*-
|
|||
|
|
|||
|
;; Copyright (C) 2017 Flycheck contributors
|
|||
|
;; Copyright (C) 2016 Sebastian Wiesner and Flycheck contributors
|
|||
|
|
|||
|
;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
|
|||
|
;; Maintainer: Clément Pit-Claudel <clement.pitclaudel@live.com>
|
|||
|
;; fmdkdd <fmdkdd@gmail.com>
|
|||
|
;; Keywords: lisp, tools
|
|||
|
|
|||
|
;; 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:
|
|||
|
|
|||
|
;; Extensions to Buttercup to write BDD tests for Flycheck.
|
|||
|
;;
|
|||
|
;; Buttercup is a BDD testing framework for Emacs, see URL
|
|||
|
;; `https://github.com/jorgenschaefer/emacs-buttercup/'. Flycheck uses
|
|||
|
;; Buttercup extensively for new tests.
|
|||
|
;;
|
|||
|
;; This library provides extensions to Buttercup to write Specs for Flycheck.
|
|||
|
;;
|
|||
|
;; * Custom matchers
|
|||
|
;;
|
|||
|
;; (expect 'foo :to-be-local) - Is `foo' a local variable in the current buffer?
|
|||
|
|
|||
|
;;; Code:
|
|||
|
|
|||
|
(require 'buttercup)
|
|||
|
(require 'flycheck)
|
|||
|
(require 'seq)
|
|||
|
|
|||
|
|
|||
|
;;; Buttercup helpers
|
|||
|
|
|||
|
(defun flycheck-buttercup-format-error-list (errors)
|
|||
|
"Format ERRORS into a human-readable string."
|
|||
|
(mapconcat (lambda (e) (flycheck-error-format e 'with-file-name))
|
|||
|
errors "\n"))
|
|||
|
|
|||
|
|
|||
|
;;; Data matchers
|
|||
|
|
|||
|
(buttercup-define-matcher :to-be-empty-string (s)
|
|||
|
(let ((s (funcall s)))
|
|||
|
(if (equal s "")
|
|||
|
(cons t (format "Expected %S not be an empty string" s))
|
|||
|
(cons nil (format "Expected %S to be an empty string" s)))))
|
|||
|
|
|||
|
(buttercup-define-matcher :to-match-with-group (re s index match)
|
|||
|
(let* ((re (funcall re))
|
|||
|
(s (funcall s))
|
|||
|
(index (funcall index))
|
|||
|
(match (funcall match))
|
|||
|
(matches? (string-match re s))
|
|||
|
(result (and matches? (match-string index s))))
|
|||
|
(if (and matches? (equal result match))
|
|||
|
(cons t (format "Expected %S not to match %S with %S in group %s"
|
|||
|
re s match index))
|
|||
|
|
|||
|
(cons nil (format "Expected %S to match %S with %S in group %s, %s"
|
|||
|
re s match index
|
|||
|
(if matches?
|
|||
|
(format "but got %S" result)
|
|||
|
"but did not match"))))))
|
|||
|
|
|||
|
|
|||
|
;;; Emacs feature matchers
|
|||
|
|
|||
|
(buttercup-define-matcher :to-be-live (buffer)
|
|||
|
(let ((buffer (get-buffer (funcall buffer))))
|
|||
|
(if (buffer-live-p buffer)
|
|||
|
(cons t (format "Expected %S not to be a live buffer, but it is"
|
|||
|
buffer))
|
|||
|
(cons nil (format "Expected %S to be a live buffer, but it is not"
|
|||
|
buffer)))))
|
|||
|
|
|||
|
(buttercup-define-matcher :to-be-visible (buffer)
|
|||
|
(let ((buffer (get-buffer (funcall buffer))))
|
|||
|
(cond
|
|||
|
((and buffer (get-buffer-window buffer))
|
|||
|
(cons t (format "Expected %S not to be a visible buffer, but it is"
|
|||
|
buffer)))
|
|||
|
((not (bufferp buffer))
|
|||
|
(cons nil
|
|||
|
(format "Expected %S to be a visible buffer, but it is not a buffer"
|
|||
|
buffer)))
|
|||
|
(t (cons
|
|||
|
nil
|
|||
|
(format "Expected %S to be a visible buffer, but it is not visible"
|
|||
|
buffer))))))
|
|||
|
|
|||
|
(buttercup-define-matcher :to-be-local (symbol)
|
|||
|
(let ((symbol (funcall symbol)))
|
|||
|
(if (local-variable-p symbol)
|
|||
|
(cons t (format "Expected %S not to be a local variable, but it is"
|
|||
|
symbol))
|
|||
|
(cons nil (format "Expected %S to be a local variable, but it is not"
|
|||
|
symbol)))))
|
|||
|
|
|||
|
(buttercup-define-matcher :to-contain-match (buffer re)
|
|||
|
(let ((buffer (funcall buffer))
|
|||
|
(re (funcall re)))
|
|||
|
(if (not (get-buffer buffer))
|
|||
|
(cons nil (format "Expected %S to contain a match of %s, \
|
|||
|
but is not a buffer" buffer re))
|
|||
|
(with-current-buffer buffer
|
|||
|
(save-excursion
|
|||
|
(goto-char (point-min))
|
|||
|
(if (re-search-forward re nil 'noerror)
|
|||
|
(cons t (format "Expected %S to contain a match \
|
|||
|
for %s, but it did not" buffer re))
|
|||
|
(cons nil (format "Expected %S not to contain a match for \
|
|||
|
%s but it did not." buffer re))))))))
|
|||
|
|
|||
|
|
|||
|
;;; Flycheck matchers
|
|||
|
|
|||
|
(buttercup-define-matcher :to-be-equal-flycheck-errors (a b)
|
|||
|
(let* ((a (funcall a))
|
|||
|
(b (funcall b))
|
|||
|
(a-formatted (flycheck-buttercup-format-error-list a))
|
|||
|
(b-formatted (flycheck-buttercup-format-error-list b)))
|
|||
|
(if (equal a b)
|
|||
|
(cons t (format "Expected
|
|||
|
%s
|
|||
|
not to be equal to
|
|||
|
%s" a-formatted b-formatted))
|
|||
|
(cons nil (format "Expected
|
|||
|
%s
|
|||
|
to be equal to
|
|||
|
%s" a-formatted b-formatted)))))
|
|||
|
|
|||
|
(provide 'flycheck-buttercup)
|
|||
|
|
|||
|
;; Disable byte compilation for this library, to prevent package.el choking on a
|
|||
|
;; missing `buttercup' library. See
|
|||
|
;; https://github.com/flycheck/flycheck/issues/860
|
|||
|
|
|||
|
;; Local Variables:
|
|||
|
;; no-byte-compile: t
|
|||
|
;; End:
|
|||
|
|
|||
|
;;; flycheck-buttercup.el ends here
|