;;; flycheck-test.el --- Flycheck: Unit test suite -*- lexical-binding: t; -*- ;; Copyright (C) 2017-2020 Flycheck contributors ;; Copyright (C) 2013-2016 Sebastian Wiesner and Flycheck contributors ;; Author: Sebastian Wiesner ;; Maintainer: Clément Pit-Claudel ;; fmdkdd ;; URL: https://github.com/flycheck/flycheck ;; 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 . ;;; Commentary: ;; Unit test suite of Flycheck ;; Please keep test cases in the same order as the corresponding definition in ;; flycheck. ;;; Tags ;; For new tests, please add the section tag. Additionally, add any of the ;; following tags, if appropriate: ;; ;; - `external-tool' for tests which need external tools ;; - `language-LANG' for tests for the language LANG ;;; Code: ;;; Requirements (require 'dash) (require 'cl-lib) (require 'ert) ; Unit test library (require 'shut-up) ; Silence Emacs and intercept `message' (require 'flycheck) (require 'flycheck-ert) ;; Make a best effort to make Coq Mode available. ;; If we run Emacs with the `-Q` flag (which we do in the CI), this prevents ;; site-lisp directories to be added to `load-path'. In addition, in the Docker ;; images we use in the CI Emacs is installed under /opt/emacs and cannot pick ;; up site-lisp directories under /usr/share/emacs. This is why we add the ;; site-lisp directories manually for coq. (mapc (lambda (dir) (add-to-list 'load-path (expand-file-name "coq/" dir))) '("/usr/share/emacs/site-lisp/" "/usr/local/share/emacs/site-lisp/")) (autoload 'coq-mode "gallina") ;; Load ESS for R-mode (its autoloads are broken) (require 'ess-site nil 'noerror) ;;; Directories (defconst flycheck-test-directory (file-name-directory (flycheck-current-load-file)) "The test directory.") (defconst flycheck-test-resources-directory (expand-file-name "resources/" flycheck-test-directory) "Directory of test resources.") (defconst flycheck-test-source-directory (file-name-directory (directory-file-name flycheck-test-directory)) "The source directory.") ;;; Customization (ert-deftest flycheck-checkers/there-are-registered-checkers () :tags '(customization) (should flycheck-checkers)) (ert-deftest flycheck-checkers/all-registered-checkers-are-declared () :tags '(customization) (dolist (checker flycheck-checkers) (should (flycheck-valid-checker-p checker)) (should (flycheck-registered-checker-p checker)))) (ert-deftest flycheck-checkers/all-declared-checkers-are-registered () :tags '(customization) (let ((declared-checkers (flycheck-defined-checkers))) (should declared-checkers) (dolist (checker declared-checkers) (should (memq checker flycheck-checkers)) (should (flycheck-registered-checker-p checker))))) (ert-deftest flycheck-checkers/no-registered-checker-is-disabled () :tags '(customization) (dolist (checker flycheck-checkers) (should-not (flycheck-disabled-checker-p checker)))) (ert-deftest flycheck-disabled-checkers/is-empty () :tags '(customization) (should-not (default-value 'flycheck-disabled-checkers))) (ert-deftest flycheck-locate-config-file-functions/default () :tags '(customization) (should (equal flycheck-locate-config-file-functions '(flycheck-locate-config-file-by-path flycheck-locate-config-file-ancestor-directories flycheck-locate-config-file-home)))) (ert-deftest flycheck-process-error-functions/defaults-to-add-overlay () :tags '(customization) (should (equal flycheck-process-error-functions '(flycheck-add-overlay)))) (ert-deftest flycheck-display-errors-delay/defaults-to-0.9 () :tags '(customization) (should (equal flycheck-display-errors-delay 0.9))) (ert-deftest flycheck-display-errors-function/defaults-to-display-error-messages () :tags '(customization) (should (eq flycheck-display-errors-function #'flycheck-display-error-messages))) (ert-deftest flycheck-indication-mode/defaults-to-left-fringe () :tags '(customization) (should (eq flycheck-indication-mode 'left-fringe))) (ert-deftest flycheck-highlighting-mode/defaults-to-symbols () :tags '(customization) (should (eq flycheck-highlighting-mode 'symbols))) (ert-deftest flycheck-check-syntax-automatically/defaults-to-all-events () :tags '(customization) (should (equal flycheck-check-syntax-automatically '(save idle-change new-line mode-enabled)))) (ert-deftest flycheck-idle-change-delay/defaults-to-0.5 () :tags '(customization) (should (equal flycheck-idle-change-delay 0.5))) (ert-deftest flycheck-standard-error-navigation/default-to-t () :tags '(customization) (should (eq flycheck-standard-error-navigation t))) (ert-deftest flycheck-CHECKER-executable/is-special-variable () :tags '(customization) (dolist (checker flycheck-checkers) (let ((variable (flycheck-checker-executable-variable checker))) (should (custom-variable-p variable))))) (ert-deftest flycheck-CHECKER-executable/is-customizable () :tags '(customization) (dolist (checker flycheck-checkers) (let ((variable (flycheck-checker-executable-variable checker))) (should (custom-variable-p variable))))) (ert-deftest flycheck-CHECKER-executable/defaults-to-nil () :tags '(customization) (dolist (checker flycheck-checkers) (let ((variable (flycheck-checker-executable-variable checker))) (should (null (symbol-value variable)))))) (ert-deftest flycheck-keymap-prefix/customize-variable-will-modify-keymap () :tags '(customization) (unwind-protect (progn (custom-set-variables '(flycheck-keymap-prefix (kbd "C-c e"))) (should (eq 'flycheck-next-error (lookup-key flycheck-mode-map (kbd "C-c e n"))))) (ignore-errors (custom-set-variables '(flycheck-keymap-prefix (kbd "C-c !")))))) (ert-deftest flycheck-temp-prefix/default () :tags '(customization) (should (equal flycheck-temp-prefix "flycheck"))) ;;; Utility functions (ert-deftest flycheck-string-to-number-safe/nil () :tags '(utility) (should-not (flycheck-string-to-number-safe nil))) (ert-deftest flycheck-string-to-number-safe/not-a-string () :tags '(utility) (should-not (flycheck-string-to-number-safe [1 2 3]))) (ert-deftest flycheck-string-to-number-safe/already-a-number () :tags '(utility) (should-not (flycheck-string-to-number-safe 3))) (ert-deftest flycheck-string-to-number-safe/a-non-numeric-string () :tags '(utility) (should-not (flycheck-string-to-number-safe "123helloworld"))) (ert-deftest flycheck-string-to-number-safe/a-numeric-string () :tags '(utility) (should (= (flycheck-string-to-number-safe "123") 123))) (ert-deftest flycheck-string-to-number-safe/a-numeric-string-with-leading-whitespace () :tags '(utility) (should-not (flycheck-string-to-number-safe " 123"))) (ert-deftest flycheck-string-to-number-safe/a-numeric-string-with-trailing-whitespace () :tags '(utility) (should-not (flycheck-string-to-number-safe "123 "))) (ert-deftest flycheck-string-list-p/not-a-list () :tags '(utility) (should-not (flycheck-string-list-p ["foo" "bar"]))) (ert-deftest flycheck-string-list-p/a-plain-string () :tags '(utility) (should-not (flycheck-string-list-p "foo"))) (ert-deftest flycheck-string-list-p/a-plain-integer () :tags '(utility) (should-not (flycheck-string-list-p 1))) (ert-deftest flycheck-string-list-p/a-plain-symbol () :tags '(utility) (should-not (flycheck-string-list-p 'foo))) (ert-deftest flycheck-string-list-p/a-list-with-mixed-types () :tags '(utility) (should-not (flycheck-string-list-p '("foo" 1 test)))) (ert-deftest flycheck-string-list-p/a-list-of-symbols () :tags '(utility) (should-not (flycheck-string-list-p '(foo bar)))) (ert-deftest flycheck-string-list-p/a-list-of-strings () :tags '(utility) (should (flycheck-string-list-p '("foo" "bar")))) (ert-deftest flycheck-string-list-p/an-empty-list () :tags '(utility) (should (flycheck-string-list-p '()))) (ert-deftest flycheck-symbol-list-p/not-a-list () :tags '(utility) (should-not (flycheck-symbol-list-p ["foo" "bar"]))) (ert-deftest flycheck-symbol-list-p/a-plain-string () :tags '(utility) (should-not (flycheck-symbol-list-p "foo"))) (ert-deftest flycheck-symbol-list-p/a-plain-integer () :tags '(utility) (should-not (flycheck-symbol-list-p 1))) (ert-deftest flycheck-symbol-list-p/a-plain-symbol () :tags '(utility) (should-not (flycheck-symbol-list-p 'foo))) (ert-deftest flycheck-symbol-list-p/a-list-with-mixed-types () :tags '(utility) (should-not (flycheck-symbol-list-p '("foo" 1 test)))) (ert-deftest flycheck-symbol-list-p/a-list-of-strings () :tags '(utility) (should-not (flycheck-symbol-list-p '("foo" "bar")))) (ert-deftest flycheck-symbol-list-p/a-list-of-symbols () :tags '(utility) (should (flycheck-symbol-list-p '(foo bar)))) (ert-deftest flycheck-symbol-list-p/an-empty-list () :tags '(utility) (should (flycheck-symbol-list-p '()))) (ert-deftest flycheck-same-files-p/same-files () :tags '(utility) (let ((default-directory flycheck-test-source-directory)) (should (flycheck-same-files-p "flycheck.el" "flycheck.el")))) (ert-deftest flycheck-same-files-p/different-files () :tags '(utility) (let ((default-directory flycheck-test-source-directory)) (should-not (flycheck-same-files-p "flycheck.el" "Makefile")))) (ert-deftest flycheck-same-files-p/file-in-non-existing-directory () :tags '(utility) (let ((default-directory flycheck-test-source-directory)) (should-not (flycheck-same-files-p "flycheck.el" "foobar/flycheck.el")))) (ert-deftest flycheck-same-files-p/non-existing-files () :tags '(utility) (let ((default-directory flycheck-test-source-directory)) (should (flycheck-same-files-p "foobar/foobar" "foobar/foobar")))) (ert-deftest flycheck-same-files-p/across-symlinks () :tags '(utility) (skip-unless (fboundp #'make-symbolic-link)) (let ((directory (make-temp-file "flycheck-test-same-files-p-" 'directory))) (unwind-protect (let ((link (expand-file-name "foobar.el" directory)) (flycheck (expand-file-name "flycheck.el" flycheck-test-source-directory))) (make-symbolic-link flycheck link) (should (flycheck-same-files-p flycheck link))) (delete-directory directory 'recursive)))) (ert-deftest flycheck-temp-dir-system () :tags '(utility) (let ((dirname (flycheck-temp-dir-system))) (unwind-protect (should (file-directory-p dirname)) (flycheck-safe-delete-temporaries)) (should-not (file-exists-p dirname)) (should (string-prefix-p (file-name-as-directory (file-truename temporary-file-directory)) (file-truename dirname))) (should (string-prefix-p flycheck-temp-prefix (file-name-nondirectory (directory-file-name dirname)))))) (ert-deftest flycheck-temp-file-system/without-file-name () :tags '(utility) (let ((filename (flycheck-temp-file-system nil))) (unwind-protect (should (file-exists-p filename)) (flycheck-safe-delete-temporaries)) (should-not (file-exists-p filename)) (should (string-prefix-p (file-name-as-directory (file-truename temporary-file-directory)) (file-truename filename))) (should (string-prefix-p flycheck-temp-prefix (file-name-nondirectory filename))))) (ert-deftest flycheck-temp-file-system/with-complete-path () :tags '(utility) (let* ((filename (flycheck-temp-file-system "spam/with/eggs.el")) (dirname (directory-file-name (file-name-directory filename)))) (unwind-protect (progn ;; The file is not implicitly created, but the temporary directory is. (should-not (file-exists-p filename)) (should (file-directory-p dirname))) (flycheck-safe-delete-temporaries)) (should-not (file-exists-p filename)) (should-not (file-directory-p dirname)) ;; The file name should be preserved. The temporary file should reside in a ;; subdirectory of the temporary directory (should (string= "eggs.el" (file-name-nondirectory filename))) (should (string-prefix-p flycheck-temp-prefix (file-name-nondirectory (directory-file-name dirname)))) (should (string-prefix-p flycheck-temp-prefix (file-name-nondirectory (directory-file-name dirname)))))) (ert-deftest flycheck-temp-file-inplace/with-just-basename () :tags '(utility) (let* ((default-directory flycheck-test-directory) (filename (flycheck-temp-file-inplace "eggs.el"))) (unwind-protect ;; In place files should not be created early (should-not (file-exists-p filename)) (flycheck-safe-delete-temporaries)) (should (string= filename (expand-file-name (concat flycheck-temp-prefix "_eggs.el")))))) (ert-deftest flycheck-temp-file-inplace/with-complete-path () :tags '(utility) (let* ((default-directory flycheck-test-directory) (filename (flycheck-temp-file-inplace "spam/with/eggs.el"))) (unwind-protect (should-not (file-exists-p filename)) (flycheck-safe-delete-temporaries)) (should (string= filename (expand-file-name (concat "spam/with/" flycheck-temp-prefix "_eggs.el")))))) (ert-deftest flycheck-temp-file-inplace/without-file-name () :tags '(utility) (let ((filename (flycheck-temp-file-inplace nil))) (unwind-protect (should (file-exists-p filename)) (flycheck-safe-delete-temporaries)) (should-not (file-name-extension filename)) (should (string-prefix-p flycheck-temp-prefix (file-name-nondirectory filename))))) (ert-deftest flycheck-save-buffer-to-file () :tags '(utility) (let ((filename (expand-file-name "tests-temp"))) (unwind-protect (progn (flycheck-ert-with-temp-buffer (should-not (file-exists-p filename)) (insert "Hello world") (flycheck-save-buffer-to-file filename)) (should (file-exists-p filename)) (should (string= "Hello world" (with-temp-buffer (insert-file-contents filename) (buffer-string))))) (ignore-errors (delete-file filename))))) (ert-deftest flycheck-prepend-with-option/empty-list () :tags '(utility) (should-not (flycheck-prepend-with-option "-f" nil))) (ert-deftest flycheck-prepend-with-option/default-prepend-function () :tags '(utility) (should (equal (flycheck-prepend-with-option "-L" '("foo" "bar")) '("-L" "foo" "-L" "bar")))) (ert-deftest flycheck-prepend-with-option/prepend-by-string-concatentation () :tags '(utility) (should (equal (flycheck-prepend-with-option "-L" '("foo" "bar") #'concat) '("-Lfoo" "-Lbar")))) (ert-deftest flycheck-find-in-buffer/returns-first-match-on-success () :tags '(utility) (with-temp-buffer (insert "foo\nbar") (should (string= "bar" (flycheck-find-in-buffer (rx (group "bar"))))))) (ert-deftest flycheck-find-in-buffer/returns-nil-on-failure () :tags '(utility) (with-temp-buffer (insert "spam\nwith eggs") (should-not (flycheck-find-in-buffer (rx (group "bar")))))) (ert-deftest flycheck-find-in-buffer/saves-excursion () :tags '(utility) (with-temp-buffer (insert "spam\nwith eggs") (goto-char (point-min)) (forward-line) (should (flycheck-find-in-buffer (rx (group "spam")))) (should (= (point) 6)))) (ert-deftest flycheck-find-in-buffer/ () (with-temp-buffer (insert "spam\nwith eggs") (should-not (flycheck-find-in-buffer (rx (group "bar")))))) (ert-deftest flycheck-ephemeral-buffer-p/temporary-buffer () :tags '(utility) (flycheck-ert-with-temp-buffer (should (flycheck-ephemeral-buffer-p)))) (ert-deftest flycheck-ephemeral-buffer-p/buffer-with-leading-whitespace () :tags '(utility) (flycheck-ert-with-temp-buffer (rename-buffer " foo") (should (flycheck-ephemeral-buffer-p)))) (ert-deftest flycheck-ephemeral-buffer-p/buffer-without-leading-whitespace () :tags '(utility) (flycheck-ert-with-temp-buffer (rename-buffer "foo") (should-not (flycheck-ephemeral-buffer-p)))) (ert-deftest flycheck-autoloads-file-p/ephemeral-buffer () :tags '(utility) (flycheck-ert-with-temp-buffer (should-not (flycheck-autoloads-file-p)))) (ert-deftest flycheck-autoloads-file-p/autoloads-without-backing-file () :tags '(utility) (flycheck-ert-with-temp-buffer (rename-buffer "foo-autoloads.el") (should (flycheck-autoloads-file-p)))) (ert-deftest flycheck-autoloads-file-p/autoloads-with-backing-file () :tags '(utility) (flycheck-ert-with-file-buffer (locate-library "shut-up-autoloads") (should (flycheck-autoloads-file-p)))) (ert-deftest flycheck-autoloads-file-p/a-plain-file () :tags '(utility) (flycheck-ert-with-file-buffer (expand-file-name "Cask" flycheck-test-source-directory) (should-not (flycheck-autoloads-file-p)))) (ert-deftest flycheck-in-user-emacs-directory-p/no-child-of-user-emacs-directory () :tags '(utility) (let ((user-emacs-directory "/flycheck-nonexisting")) (should-not (flycheck-in-user-emacs-directory-p (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))))) (ert-deftest flycheck-in-user-emacs-directory-p/direct-child-of-user-emacs-directory () :tags '(utility) (let ((user-emacs-directory flycheck-test-directory)) (should (flycheck-in-user-emacs-directory-p (expand-file-name "flycheck-test.el" flycheck-test-directory))))) (ert-deftest flycheck-in-user-emacs-directory-p/indirect-child-of-user-emacs-directory () :tags '(utility) (let ((user-emacs-directory flycheck-test-directory)) (should (flycheck-in-user-emacs-directory-p (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))))) (ert-deftest flycheck-safe-delete/recursive-removal () :tags '(utility) (let ((dirname (flycheck-temp-dir-system))) (unwind-protect (let ((filename (expand-file-name "foo" dirname))) (process-lines "touch" filename) (should (string-prefix-p dirname filename)) (should (file-exists-p filename)) (flycheck-safe-delete dirname) (should-not (file-exists-p filename)) (should-not (file-directory-p dirname)) (should-not (file-exists-p dirname))) (ignore-errors (delete-directory dirname 'recurse))))) (ert-deftest flycheck-module-root-directory/no-module-name-and-no-file-name () :tags '(utility) (let ((default-directory flycheck-test-resources-directory)) (should (string= flycheck-test-resources-directory (flycheck-module-root-directory nil))))) (ert-deftest flycheck-module-root-directory/no-module-name () :tags '(utility) (let ((default-directory flycheck-test-resources-directory) (file-name (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))) (should (string= (flycheck-ert-resource-filename "language/emacs-lisp/") (flycheck-module-root-directory nil file-name))))) (ert-deftest flycheck-module-root-directory/module-name-as-string () :tags '(utility) (let ((default-directory flycheck-test-resources-directory) (file-name (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))) (should (string= flycheck-test-resources-directory (flycheck-module-root-directory "language.emacs-lisp.warnings" file-name))))) (ert-deftest flycheck-module-root-directory/module-name-as-list () :tags '(utility) (let ((default-directory flycheck-test-resources-directory) (file-name (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))) (should (string= flycheck-test-resources-directory (flycheck-module-root-directory '("language" "emacs-lisp" "warnings") file-name))))) (ert-deftest flycheck-module-root-directory/mismatching-module-name () :tags '(utility) (let ((default-directory flycheck-test-resources-directory) (file-name (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))) (should (string= (flycheck-ert-resource-filename "language/emacs-lisp/") (flycheck-module-root-directory '("foo" "warnings") file-name))))) ;;; Checker API (ert-deftest flycheck-valid-checker-p/not-a-symbol () :tags '(checker-api) (should-not (flycheck-valid-checker-p "foo"))) (ert-deftest flycheck-valid-checker-p/no-checker-version () :tags '(checker-api) (should-not (get 'foo 'flycheck-generic-checker-version)) (should-not (flycheck-valid-checker-p 'foo))) (ert-deftest flycheck-valid-checker-p/checker-version-too-low () :tags '(checker-api) (cl-letf* ((version (- flycheck-generic-checker-version 1)) ((get 'foo 'flycheck-generic-checker-version) version)) (should (= (get 'foo 'flycheck-generic-checker-version) version)) (should-not (flycheck-valid-checker-p 'foo))) (should-not (get 'foo 'flycheck-generic-checker-version))) (ert-deftest flycheck-valid-checker-p/checker-version-too-high () :tags '(checker-api) (cl-letf* ((version (+ flycheck-generic-checker-version 1)) ((get 'foo 'flycheck-generic-checker-version) version)) (should (= (get 'foo 'flycheck-generic-checker-version) version)) (should-not (flycheck-valid-checker-p 'foo))) (should-not (get 'foo 'flycheck-generic-checker-version))) (ert-deftest flycheck-valid-checker-p/checker-version-ok () :tags '(checker-api) (cl-letf* ((version flycheck-generic-checker-version) ((get 'foo 'flycheck-generic-checker-version) version)) (should (= (get 'foo 'flycheck-generic-checker-version) version)) (should (flycheck-valid-checker-p 'foo))) (should-not (get 'foo 'flycheck-generic-checker-version))) (ert-deftest flycheck-disabled-checker-p/enabled-checker () :tags '(checker-api) (let ((flycheck-checkers '(emacs-lisp))) (should-not (flycheck-disabled-checker-p 'emacs-lisp)))) (ert-deftest flycheck-disabled-checker-p/disabled-checker () :tags '(checker-api) (let ((flycheck-disabled-checkers '(emacs-lisp))) (should (flycheck-disabled-checker-p 'emacs-lisp)))) (defvar flycheck-test-config-var) (defvar flycheck-test-option-var) (ert-deftest flycheck-defined-checkers/are-valid () :tags '(checker-api) (dolist (checker (flycheck-defined-checkers)) (should (flycheck-valid-checker-p checker)))) (ert-deftest flycheck-defined-checkers/are-registered () :tags '(checker-api) (dolist (checker (flycheck-defined-checkers)) (should (flycheck-registered-checker-p checker)))) (ert-deftest flycheck-checker-executable/is-string () :tags '(checker-api) (dolist (checker flycheck-checkers) (should (stringp (flycheck-checker-executable checker))))) (ert-deftest flycheck-checker-executable/override-the-executable () :tags '(checker-api) (dolist (checker flycheck-checkers) (let ((variable (flycheck-checker-executable-variable checker))) (should (equal (eval `(let ((,variable "some-nice-executable")) (flycheck-checker-executable ',checker))) "some-nice-executable"))))) (ert-deftest flycheck-checker-get/modes () :tags '(checker-api) (dolist (checker flycheck-checkers) (should (listp (flycheck-checker-get checker 'modes))) (should (-all? #'symbolp (flycheck-checker-get checker 'modes))))) (ert-deftest flycheck-substitute-argument/source () :tags '(checker-api) (flycheck-ert-with-resource-buffer "substitute-dummy" (unwind-protect (progn (should (equal (flycheck-substitute-argument 'source-original 'emacs-lisp) (list (buffer-file-name)))) (let ((filename (flycheck-substitute-argument 'source-inplace 'emacs-lisp))) (should (equal filename (list (flycheck-ert-resource-filename (concat flycheck-temp-prefix "_substitute-dummy"))))) (should (file-exists-p (car filename)))) (let ((filename (flycheck-substitute-argument 'source 'emacs-lisp))) (should (string-prefix-p temporary-file-directory (car filename))) (should (file-exists-p (car filename)))))) (mapc #'flycheck-safe-delete flycheck-temporaries))) (ert-deftest flycheck-substitute-argument/temporary-directory () :tags '(checker-api) (unwind-protect (let ((dirname (car (flycheck-substitute-argument 'temporary-directory 'emacs-lisp)))) (should (file-directory-p dirname)) (should (string-prefix-p temporary-file-directory dirname))) (mapc #'flycheck-safe-delete flycheck-temporaries))) (ert-deftest flycheck-substitute-argument/temporary-filename () :tags '(checker-api) (unwind-protect (let ((filename (car (flycheck-substitute-argument 'temporary-file-name 'emacs-lisp)))) ;; The filename should not exist, but it's parent directory should (should-not (file-exists-p filename)) (should (file-directory-p (file-name-directory filename))) (should (string-prefix-p temporary-file-directory filename)) (should (member (directory-file-name (file-name-directory filename)) flycheck-temporaries))) (mapc #'flycheck-safe-delete flycheck-temporaries))) (ert-deftest flycheck-substitute-argument/null-device () :tags '(checker-api) (should (equal (flycheck-substitute-argument 'null-device 'emacs-lisp) (list null-device)))) (ert-deftest flycheck-substitute-argument/config-file () :tags '(checker-api) (let* ((flycheck-test-config-var "substitute-dummy") (config-file (flycheck-ert-resource-filename "substitute-dummy")) first-args second-args (locate-nil (lambda (&rest args) (setq first-args args) nil)) (locate-real (lambda (&rest args) (setq second-args args) config-file)) (flycheck-locate-config-file-functions (list locate-nil locate-real))) (should (equal (flycheck-substitute-argument '(config-file "--foo" flycheck-test-config-var) 'emacs-lisp) (list "--foo" config-file))) (should (equal first-args (list "substitute-dummy" 'emacs-lisp))) (should (equal second-args (list "substitute-dummy" 'emacs-lisp))) (setq first-args nil second-args nil) (should (equal (flycheck-substitute-argument '(config-file "--foo=" flycheck-test-config-var concat) 'emacs-lisp) (list (concat "--foo=" config-file)))))) (ert-deftest flycheck-substitute-argument/option () :tags '(checker-api) (let ((flycheck-test-option-var "bar")) (should (equal (flycheck-substitute-argument '(option "--foo" flycheck-test-option-var) 'emacs-lisp) '("--foo" "bar"))) (should (equal (flycheck-substitute-argument '(option "--foo=" flycheck-test-option-var concat) 'emacs-lisp) '("--foo=bar")))) (let ((flycheck-test-option-var 200)) (should-error (flycheck-substitute-argument '(option "--foo" flycheck-test-option-var) 'emacs-lisp)) (should (equal (flycheck-substitute-argument '(option "--foo" flycheck-test-option-var nil number-to-string) 'emacs-lisp) '("--foo" "200"))) (should (equal (flycheck-substitute-argument '(option "--foo=" flycheck-test-option-var concat number-to-string) 'emacs-lisp) '("--foo=200")))) (let (flycheck-test-option-var) (should-not (flycheck-substitute-argument '(option "--foo" flycheck-test-option-var) 'emacs-lisp)) ;; Catch an error, because `number-to-string' is called with nil (should-error (flycheck-substitute-argument '(option "--foo" flycheck-test-option-var nil number-to-string) 'emacs-lisp) :type 'wrong-type-argument) (should-error (flycheck-substitute-argument '(option "--foo=" flycheck-test-option-var concat number-to-string) 'emacs-lisp) :type 'wrong-type-argument))) (ert-deftest flycheck-substitute-argument/option-list () :tags '(checker-api) (let ((flycheck-test-option-var "spam")) (should-error (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var) 'emacs-lisp))) (let ((flycheck-test-option-var '("spam" "eggs"))) (should (equal (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var) 'emacs-lisp) '("-I" "spam" "-I" "eggs"))) (should (equal (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var concat) 'emacs-lisp) '("-Ispam" "-Ieggs")))) (let ((flycheck-test-option-var '(10 20))) (should-error (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var) 'emacs-lisp)) (should (equal (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var nil number-to-string) 'emacs-lisp) '("-I" "10" "-I" "20"))) (should (equal (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var concat number-to-string) 'emacs-lisp) '("-I10" "-I20")))) (let (flycheck-test-option-var) (should-not (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var) 'emacs-lisp))) (let ((flycheck-test-option-var '(nil))) ;; Catch an error, because `number-to-string' is called with nil (should-error (flycheck-substitute-argument '(option-list "-I" flycheck-test-option-var nil number-to-string) 'emacs-lisp) :type 'wrong-type-argument))) (ert-deftest flycheck-substitute-argument/option-flag () :tags '(checker-api) (let ((flycheck-test-option-var nil)) (should-not (flycheck-substitute-argument '(option-flag "--foo" flycheck-test-option-var) 'emacs-lisp))) (let ((flycheck-test-option-var t)) (should (equal (flycheck-substitute-argument '(option-flag "--foo" flycheck-test-option-var) 'emacs-lisp) (list "--foo")))) (let ((flycheck-test-option-var (list "bar"))) (should (equal (flycheck-substitute-argument '(option-flag "--foo" flycheck-test-option-var) 'emacs-lisp) (list "--foo"))))) (ert-deftest flycheck-substitute-argument/eval () :tags '(checker-api) (let ((flycheck-test-option-var '("Hello " "World"))) (should (equal (flycheck-substitute-argument '(eval flycheck-test-option-var) 'emacs-lisp) '("Hello " "World")))) (should (equal (flycheck-substitute-argument '(eval (concat "Hello" "World")) 'emacs-lisp) '("HelloWorld"))) (should-not (flycheck-substitute-argument '(eval (when (string= "foo" "bar") "yes")) 'emacs-lisp)) (should-error (flycheck-substitute-argument '(eval 200) 'emacs-lisp)) (should-error (flycheck-substitute-argument '(eval '("foo" 200)) 'emacs-lisp))) (ert-deftest flycheck-substitute-argument/unknown () :tags '(checker-api) (should-error (flycheck-substitute-argument '(foo "bar") 'emacs-lisp)) (should-error (flycheck-substitute-argument 200 'emacs-lisp))) (ert-deftest flycheck-may-use-checker/invalid-checker () :tags '(checker-api) (should-not (flycheck-valid-checker-p 'foo)) (should-not (flycheck-may-use-checker 'foo))) (ert-deftest flycheck-may-use-checker/disabled-checker () :tags '(checker-api) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-may-use-checker 'emacs-lisp) (let ((flycheck-disabled-checkers '(emacs-lisp))) (should-not (flycheck-may-use-checker 'emacs-lisp))))) (ert-deftest flycheck-may-use-checker/checks-executable () :tags '(checker-api) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (let* ((was-called nil) (flycheck-executable-find (lambda (_) (setq was-called t)))) (should (flycheck-may-use-checker 'emacs-lisp)) (should was-called)))) (ert-deftest flycheck-may-enable-checker/emacs-lisp () :tags '(checker-api) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (should (flycheck-may-enable-checker 'emacs-lisp)) (should-not (flycheck-may-enable-checker 'gibberish)) (should (equal '(emacs-lisp) flycheck--automatically-enabled-checkers)))) (ert-deftest flycheck-may-enable-checker/respects-cache () :tags '(checker-api) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (cl-letf* ((counter 0) (enabled t) ((flycheck-checker-get 'emacs-lisp 'enabled) (lambda (&rest _ignore) (cl-incf counter) enabled))) ;; :enabled isn't called when a positive cached result is available (let ((flycheck--automatically-enabled-checkers '(emacs-lisp))) (should (flycheck-may-enable-checker 'emacs-lisp)) (should (= counter 0))) ;; :enabled isn't called when a negative cached result is available (let ((flycheck--automatically-disabled-checkers '(emacs-lisp))) (should (not (flycheck-may-enable-checker 'emacs-lisp))) (should (= counter 0))) ;; Returning a cached result doesn't change caches (should (eq flycheck--automatically-disabled-checkers nil)) (should (eq flycheck--automatically-enabled-checkers nil)) ;; :enabled should only be called once with positive results (setq enabled t) (dotimes (_ 10) (flycheck-may-enable-checker 'emacs-lisp)) (should (equal flycheck--automatically-enabled-checkers '(emacs-lisp))) (setq flycheck--automatically-enabled-checkers nil) (should (= counter 1)) ;; :enabled should only be called once with negative results (setq enabled nil counter 0) (dotimes (_ 10) (flycheck-may-enable-checker 'emacs-lisp)) (should (equal flycheck--automatically-disabled-checkers '(emacs-lisp))) (should (= counter 1))))) ;;; Generic syntax checkers (ert-deftest flycheck-checker-get/gets-a-property () :tags '(generic-checkers) (should (equal (flycheck-checker-get 'emacs-lisp 'modes) '(emacs-lisp-mode lisp-interaction-mode)))) (ert-deftest flycheck-checker-get/setf () :tags '(generic-checkers) (let ((checker 'bar) (property 'foo)) (should-not (flycheck-checker-get checker property)) (setf (flycheck-checker-get checker property) "Hello world") (unwind-protect (should (equal (flycheck-checker-get checker property) "Hello world")) (put checker 'flycheck-foo nil)))) (ert-deftest flycheck-validate-next-checker/any-symbol () :tags '(definition) (should (flycheck-validate-next-checker 'foo)) (should-error (flycheck-validate-next-checker 'foo t))) (ert-deftest flycheck-validate-next-checker/syntax-checker-symbol () :tags '(definition) (should (flycheck-validate-next-checker 'emacs-lisp t))) (ert-deftest flycheck-validate-next-checker/string () :tags '(definition) (should-error (flycheck-validate-next-checker "foo"))) (ert-deftest flycheck-validate-next-checker/invalid-form () :tags '(definition) (should-error (flycheck-validate-next-checker '(warnings-only emacs-lisp)))) (ert-deftest flycheck-validate-next-checker/invalid-level () :tags '(definition) (should-error (flycheck-validate-next-checker '("foo" . emacs-lisp))) (should-error (flycheck-validate-next-checker '(foo . emacs-lisp) 'strict))) (ert-deftest flycheck-validate-next-checker/valid-predicate-with-any-symbol () :tags '(definition) (should (flycheck-validate-next-checker '(warning . bar))) (should-error (flycheck-validate-next-checker '(warning . bar) 'strict))) (ert-deftest flycheck-validate-next-checker/valid-predicate-with-syntax-checker-symbol () :tags '(definition) (should (flycheck-validate-next-checker '(warning . emacs-lisp) 'strict))) ;;; Checker extensions (ert-deftest flycheck-remove-next-checker/no-valid-checker () :tags '(extending) (let ((err-data (should-error (flycheck-remove-next-checker 'foo 'emacs-lisp)))) (should (string= (cadr err-data) "foo is not a valid syntax checker")))) (ert-deftest flycheck-remove-next-checker/plain () :tags '(extending) (let ((next-checkers (flycheck-checker-get 'emacs-lisp 'next-checkers))) (flycheck-remove-next-checker 'emacs-lisp 'emacs-lisp-checkdoc) (unwind-protect (should (equal (flycheck-checker-get 'emacs-lisp 'next-checkers) nil)) (put 'emacs-lisp 'flycheck-next-checkers next-checkers)))) (ert-deftest flycheck-remove-next-checker/level () :tags '(extending) (let ((next-checkers (flycheck-checker-get 'sh-zsh 'next-checkers))) (flycheck-remove-next-checker 'sh-zsh 'sh-shellcheck) (unwind-protect (should (equal (flycheck-checker-get 'sh-zsh 'next-checkers) nil)) (put 'sh-zsh 'flycheck-next-checkers next-checkers)))) (ert-deftest flycheck-add-next-checker/no-valid-checker () :tags '(extending) (let ((err-data (should-error (flycheck-add-next-checker 'foo 'emacs-lisp)))) (should (string= (cadr err-data) "foo is not a valid syntax checker")))) (ert-deftest flycheck-add-next-checker/no-valid-next-checker () :tags '(extending) (should-error (flycheck-add-next-checker 'emacs-lisp '(warnings-only bar))) (should-error (flycheck-add-next-checker 'emacs-lisp "foo")) (should-error (flycheck-add-next-checker 'emacs-lisp 'bar)) (should-error (flycheck-add-next-checker 'emacs-lisp '(warnings-only . bar))) (should-error (flycheck-add-next-checker 'emacs-lisp '(foo . emacs-lisp)))) (ert-deftest flycheck-add-next-checker/redundant () :tags '(extending) (let ((next-checkers (flycheck-checker-get 'emacs-lisp 'next-checkers))) (flycheck-add-next-checker 'emacs-lisp 'texinfo) (flycheck-add-next-checker 'emacs-lisp 'texinfo) (flycheck-add-next-checker 'emacs-lisp '(t . texinfo)) (flycheck-add-next-checker 'emacs-lisp '(warning . texinfo)) (unwind-protect (should (equal (flycheck-checker-get 'emacs-lisp 'next-checkers) (cons '(warning . texinfo) next-checkers))) (put 'emacs-lisp 'flycheck-next-checkers next-checkers)))) (ert-deftest flycheck-add-next-checker/prepend () :tags '(extending) (let ((next-checkers (flycheck-checker-get 'emacs-lisp 'next-checkers))) (flycheck-add-next-checker 'emacs-lisp 'texinfo) (unwind-protect (should (equal (flycheck-checker-get 'emacs-lisp 'next-checkers) (cons 'texinfo next-checkers))) (put 'emacs-lisp 'flycheck-next-checkers next-checkers)))) (ert-deftest flycheck-add-next-checker/append () :tags '(extending) (let ((next-checkers (flycheck-checker-get 'emacs-lisp 'next-checkers))) (flycheck-add-next-checker 'emacs-lisp 'texinfo 'append) (unwind-protect (should (equal (flycheck-checker-get 'emacs-lisp 'next-checkers) (append next-checkers '(texinfo)))) (put 'emacs-lisp 'flycheck-next-checkers next-checkers)))) (ert-deftest flycheck-add-mode/no-valid-checker () :tags '(extending) (let ((err-data (should-error (flycheck-add-mode 'foo 'emacs-lisp-mode)))) (should (string= (cadr err-data) "foo is not a valid syntax checker")))) (ert-deftest flycheck-add-mode/no-valid-mode () :tags '(extending) (let ((err-data (should-error (flycheck-add-mode 'python-pylint "foo")))) (should (string= (cadr err-data) "foo is not a symbol")))) (ert-deftest flycheck-add-mode () :tags '(extending) (let ((modes (flycheck-checker-get 'python-pylint 'modes))) (flycheck-add-mode 'python-pylint 'emacs-lisp-mode) (unwind-protect (progn (should (equal (flycheck-checker-get 'python-pylint 'modes) (cons 'emacs-lisp-mode modes)))) (put 'python-pylint 'flycheck-modes modes) (should (equal (flycheck-checker-get 'python-pylint 'modes) modes))))) ;;; Syntax checking mode (ert-deftest flycheck-mode/enables-standard-error-navigation () :tags '(minor-mode) (flycheck-ert-with-temp-buffer (setq next-error-function :old) (flycheck-mode 1) (should flycheck-mode) (should (eq next-error-function 'flycheck-next-error-function)) (flycheck-mode -1) (should-not flycheck-mode) (should (eq next-error-function :old)))) (ert-deftest flycheck-mode/does-not-enable-standard-error-navigation () :tags '(minor-mode) (flycheck-ert-with-temp-buffer (let ((flycheck-standard-error-navigation nil)) (setq next-error-function :old) (flycheck-mode +1) (should flycheck-mode) (should (eq next-error-function :old)) (should (eq flycheck-old-next-error-function :unset)) (setq next-error-function :new) (flycheck-mode -1) (should-not flycheck-mode) ;; Disabling the mode should not affect `next-error-function' now (should (eq next-error-function :new))))) (ert-deftest flycheck-mode/clears-errors-after-revert () :tags '(minor-mode language-emacs-lisp) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (goto-char (point-min)) (insert "foo-bar") (flycheck-mode) (flycheck-ert-buffer-sync) (should flycheck-current-errors) (let ((hack-local-variables-hook)) (revert-buffer 'ignore-auto 'no-confirm)) (should-not flycheck-current-errors) (should-not (flycheck-deferred-check-p)))) ;;; Syntax checker selection for the current buffer (ert-deftest flycheck-checker/unusable-checker-causes-an-error () :tags '(selection) (flycheck-ert-with-temp-buffer (emacs-lisp-mode) (flycheck-mode) (let* ((flycheck-checker 'sh-bash)) (flycheck-buffer) (should (eq flycheck-checker 'sh-bash)) (should (string= flycheck-last-status-change 'no-checker))))) (ert-deftest flycheck-checker/usable-checker-is-used () :tags '(selection language-emacs-lisp checker-emacs-lisp-checkdoc) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-mode) (should (eq (flycheck-get-checker-for-buffer) 'emacs-lisp)) (let ((flycheck-checker 'emacs-lisp-checkdoc)) (should (eq (flycheck-get-checker-for-buffer) 'emacs-lisp-checkdoc)) (flycheck-ert-buffer-sync) (flycheck-ert-should-errors '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc))))) (ert-deftest flycheck-checker/disabled-checker-is-not-used () :tags '(selection language-emacs-lisp) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-mode) (let ((flycheck-disabled-checkers '(emacs-lisp emacs-lisp-checkdoc))) (should-not (flycheck-get-checker-for-buffer)) (let* ((flycheck-checker 'emacs-lisp)) (flycheck-buffer) (should (eq flycheck-checker 'emacs-lisp)) (should (string= flycheck-last-status-change 'no-checker)))))) (ert-deftest flycheck-checker/unregistered-checker-is-used () :tags '(selection language-emacs-lisp checker-emacs-lisp-checkdoc) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-mode) (should (eq (flycheck-get-checker-for-buffer) 'emacs-lisp)) (let ((flycheck-checkers (remq 'emacs-lisp-checkdoc flycheck-checkers))) (should-not (flycheck-registered-checker-p 'emacs-lisp-checkdoc)) (let ((flycheck-checker 'emacs-lisp-checkdoc)) (should (eq (flycheck-get-checker-for-buffer) 'emacs-lisp-checkdoc)) (flycheck-ert-buffer-sync) (flycheck-ert-should-errors '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc)))))) (ert-deftest flycheck-select-checker/selecting-sets-the-syntax-checker () :tags '(selection checker-emacs-lisp-checkdoc) (flycheck-ert-with-temp-buffer (emacs-lisp-mode) (flycheck-select-checker 'emacs-lisp-checkdoc) (should (eq flycheck-checker 'emacs-lisp-checkdoc)))) (ert-deftest flycheck-select-checker/unselecting-unsets-the-syntax-checker () :tags '(selection checker-emacs-lisp-checkdoc) (flycheck-ert-with-temp-buffer (emacs-lisp-mode) (flycheck-select-checker 'emacs-lisp-checkdoc) (flycheck-select-checker nil) (should-not flycheck-checker))) (ert-deftest flycheck-select-checker/selecting-runs-a-syntax-check () :tags '(selection language-emacs-lisp checker-emacs-lisp checker-emacs-lisp-checkdoc) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-mode) ;; By default we should get both, because emacs-lisp chains to checkdoc (flycheck-ert-buffer-sync) (dolist (err flycheck-current-errors) (should (memq (flycheck-error-checker err) '(emacs-lisp emacs-lisp-checkdoc)))) ;; We select checkdoc, and should now only have checkdoc errors (flycheck-select-checker 'emacs-lisp-checkdoc) (flycheck-ert-wait-for-syntax-checker) (dolist (err flycheck-current-errors) (should (eq (flycheck-error-checker err) 'emacs-lisp-checkdoc))))) (ert-deftest flycheck-select-checker/unselecting-a-checker-goes-back-to-automatic-selection () :tags '(selection language-emacs-lisp checker-emacs-lisp checker-emacs-lisp-checkdoc) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-mode) (flycheck-select-checker 'emacs-lisp-checkdoc) (should (eq flycheck-checker 'emacs-lisp-checkdoc)) (flycheck-ert-wait-for-syntax-checker) (dolist (err flycheck-current-errors) (should (eq (flycheck-error-checker err) 'emacs-lisp-checkdoc))) (flycheck-select-checker nil) (should-not flycheck-checker) (flycheck-ert-wait-for-syntax-checker) (dolist (err flycheck-current-errors) (should (memq (flycheck-error-checker err) '(emacs-lisp emacs-lisp-checkdoc)))))) (ert-deftest flycheck/selects-checker-automatically/no-disabled-checker () :tags '(selection language-emacs-lisp checker-emacs-lisp-checkdoc) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (let ((flycheck-disabled-checkers '(emacs-lisp))) (flycheck-ert-buffer-sync) (should-not flycheck-checker) (flycheck-ert-should-errors '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc))))) (ert-deftest flycheck-disable-checker/disables-checker () :tags '(selection) (flycheck-ert-with-temp-buffer (flycheck-mode) (with-no-warnings (flycheck-disable-checker 'emacs-lisp)) (should (equal '(emacs-lisp) flycheck-disabled-checkers)) (should-not (default-value 'flycheck-disabled-checkers)) ;; Disabling a disabled checker should be a no-op (with-no-warnings (flycheck-disable-checker 'emacs-lisp)) (should (equal '(emacs-lisp) flycheck-disabled-checkers)))) (ert-deftest flycheck-disable-checker/enables-checker () :tags '(selection) (flycheck-ert-with-temp-buffer (flycheck-mode) (setq flycheck-disabled-checkers '(emacs-lisp python-pylint)) (with-no-warnings (flycheck-disable-checker 'emacs-lisp 'enable)) (should (equal '(python-pylint) flycheck-disabled-checkers)))) ;;; Automatic syntax checking in a buffer (ert-deftest flycheck-may-check-automatically/not-in-ephemeral-buffers () :tags '(automatic) (flycheck-ert-with-temp-buffer (should-not (-any? #'flycheck-may-check-automatically '(save idle-change new-line mode-enabled))) (should-not (flycheck-may-check-automatically)))) (ert-deftest flycheck-may-check-automatically/in-normal-buffers () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (should (-all? #'flycheck-may-check-automatically '(save idle-change new-line mode-enabled))) (should (flycheck-may-check-automatically)))) (ert-deftest flycheck-may-check-automatically/automatic-checking-disabled () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (let ((flycheck-check-syntax-automatically nil)) (should-not (-any? #'flycheck-may-check-automatically '(save idle-change new-line mode-enabled))) (should (flycheck-may-check-automatically))))) (ert-deftest flycheck-may-check-automatically/specific-event-disabled () :tags '(automatic) (dolist (event '(save idle-change new-line mode-enabled)) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" ;; Disable just a specific event (let ((flycheck-check-syntax-automatically (remq event flycheck-check-syntax-automatically))) (should flycheck-check-syntax-automatically) (should-not (flycheck-may-check-automatically event)) (should (-all? #'flycheck-may-check-automatically flycheck-check-syntax-automatically)) (should (flycheck-may-check-automatically)))))) (ert-deftest flycheck-check-syntax-automatically/mode-enabled-is-disabled () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (emacs-lisp-mode) (should-not (flycheck-deferred-check-p)) (let ((flycheck-check-syntax-automatically (remq 'mode-enabled flycheck-check-syntax-automatically))) (flycheck-mode) (should-not (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/mode-enabled-checks-syntax-after-flycheck-mode () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (emacs-lisp-mode) (should-not (flycheck-deferred-check-p)) (let ((flycheck-check-syntax-automatically '(mode-enabled))) (flycheck-mode) (should (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/idle-change-is-disabled () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (emacs-lisp-mode) (let ((flycheck-check-syntax-automatically nil)) (flycheck-mode)) (let ((flycheck-check-syntax-automatically (remq 'idle-change flycheck-check-syntax-automatically))) (insert "Hello world") (sleep-for 0.55) (should-not (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/idle-change-checks-syntax-after-change () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (emacs-lisp-mode) (let ((flycheck-check-syntax-automatically '(idle-change))) (flycheck-mode) (insert "Hello world") (should-not (flycheck-deferred-check-p)) (sleep-for 0.55) (should (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/idle-change-does-not-check-before-delay () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (emacs-lisp-mode) (let ((flycheck-check-syntax-automatically '(idle-change)) (flycheck-idle-change-delay 1.5)) (flycheck-mode) (insert "Hello world") (sleep-for 0.55) (should-not (flycheck-deferred-check-p)) (sleep-for 1.1) (should (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/idle-change-checks-changed-buffer () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-change)) (flycheck-idle-change-delay 0.1)) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (let ((changed-buffer (current-buffer))) (emacs-lisp-mode) (flycheck-mode) (insert "Hello world") (switch-to-buffer "other-dummy2.el") (emacs-lisp-mode) (flycheck-mode) (sleep-for 0.2) (should-not (flycheck-deferred-check-p)) (set-buffer changed-buffer) (should (flycheck-deferred-check-p)))))) (ert-deftest flycheck-check-syntax-automatically/does-not-check-after-buffer-switch-by-default () :tags '(automatic) (let ((flycheck-check-syntax-automatically '()) (flycheck-idle-buffer-switch-delay 0) (checks 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (add-hook 'flycheck-before-syntax-check-hook (lambda () (cl-incf checks)) nil 'local) (switch-to-buffer "*scratch*") (switch-to-buffer "automatic-check-dummy.el") (sleep-for 0.1) (should (= checks 0)) (kill-buffer "automatic-check-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/idle-buffer-switch-checks-after-buffer-switch () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-buffer-switch)) (flycheck-idle-buffer-switch-delay 0) (checks 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (add-hook 'flycheck-before-syntax-check-hook (lambda () (cl-incf checks)) nil 'local) (switch-to-buffer "*scratch*") (switch-to-buffer "automatic-check-dummy.el") (sleep-for 0.1) (should (= checks 1)) (kill-buffer "automatic-check-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/idle-change-cancels-idle-buffer-switch () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-change idle-buffer-switch)) (flycheck-idle-change-delay 0.02) (flycheck-idle-buffer-switch-delay 0.01) (checks 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (add-hook 'flycheck-before-syntax-check-hook (lambda () (cl-incf checks)) nil 'local) (switch-to-buffer "*scratch*") (switch-to-buffer "automatic-check-dummy.el") (insert "Hello") (sleep-for 0.015) (should (= checks 0)) (sleep-for 0.01) (should (= checks 1)) (kill-buffer "automatic-check-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/idle-buffer-switch-cancels-idle-change () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-change idle-buffer-switch)) (flycheck-idle-change-delay 0.01) (flycheck-idle-buffer-switch-delay 0.05) (checks 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (add-hook 'flycheck-before-syntax-check-hook (lambda () (cl-incf checks)) nil 'local) (insert "Hello") (switch-to-buffer "*scratch*") (switch-to-buffer "automatic-check-dummy.el") (sleep-for 0.02) (should (= checks 0)) (sleep-for 0.06) (should (= checks 1)) (kill-buffer "automatic-check-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/idle-buffer-switch-does-not-check-intermediate-buffers-by-default () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-buffer-switch)) (flycheck-idle-buffer-switch-delay 0.01) (checks 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (find-file (flycheck-ert-resource-filename "global-mode-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (add-hook 'flycheck-before-syntax-check-hook (lambda () (cl-incf checks)) nil 'local) (switch-to-buffer "*scratch*") (switch-to-buffer "automatic-check-dummy.el") (switch-to-buffer "global-mode-dummy.el") (sleep-for 0.015) (should (= checks 1)) ;; Since the buffer is not visible, the check would be automatically deferred (set-buffer "automatic-check-dummy.el") (should-not (flycheck-deferred-check-p)) (kill-buffer "automatic-check-dummy.el") (kill-buffer "global-mode-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/idle-buffer-switch-checks-intermediate-buffers-with-option () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-buffer-switch)) (flycheck-idle-buffer-switch-delay 0.01) (flycheck-buffer-switch-check-intermediate-buffers t) (checks 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (find-file (flycheck-ert-resource-filename "global-mode-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (add-hook 'flycheck-before-syntax-check-hook (lambda () (cl-incf checks)) nil 'local) (switch-to-buffer "*scratch*") (switch-to-buffer "automatic-check-dummy.el") (switch-to-buffer "global-mode-dummy.el") (sleep-for 0.015) (should (= checks 1)) ;; Since the buffer is not visible, the check will be automatically deferred (set-buffer "automatic-check-dummy.el") (should (flycheck-deferred-check-p)) (kill-buffer "automatic-check-dummy.el") (kill-buffer "global-mode-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/buffer-switch-check-intermediate-buffers-does-not-cancel-idle-change () :tags '(automatic) (let ((flycheck-check-syntax-automatically '(idle-change idle-buffer-switch)) (flycheck-buffer-switch-check-intermediate-buffers t) (flycheck-idle-change-delay 0.01) (flycheck-idle-buffer-switch-delay 0)) (find-file (flycheck-ert-resource-filename "automatic-check-dummy.el")) (emacs-lisp-mode) (flycheck-mode) (insert "Hello") (switch-to-buffer "*scratch*") (sleep-for 0.015) ;; Since the buffer is not visible, the check will be automatically deferred (set-buffer "automatic-check-dummy.el") (should (flycheck-deferred-check-p)) (kill-buffer "automatic-check-dummy.el"))) (ert-deftest flycheck-check-syntax-automatically/new-line-is-disabled () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (let ((flycheck-check-syntax-automatically nil)) (flycheck-mode)) (let ((flycheck-check-syntax-automatically (remq 'new-line flycheck-check-syntax-automatically))) (insert "\n") (should-not (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/new-line-checks-syntax-after-new-line () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (let ((flycheck-check-syntax-automatically '(new-line))) (flycheck-mode) (insert "\n") (should (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/save-disabled () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (let ((flycheck-check-syntax-automatically nil)) (flycheck-mode)) (set-buffer-modified-p t) (let ((flycheck-check-syntax-automatically (remq 'save flycheck-check-syntax-automatically))) (save-buffer 0) (should-not (flycheck-deferred-check-p))))) (ert-deftest flycheck-check-syntax-automatically/save-checks-syntax-after-save () :tags '(automatic) (flycheck-ert-with-resource-buffer "automatic-check-dummy.el" (let ((flycheck-check-syntax-automatically '(save))) (flycheck-mode) (set-buffer-modified-p t) (save-buffer 0) (should (flycheck-deferred-check-p))))) (ert-deftest flycheck-buffer-automatically/does-not-check-with-disabled-mode () :tags '(automatic) (flycheck-ert-with-temp-buffer (rename-buffer "foo") (should-not flycheck-mode) (should-not (flycheck-deferred-check-p)) (flycheck-buffer-automatically) (should-not (flycheck-deferred-check-p)))) (ert-deftest flycheck-buffer-automatically/defers-the-test () :tags '(automatic) (flycheck-ert-with-temp-buffer (flycheck-mode) ;; Flycheck won't check ephemeral buffers (rename-buffer "foo") (should-not (flycheck-deferred-check-p)) (flycheck-buffer-automatically) (should (flycheck-deferred-check-p)))) ;;; Deferred syntax checking (ert-deftest flycheck-deferred-check-p/nil () :tags '(deferred) (let ((flycheck-deferred-syntax-check nil)) (should-not (flycheck-deferred-check-p)))) (ert-deftest flycheck-deferred-check-p/truthy () :tags '(deferred) (let ((flycheck-deferred-syntax-check t)) (should (flycheck-deferred-check-p)))) (ert-deftest flycheck-buffer-deferred/schedules-a-deferred-syntax-check () :tags '(deferred) (flycheck-ert-with-temp-buffer (should-not (flycheck-deferred-check-p)) (flycheck-buffer-deferred) (should (flycheck-deferred-check-p)))) (ert-deftest flycheck-clean-deferred-check/removes-a-deferred-syntax-check () :tags '(deferred) (flycheck-ert-with-temp-buffer (flycheck-buffer-deferred) (flycheck-clean-deferred-check) (should-not (flycheck-deferred-check-p)))) ;;; Errors from syntax checks (ert-deftest flycheck-error-line-region () :tags '(error-api) (flycheck-ert-with-temp-buffer (insert "Hello\n World\n") (should (equal (flycheck--line-region (flycheck-line-column-to-position 1 1)) '(1 . 6))) (should (equal (flycheck--line-region (flycheck-line-column-to-position 2 4)) '(11 . 16))) ;; An error column beyond the end of the line is simply ignored just like ;; all other error columns (should (equal (flycheck--line-region (flycheck-line-column-to-position 2 10)) '(11 . 16))) ;; An error line beyond the end of file should highlight the last line (should (equal (flycheck--line-region (flycheck-line-column-to-position 4 3)) '(16 . 17))))) (ert-deftest flycheck-error-column-region () :tags '(error-api) (flycheck-ert-with-temp-buffer (insert "Hello\n World\n") (should (equal (flycheck--column-region (flycheck-line-column-to-position 1 4)) '(4 . 5))) (should (equal (flycheck--column-region (flycheck-line-column-to-position 2 6)) '(12 . 13))) ;; A column beyond the end of a line (should (equal (flycheck--column-region (flycheck-line-column-to-position 1 7)) '(6 . 7))) ;; A column right at the end of the last empty line of a file (an important ;; special case, because the Emacs Lisp checker reports undefined functions ;; at this place!) (should (equal (flycheck--column-region (flycheck-line-column-to-position 3 1)) '(16 . 17))) ;; A column beyond the end of file (should (equal (flycheck--column-region (flycheck-line-column-to-position 4 2)) '(16 . 17))))) (ert-deftest flycheck-bounds-of-things-at-point () :tags '(error-api) (flycheck-ert-with-temp-buffer (insert " (message)\n (message") (emacs-lisp-mode) (should-not (flycheck-bounds-of-thing-at-point 'sexp (flycheck-line-column-to-position 1 2))) (should (equal (flycheck-bounds-of-thing-at-point 'sexp (flycheck-line-column-to-position 1 5)) '(5 . 14))) (should-not (flycheck-bounds-of-thing-at-point 'symbol (flycheck-line-column-to-position 1 5))) (should (equal (flycheck-bounds-of-thing-at-point 'sexp (flycheck-line-column-to-position 1 8)) '(6 . 13))) (should (equal (flycheck-bounds-of-thing-at-point 'symbol (flycheck-line-column-to-position 1 8)) '(6 . 13))) ;; An incomplete expression (should-not (flycheck-bounds-of-thing-at-point 'sexp (flycheck-line-column-to-position 2 5))))) (ert-deftest flycheck-error-region-for-mode () :tags '(error-api) (flycheck-ert-with-temp-buffer (insert " (message) ;; Hello world\n (message") (emacs-lisp-mode) ;; Test an expression at the error column for all modes (let ((err (flycheck-error-new-at 1 7))) (should (equal (flycheck-error-region-for-mode err 'lines) '(5 . 29))) (should (equal (flycheck-error-region-for-mode err 'columns) '(7 . 8))) (should (equal (flycheck-error-region-for-mode err 'symbols) '(6 . 13))) (should (equal (flycheck-error-region-for-mode err 'sexps) '(6 . 13)))) ;; Test an error column which does not point to an expression (let ((err (flycheck-error-new-at 2 5))) (should (equal (flycheck-error-region-for-mode err 'lines) '(34 . 42))) (dolist (mode '(columns symbols sexps)) (should (equal (flycheck-error-region-for-mode err mode) '(34 . 35))))) ;; Test an error without column for all modes (let ((err (flycheck-error-new-at 1 nil))) (dolist (mode '(lines columns symbols sexps)) (should (equal (flycheck-error-region-for-mode err mode) '(5 . 29))))) ;; With end-line and end-col set, MODE shouldn't make a difference (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at 1 18 nil nil :end-line 1 :end-column 29) nil) '(18 . 29))) (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at 1 14 nil nil :end-line 1 :end-column 18) nil) '(14 . 18))) (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at ;; 1 5 nil nil :end-line 2 :end-column 13) nil) '(5 . 42))) (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at ;; Missing end column 1 nil nil nil :end-line 2) 'lines) '(5 . 29))) (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at ;; Implicit end line 2 5 nil nil :end-column 13) nil) '(34 . 42))) (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at ;; Out of bounds start 10 1 nil nil :end-line 10 :end-column 3) nil) '(41 . 42))) (should (equal (flycheck-error-region-for-mode (flycheck-error-new-at ;; Out of bounds end 1 1 nil nil :end-line 10 :end-column 1) nil) '(1 . 42))))) (ert-deftest flycheck-error-pos () :tags '(error-api) (flycheck-ert-with-temp-buffer (insert " Hello\n World\n") (should (= (flycheck-error-pos (flycheck-error-new-at 1 1)) 1)) (should (= (flycheck-error-pos (flycheck-error-new-at 1 4)) 4)) (should (= (flycheck-error-pos (flycheck-error-new-at 1 nil)) 5)) (should (= (flycheck-error-pos (flycheck-error-new-at 2 nil)) 14)) (should (= (flycheck-error-pos (flycheck-error-new-at 3 1)) 19)) (should (= (flycheck-error-pos (flycheck-error-new-at 4 1)) 19)) (should (= (flycheck-error-pos (flycheck-error-new-at 4 nil)) 19)))) (ert-deftest flycheck-error-format-message-and-id/no-id () :tags '(error-api) (should (string= (flycheck-error-format-message-and-id (flycheck-error-new-at 3 5 'warning "Hello world")) "Hello world"))) (ert-deftest flycheck-error-format-message-and-id/with-id () :tags '(error-api) (should (string= (flycheck-error-format-message-and-id (flycheck-error-new-at 3 5 'warning "Hello world" :id "Foo")) "Hello world [Foo]"))) (ert-deftest flycheck-error-format/level-warning () :tags '(error-api) (should (string= (flycheck-error-format (flycheck-error-new-at 3 5 'warning "Hello world" :checker 'emacs-lisp)) "3:5:warning: Hello world (emacs-lisp)"))) (ert-deftest flycheck-error-format/level-error () :tags '(error-api) (should (string= (flycheck-error-format (flycheck-error-new-at 20 7 'error "Spam with eggs" :checker 'ruby)) "20:7:error: Spam with eggs (ruby)"))) (ert-deftest flycheck-error-format-position () :tags '(error-api) (cl-flet ((fmt (l c el ec) (flycheck-error-format-position (flycheck-error-new-at l c 'error "err" :end-line el :end-column ec :checker 'emacs-lisp)))) (should (string= (fmt 14 nil nil nil) "14")) (should (string= (fmt 14 nil nil 1) "14")) (should (string= (fmt 14 nil 14 nil) "14")) (should (string= (fmt 14 nil 15 nil) "14-15")) (should (string= (fmt 14 nil 15 1) "14-15")) (should (string= (fmt 14 1 nil nil) "14:1")) (should (string= (fmt 14 1 nil 2) "14:1")) (should (string= (fmt 14 1 nil 1) "14:1-1")) (should (string= (fmt 14 1 14 nil) "14:1")) (should (string= (fmt 14 1 14 2) "14:1")) (should (string= (fmt 14 1 14 1) "14:1-1")) (should (string= (fmt 14 1 14 5) "14:1-5")) (should (string= (fmt 14 1 15 5) "(14:1)-(15:5)")))) (ert-deftest flycheck-error-format/handles-line-breaks () :tags '(error-api) ;; Specific test for https://github.com/magnars/s.el/issues/34 (should (string= (flycheck-error-format (flycheck-error-new-at 14 15 'error "dash\\nbroken" :checker 'foo)) "14:15:error: dash\\nbroken (foo)"))) (ert-deftest flycheck-error-format/with-id () :tags '(error-api) (should (string= (flycheck-error-format (flycheck-error-new-at 14 15 'error "A message" :id "E001" :checker 'foo)) "14:15:error: A message [E001] (foo)"))) (ert-deftest flycheck-error->" :fringe-bitmap 'left-triangle :fringe-face 'highlight :error-list-face 'font-lock-constant-face) (ert-deftest flycheck-define-error-level/is-error-level? () :tags '(error-level) (should (flycheck-error-level-p 'test-level))) (ert-deftest flycheck-define-error-level/has-severity () :tags '(error-level) (should (= (flycheck-error-level-severity 'test-level) 1337))) (ert-deftest flycheck-define-error-level/has-fringe-bitmap () :tags '(error-level) (should (eq (flycheck-error-level-fringe-bitmap 'test-level) 'left-triangle))) (ert-deftest flycheck-define-error-level/has-fringe-face () :tags '(error-level) (should (eq (flycheck-error-level-fringe-face 'test-level) 'highlight))) (ert-deftest flycheck-define-error-level/has-overlay-category () :tags '(error-level) (should (eq (flycheck-error-level-overlay-category 'test-level) 'category))) (ert-deftest flycheck-define-error-level/has-error-list-face () :tags '(error-level) (should (eq (flycheck-error-level-error-list-face 'test-level) 'font-lock-constant-face))) (ert-deftest flycheck-error-level-make-indicator/has-margin-spec () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'left-margin)) (`(_ ,spec) (get-text-property 0 'display icon))) (should (equal spec ">>")))) (ert-deftest flycheck-error-level-make-indicator/has-fringe-bitmap () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'left-fringe)) (`(_ ,bitmap _) (get-text-property 0 'display icon))) (should (eq bitmap 'left-triangle)))) (ert-deftest flycheck-error-level-make-indicator/has-fringe-face () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'left-fringe)) (`(_ _ ,face) (get-text-property 0 'display icon))) (should (eq face 'highlight)))) (ert-deftest flycheck-error-level-make-indicator/left-fringe () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'left-fringe)) (`(,side _ _) (get-text-property 0 'display icon))) (should (eq side 'left-fringe)))) (ert-deftest flycheck-error-level-make-indicator/right-fringe () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'right-fringe)) (`(,side _ _) (get-text-property 0 'display icon))) (should (eq side 'right-fringe)))) (ert-deftest flycheck-error-level-make-indicator/left-margin () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'left-margin)) (`(,side _ _) (get-text-property 0 'display icon))) (should (equal side '(margin left-margin))))) (ert-deftest flycheck-error-level-make-indicator/right-margin () :tags '(error-level) (pcase-let* ((icon (flycheck-error-level-make-indicator 'test-level 'right-margin)) (`(,side _ _) (get-text-property 0 'display icon))) (should (equal side '(margin right-margin))))) (ert-deftest flycheck-error-level-make-indicator/invalid-side () :tags '(error-level) (let ((err (should-error (flycheck-error-level-make-indicator 'test-level 'up-fringe)))) (should (string= (cadr err) "Invalid fringe side: up-fringe")))) ;;; Built-in error levels (ert-deftest flycheck-error-level-error () :tags '(error-level) (should (= (flycheck-error-level-severity 'error) 100)) (should (eq (flycheck-error-level-fringe-bitmap 'error) 'flycheck-fringe-bitmap-double-arrow)) (should (eq (flycheck-error-level-fringe-face 'error) 'flycheck-fringe-error)) (should (eq (flycheck-error-level-overlay-category 'error) 'flycheck-error-overlay)) (should (eq (flycheck-error-level-error-list-face 'error) 'flycheck-error-list-error))) (ert-deftest flycheck-error-level-warning () :tags '(error-level) (should (= (flycheck-error-level-severity 'warning) 10)) (should (eq (flycheck-error-level-fringe-bitmap 'warning) 'flycheck-fringe-bitmap-double-arrow)) (should (eq (flycheck-error-level-fringe-face 'warning) 'flycheck-fringe-warning)) (should (eq (flycheck-error-level-overlay-category 'warning) 'flycheck-warning-overlay)) (should (eq (flycheck-error-level-error-list-face 'warning) 'flycheck-error-list-warning))) (ert-deftest flycheck-error-level-info () :tags '(error-level) (should (= (flycheck-error-level-severity 'info) -10)) (should (eq (flycheck-error-level-fringe-bitmap 'info) 'flycheck-fringe-bitmap-double-arrow)) (should (eq (flycheck-error-level-fringe-face 'info) 'flycheck-fringe-info)) (should (eq (flycheck-error-level-overlay-category 'info) 'flycheck-info-overlay)) (should (eq (flycheck-error-level-error-list-face 'info) 'flycheck-error-list-info))) ;;; Error analysis (ert-deftest flycheck-has-max-errors-p () :tags '(error-analysis) (should (flycheck-has-max-errors-p nil 'error)) (let ((errors (list (flycheck-error-new-at 10 10 'warning) (flycheck-error-new-at 10 10 'info)))) (should (flycheck-has-max-errors-p errors 'error)) (should (flycheck-has-max-errors-p errors 'warning)) (should-not (flycheck-has-max-errors-p errors 'info)))) ;;; Error overlays in the current buffer (ert-deftest flycheck-info-overlay/priority () :tags '(overlay) (should (= (get 'flycheck-info-overlay 'priority) 90))) (ert-deftest flycheck-warning-overlay/priority () :tags '(overlay) (should (= (get 'flycheck-warning-overlay 'priority) 100))) (ert-deftest flycheck-error-overlay/priority () :tags '(overlay) (should (= (get 'flycheck-error-overlay 'priority) 110))) (ert-deftest flycheck-info-overlay/face () :tags '(overlay) (should (eq (get 'flycheck-info-overlay 'face) 'flycheck-info))) (ert-deftest flycheck-warning-overlay/face () :tags '(overlay) (should (eq (get 'flycheck-warning-overlay 'face) 'flycheck-warning))) (ert-deftest flycheck-error-overlay/face () :tags '(overlay) (should (eq (get 'flycheck-error-overlay 'face) 'flycheck-error))) (ert-deftest flycheck-add-overlay/undefined-error-level () :tags '(overlay) (let ((err (should-error (flycheck-add-overlay (flycheck-error-new-at 1 1 'foo))))) (should (string= (cadr err) "Undefined error level: foo")))) (ert-deftest flycheck-add-overlay/no-error-level () :tags '(overlay) (let ((err (should-error (flycheck-add-overlay (flycheck-error-new-at 1 1))))) (should (string= (cadr err) "Undefined error level: nil")))) (ert-deftest flycheck-add-overlay/info-category () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Foo") (let ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'info)))) (should (eq (overlay-get overlay 'category) 'flycheck-info-overlay))))) (ert-deftest flycheck-add-overlay/warning-category () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Foo") (let ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'warning)))) (should (eq (overlay-get overlay 'category) 'flycheck-warning-overlay))))) (ert-deftest flycheck-add-overlay/error-category () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Foo") (let ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'error)))) (should (eq (overlay-get overlay 'category) 'flycheck-error-overlay))))) (ert-deftest flycheck-add-overlay/has-help-echo () :tags '(overlay) (flycheck-ert-with-temp-buffer (let ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'info "A bar message")))) (should (eq (overlay-get overlay 'help-echo) #'flycheck-help-echo))))) (ert-deftest flycheck-add-overlay/has-flycheck-overlay-property () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Foo bar") (let* ((err (flycheck-error-new-at 1 1 'error)) (overlay (flycheck-add-overlay err))) (should (overlay-get overlay 'flycheck-overlay))))) (ert-deftest flycheck-add-overlay/has-flycheck-error-property () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Foo bar") (let* ((err (flycheck-error-new-at 1 1 'warning)) (overlay (flycheck-add-overlay err))) (should (eq (overlay-get overlay 'flycheck-error) err))))) (ert-deftest flycheck-add-overlay/has-no-fringe-icon-with-disabled-indication () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Hello\n World") (let ((flycheck-indication-mode nil)) (dolist (level '(warning info error)) (let ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 level)))) (should-not (overlay-get overlay 'before-string))))))) (ert-deftest flycheck-add-overlay/has-info-fringe-icon () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Hello\n World") (pcase-let* ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'info))) (before-string (overlay-get overlay 'before-string)) (`(_ ,bitmap ,face) (get-text-property 0 'display before-string))) (should (eq face 'flycheck-fringe-info)) (should (eq bitmap 'flycheck-fringe-bitmap-double-arrow))))) (ert-deftest flycheck-add-overlay/has-warning-fringe-icon () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Hello\n World") (pcase-let* ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'warning))) (before-string (overlay-get overlay 'before-string)) (`(_ ,bitmap ,face) (get-text-property 0 'display before-string))) (should (eq face 'flycheck-fringe-warning)) (should (eq bitmap 'flycheck-fringe-bitmap-double-arrow))))) (ert-deftest flycheck-add-overlay/has-error-fringe-icon () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Hello\n World") (pcase-let* ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'error))) (before-string (overlay-get overlay 'before-string)) (`(_ ,bitmap ,face) (get-text-property 0 'display before-string))) (should (eq face 'flycheck-fringe-error)) (should (eq bitmap 'flycheck-fringe-bitmap-double-arrow))))) (ert-deftest flycheck-add-overlay/has-left-fringe-icon () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Hello\n World") ;; Test the various indication modes (let ((flycheck-indication-mode 'left-fringe)) (pcase-let* ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'error))) (before-string (overlay-get overlay 'before-string)) (`(,side _ _) (get-text-property 0 'display before-string))) (should (eq side 'left-fringe)))))) (ert-deftest flycheck-add-overlay/has-right-fringe-icon () :tags '(overlay) (flycheck-ert-with-temp-buffer (insert "Hello\n World") ;; Test the various indication modes (let ((flycheck-indication-mode 'right-fringe)) (pcase-let* ((overlay (flycheck-add-overlay (flycheck-error-new-at 1 1 'error))) (before-string (overlay-get overlay 'before-string)) (`(,side _ _) (get-text-property 0 'display before-string))) (should (eq side 'right-fringe)))))) (ert-deftest flycheck-add-overlay/right-position-in-narrowed-buffer () :tags '(overlay language-emacs-lisp checker-emacs-lisp checker-emacs-lisp-checkdoc) "Test that all overlays are added at the right positions with narrowing in place." (flycheck-ert-with-resource-buffer "narrowing.el" (emacs-lisp-mode) (flycheck-mode) ;; Narrow to the function and check the buffer (re-search-forward "(defun .*") (forward-line 1) (narrow-to-defun) (should (buffer-narrowed-p)) (flycheck-ert-buffer-sync) ;; We should have two errors highlighted between point min and max now (should (= (length (flycheck-overlays-in (point-min) (point-max))) 2)) ;; Remove restrictions and test that all errors are reported (widen) (should (= (length (flycheck-overlays-in (point-min) (point-max))) 4)) (flycheck-ert-should-errors '(9 1 warning "`message' called with 0 args to fill 1 format field(s)" :checker emacs-lisp) '(11 8 warning "`message' called with 0 args to fill 1 format field(s)" :checker emacs-lisp) '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc) '(15 1 warning "`message' called with 0 args to fill 1 format field(s)" :checker emacs-lisp)))) (ert-deftest flycheck-add-overlay/help-echo-is-error-message () :tags '(overlay) "Check for default help at point." (flycheck-ert-with-temp-buffer (insert " ") (goto-char 1) (flycheck-add-overlay (flycheck-error-new-at 1 1 'info "A bar message")) (should (string= (help-at-pt-string) "A bar message")))) (ert-deftest flycheck-add-overlay/can-suppress-help-echo () :tags '(overlay) "Check that setting help-echo function to nil removes help echoes." (flycheck-ert-with-temp-buffer (insert " ") (goto-char 1) (flycheck-add-overlay (flycheck-error-new-at 1 1 'info "info")) (let ((flycheck-help-echo-function nil)) (should (string= (help-at-pt-string) nil))))) (ert-deftest flycheck-add-overlay/help-echo-for-nil-message-is-default () :tags '(overlay) "Check that null error messages are replaced by 'Unkown [level]'." (flycheck-ert-with-temp-buffer (insert " ") (goto-char 1) (flycheck-add-overlay (flycheck-error-new-at 1 1 'info)) (should (string= (help-at-pt-string) "Unknown info")))) (ert-deftest flycheck-add-overlay/help-echo-stacks-errors () :tags '(overlay) "Check that help-echo messages contain all error messages at point." (flycheck-ert-with-temp-buffer (insert " ") (goto-char 1) (flycheck-add-overlay (flycheck-error-new-at 1 1 'info "info")) (flycheck-add-overlay (flycheck-error-new-at 1 1 'warning "warning")) (flycheck-add-overlay (flycheck-error-new-at 1 1 'error "error")) (should (string= (help-at-pt-string) "info\nwarning\nerror")))) (ert-deftest flycheck-add-overlay/help-echo-stacks-errors-region () :tags '(overlay) "Check that help-echo messages include snippets when available." (flycheck-ert-with-temp-buffer (insert "int main() {}") (goto-char 5) (flycheck-add-overlay (flycheck-error-new-at 1 1 'info "info" :end-column 14)) (flycheck-add-overlay (flycheck-error-new-at 1 5 'warning "warning" :end-column 9)) (flycheck-add-overlay (flycheck-error-new-at 1 5 'error "error" :end-column 11)) (let ((text-quoting-style 'grave)) (should (string= (help-at-pt-string) "`int main() {}': info\n`main': warning\n`main()': error"))))) ;;; Error navigation in the current buffer (defmacro flycheck-test-with-nav-buffer (minimum-level &rest body) "With MINIMUM-LEVEL, eval BODY in a temporary buffer for navigation. Set `flycheck-navigation-minimum-level' to MINIMUM-LEVEL while evaluating BODY." (declare (indent 1)) `(flycheck-ert-with-resource-buffer "language/emacs-lisp/errors-and-warnings.el" (emacs-lisp-mode) (flycheck-mode) (let ((flycheck-navigation-minimum-level ,minimum-level)) (flycheck-ert-buffer-sync) (goto-char (point-min)) ,@body))) (ert-deftest flycheck-next-error/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (flycheck-next-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/goes-to-next-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (flycheck-next-error) (flycheck-next-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/errors-beyond-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer nil (let ((err (should-error (flycheck-next-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer nil (flycheck-next-error 2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-next-error -2) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/reset-navigates-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-next-error 1 'reset) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/does-not-cross-narrowing () :tags '(navigation) (flycheck-test-with-nav-buffer nil (re-search-forward "(defun .*") (narrow-to-defun) (goto-char (point-min)) (flycheck-next-error) (should (flycheck-ert-at-nth-error 1)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/errors-before-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (let ((err (should-error (flycheck-previous-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/goes-to-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-previous-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-previous-error 2) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-previous-error/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer nil (flycheck-previous-error -2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (let ((err (should-error (flycheck-previous-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-first-error/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-first-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-first-error/stays-at-first-error-if-called-again () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-first-error) (flycheck-first-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-first-error/goes-to-second-error () :tags '(navigation) (flycheck-test-with-nav-buffer nil (goto-char (point-max)) (flycheck-first-error 2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-errors/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (flycheck-next-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-errors/goes-to-next-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (flycheck-next-error) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-errors/errors-beyond-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-errors/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (let ((err (should-error (flycheck-next-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-errors/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (let ((err (should-error (flycheck-next-error 2) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-errors/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (let ((err (should-error (flycheck-next-error -2) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-errors/reset-navigates-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (flycheck-next-error 1 'reset) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-errors/does-not-cross-narrowing () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (re-search-forward "(defun .*") (narrow-to-defun) (goto-char (point-min)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/minimum-level/ignores-minimum-level-if-no-error-beyond-it () :tags '(navigation) (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (emacs-lisp-mode) (flycheck-mode) (let ((flycheck-navigation-minimum-level 'error)) (flycheck-ert-buffer-sync) (goto-char (point-min)) (flycheck-next-error 1) (should (flycheck-ert-at-nth-error 1))))) (ert-deftest flycheck-previous-error/over-errors/errors-before-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (let ((err (should-error (flycheck-previous-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-errors/goes-to-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (flycheck-previous-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/over-errors/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (let ((err (should-error (flycheck-previous-error -2) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-errors/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (let ((err (should-error (flycheck-previous-error -2) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-errors/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (let ((err (should-error (flycheck-previous-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-first-error/over-errors/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (flycheck-first-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-first-error/over-errors/stays-at-first-error-if-called-again () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (flycheck-first-error) (flycheck-first-error) (should (flycheck-ert-at-nth-error 2)))) ; second occurrence is an 'error (ert-deftest flycheck-first-error/over-errors/goes-to-second-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'error (goto-char (point-max)) (let ((err (should-error (flycheck-first-error 2) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-warnings/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (flycheck-next-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/over-warnings/goes-to-next-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (flycheck-next-error) (flycheck-next-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-warnings/errors-beyond-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-warnings/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (let ((err (should-error (flycheck-next-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-warnings/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (let ((err (should-error (flycheck-next-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-warnings/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-next-error -2) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/over-warnings/reset-navigates-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-next-error 1 'reset) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/over-warnings/does-not-cross-narrowing () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (re-search-forward "(defun .*") (narrow-to-defun) (goto-char (point-min)) (flycheck-next-error) (should (flycheck-ert-at-nth-error 1)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-warnings/errors-before-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (let ((err (should-error (flycheck-previous-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-warnings/goes-to-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-previous-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/over-warnings/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-previous-error 2) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-previous-error/over-warnings/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (flycheck-previous-error -2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/over-warnings/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (let ((err (should-error (flycheck-previous-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-first-error/over-warnings/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-first-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-first-error/over-warnings/stays-at-first-error-if-called-again () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-first-error) (flycheck-first-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-first-error/over-warnings/goes-to-second-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'warning (goto-char (point-max)) (flycheck-first-error 2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-informational/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (flycheck-next-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/over-informational/goes-to-next-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (flycheck-next-error) (flycheck-next-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-informational/errors-beyond-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-informational/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (let ((err (should-error (flycheck-next-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-next-error/over-informational/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (flycheck-next-error 2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-next-error/over-informational/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-next-error -2) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/over-informational/reset-navigates-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-next-error 1 'reset) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-next-error/over-informational/does-not-cross-narrowing () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (re-search-forward "(defun .*") (narrow-to-defun) (goto-char (point-min)) (flycheck-next-error) (should (flycheck-ert-at-nth-error 1)) (let ((err (should-error (flycheck-next-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-informational/errors-before-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (let ((err (should-error (flycheck-previous-error) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-previous-error/over-informational/goes-to-last-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-previous-error) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/over-informational/navigate-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-previous-error 2) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-previous-error/over-informational/navigate-back-by-two-errors () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (flycheck-previous-error -2) (should (flycheck-ert-at-nth-error 2)))) (ert-deftest flycheck-previous-error/over-informational/errors-when-moving-too-far () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (let ((err (should-error (flycheck-previous-error 4) :type 'user-error))) (should (string= (cadr err) "No more Flycheck errors"))))) (ert-deftest flycheck-first-error/over-informational/goes-to-first-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-first-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-first-error/over-informational/stays-at-first-error-if-called-again () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-first-error) (flycheck-first-error) (should (flycheck-ert-at-nth-error 1)))) (ert-deftest flycheck-first-error/over-informational/goes-to-second-error () :tags '(navigation) (flycheck-test-with-nav-buffer 'info (goto-char (point-max)) (flycheck-first-error 2) (should (flycheck-ert-at-nth-error 2)))) ;;; Displaying errors in buffers (ert-deftest flycheck-display-errors/no-display-function-set () :tags '(error-display) (let ((err (flycheck-error-new-at 10 20 'warning "This is a Flycheck error.")) (flycheck-display-errors-function nil)) (shut-up ;; Without an error function, error display should be a no-op. (flycheck-display-errors (list err)) (should (equal (shut-up-current-output) ""))))) (ert-deftest flycheck-display-errors/custom-function () :tags '(error-display) (let* ((err (flycheck-error-new-at 10 20 'warning "Foo")) (displayed-errors nil) (flycheck-display-errors-function (lambda (errors) (dolist (err errors) (push err displayed-errors))))) (flycheck-display-errors (list err)) (should (equal displayed-errors (list err))))) ;;; Functions to display errors (ert-deftest flycheck-display-error-messages () :tags '(error-display) (let ((err (flycheck-error-new-at 10 20 'warning "This is a Flycheck error." :id "spam"))) (shut-up (flycheck-display-error-messages (list err)) (should (equal (shut-up-current-output) "This is a Flycheck error. [spam]\n"))))) ;;; Working with errors (ert-deftest flycheck-copy-errors-as-kill () :tags '(errors-at-point) (flycheck-ert-with-temp-buffer (insert "A test buffer to copy errors from") (let ((flycheck-highlighting-mode 'columns) ; Disable Sexps parsing (errors (list (flycheck-error-new-at 1 nil 'error "1st message") (flycheck-error-new-at 1 10 'warning "2nd message" :id "foo")))) (mapc #'flycheck-add-overlay errors) (flycheck-copy-errors-as-kill 10) (should (equal (-take 2 kill-ring) '("1st message" "2nd message"))) (flycheck-copy-errors-as-kill 10 #'flycheck-error-id) (should (equal (-take 1 kill-ring) '("foo"))) (flycheck-copy-errors-as-kill 10 #'flycheck-error-format-message-and-id) (should (equal (-take 2 kill-ring) '("1st message" "2nd message [foo]")))))) ;;; Syntax checkers using external commands (ert-deftest flycheck-command-argument-p/with-symbols () :tags '(definition) (dolist (symbol '(source source-inplace source-original temporary-directory temporary-file-name null-device)) (should (flycheck-command-argument-p symbol)))) (ert-deftest flycheck-command-argument-p/config-file-with-variable-symbol () :tags '(definition) (should (flycheck-command-argument-p '(config-file "foo" bar)))) (ert-deftest flycheck-command-argument-p/config-file-with-quoted-variable-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(config-file "foo" 'bar)))) (ert-deftest flycheck-command-argument-p/config-file-without-variable-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(config-file "foo")))) (ert-deftest flycheck-command-argument-p/option-without-filter () :tags '(definition) (should (flycheck-command-argument-p '(option "foo" bar)))) (ert-deftest flycheck-command-argument-p/option-with-filter () :tags '(definition) (should (flycheck-command-argument-p '(option "foo" bar filter)))) (ert-deftest flycheck-command-argument-p/option-with-quoted-variable-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(option "foo" 'bar)))) (ert-deftest flycheck-command-argument-p/option-with-quoted-filter-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(option "foo" bar 'filter)))) (ert-deftest flycheck-command-argument-p/option-without-variable () :tags '(definition) (should-not (flycheck-command-argument-p '(option "foo")))) (ert-deftest flycheck-command-argument-p/option-list-without-filter-and-prepender () :tags '(definition) (should (flycheck-command-argument-p '(option-list "foo" bar)))) (ert-deftest flycheck-command-argument-p/option-list-with-prepender () :tags '(definition) (should (flycheck-command-argument-p '(option-list "foo" bar prepend-fn)))) (ert-deftest flycheck-command-argument-p/option-list-with-prepender-and-filter () :tags '(definition) (should (flycheck-command-argument-p '(option-list "foo" bar prepend-fn filter)))) (ert-deftest flycheck-command-argument-p/option-list-with-quoted-variable-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(option-list "foo" 'bar)))) (ert-deftest flycheck-command-argument-p/option-list-with-quoted-prepender-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(option-list "foo" bar 'prepend-fn)))) (ert-deftest flycheck-command-argument-p/option-list-with-quoted-filter-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(option-list "foo" bar prepend-fn 'filter)))) (ert-deftest flycheck-command-argument-p/option-list-without-variable-symbol () :tags '(definition) (should-not (flycheck-command-argument-p '(option-list "foo")))) (ert-deftest flycheck-command-argument-p/eval-with-variable () :tags '(definition) (should (flycheck-command-argument-p '(eval bar)))) (ert-deftest flycheck-command-argument-p/eval-with-function-call () :tags '(definition) (should (flycheck-command-argument-p '(eval (spam "with eggs"))))) (ert-deftest flycheck-command-argument-p/eval-with-no-form () :tags '(definition) (should-not (flycheck-command-argument-p '(eval)))) (ert-deftest flycheck-command-argument-p/eval-with-multiple-forms () :tags '(definition) (should-not (flycheck-command-argument-p '(eval foo bar)))) (ert-deftest flycheck-command-argument-p/integer-literal () :tags '(definition) (should-not (flycheck-command-argument-p 100))) (ert-deftest flycheck-command-argument-p/unknown-argument-symbol () :tags '(definition) (should-not (flycheck-command-argument-p 'foo))) (ert-deftest flycheck-command-argument-p/unknown-argument-cell () :tags '(definition) (should-not (flycheck-command-argument-p '(foo bar)))) (ert-deftest flycheck-start-command-checker/wraps-command () :tags '(command-checker) (let* ((was-called 0) (flycheck-command-wrapper-function (lambda (cmd) (cl-incf was-called) (cons "echo" cmd)))) ;; Since we just `echo' the command, there should be zero errors (flycheck-ert-should-syntax-check "language/emacs-lisp/warnings.el" 'emacs-lisp-mode) ;; Called once for `emacs-lisp', and a second time for checkdoc (should (equal was-called 2)))) (define-derived-mode truncated-stdin-mode prog-mode "trunc") (flycheck-define-command-checker 'truncated-stdin "Reply with an error after reading after reading 12345 bytes." ;; This checker will close its stdin before we can write all of our input. :command `(;; CI machines have python3 as "python" ,(or (executable-find "python3") "python") "-c" "import sys; sys.stdin.close(); print('stdin:1:1:error')") :error-patterns '((error bol "stdin" ":" line ":" column ":" (message))) :modes '(truncated-stdin-mode) :standard-input t) (defconst flycheck-test--truncated-stdin (symbol-plist 'truncated-stdin)) ;; Forget about this checker, otherwise later tests that ensure that all ;; checkers are registered and documented documentation and fail (setf (symbol-plist 'truncated-stdin) nil) ;; https://github.com/flycheck/flycheck/issues/1278 (ert-deftest flycheck-start-command-checker/truncated-stdin-with-errors () :tags '(command-checker) (cl-letf* ((flycheck-checker 'truncated-stdin) ((symbol-plist 'truncated-stdin) flycheck-test--truncated-stdin)) (dolist (buffer-size '(4095 65537)) ;; As long as the checker reports at least one error closing stdin early ;; isn't an issue. (flycheck-ert-with-temp-buffer (truncated-stdin-mode) (insert (make-string buffer-size ?a)) (flycheck-ert-should-syntax-check-in-buffer '(1 1 error "error" :checker truncated-stdin)))))) ;; https://github.com/flycheck/flycheck/issues/1278 (ert-deftest flycheck-start-command-checker/truncated-stdin-without-errors () :tags '(command-checker) (cl-letf* ((flycheck-checker 'truncated-stdin) ((symbol-plist 'truncated-stdin) flycheck-test--truncated-stdin) ((flycheck-checker-get 'truncated-stdin 'error-patterns) '(("\\`_\\`" . error)))) ;; If the checker closes stdin early without reporting errors, something ;; might have gone wrong, so warn the user. (flycheck-ert-with-temp-buffer (truncated-stdin-mode) (insert (make-string 65537 ?\n)) (should-error (shut-up (flycheck-ert-should-syntax-check-in-buffer)) :type 'flycheck-ert-suspicious-checker)))) ;;; Executables of command checkers (ert-deftest flycheck-overridden-executable () :tags '(executables language-emacs-lisp checker-emacs-lisp checker-emacs-lisp-checkdoc) (let ((flycheck-emacs-lisp-executable (flycheck-ert-resource-filename "bin/dummy-emacs"))) (flycheck-ert-should-syntax-check "language/emacs-lisp/warnings.el" 'emacs-lisp-mode '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc) '(17 4 error "t is not true!" :checker emacs-lisp) '(19 11 warning "This is a stupid message" :checker emacs-lisp)))) (ert-deftest flycheck-set-checker-executable/real-executable () :tags '(executables) (flycheck-ert-with-temp-buffer ;; Create a temporary buffer to restrict the scope of ;; `flycheck-emacs-lisp-executable' (let ((file-name (flycheck-ert-resource-filename "bin/dummy-emacs"))) (should (file-exists-p file-name)) (should (file-executable-p file-name)) (should-not (local-variable-p 'flycheck-emacs-lisp-executable)) (with-no-warnings (flycheck-set-checker-executable 'emacs-lisp file-name)) (should (local-variable-p 'flycheck-emacs-lisp-executable)) (should (string= flycheck-emacs-lisp-executable file-name)))) ;; The global value should remain unaffected (should-not flycheck-emacs-lisp-executable)) (ert-deftest flycheck-set-checker-executable/no-executable-given () :tags '(executables) (flycheck-ert-with-temp-buffer (let ((file-name (flycheck-ert-resource-filename "bin/dummy-emacs"))) (setq-local flycheck-emacs-lisp-executable file-name) (should (string= flycheck-emacs-lisp-executable file-name)) (with-no-warnings (flycheck-set-checker-executable 'emacs-lisp)) (should-not flycheck-emacs-lisp-executable) (should (local-variable-p 'flycheck-emacs-lisp-executable))))) (ert-deftest flycheck-set-checker-executable/executable-is-nil () :tags '(executables) (flycheck-ert-with-temp-buffer (let ((file-name (flycheck-ert-resource-filename "bin/dummy-emacs"))) (setq-local flycheck-emacs-lisp-executable file-name) (should (string= flycheck-emacs-lisp-executable file-name)) (with-no-warnings (flycheck-set-checker-executable 'emacs-lisp nil)) (should-not flycheck-emacs-lisp-executable) (should (local-variable-p 'flycheck-emacs-lisp-executable))))) (ert-deftest flycheck-set-checker-executable/non-existing-file () :tags '(executables) (let ((file-name (flycheck-ert-resource-filename "no-such-file"))) (should-not (file-exists-p file-name)) (let ((err (should-error (flycheck-set-checker-executable 'emacs-lisp file-name) :type 'user-error))) (should (string= (cadr err) (format "%s is no executable" file-name)))))) (ert-deftest flycheck-set-checker-executable/file-not-executable () :tags '(executables) (let ((file-name (flycheck-ert-resource-filename "language/emacs-lisp/warnings.el"))) (should (file-exists-p file-name)) (should-not (file-executable-p file-name)) (let ((err (should-error (flycheck-set-checker-executable 'emacs-lisp file-name) :type 'user-error))) (should (string= (cadr err) (format "%s is no executable" file-name)))))) ;;; Configuration files and options for command syntax checkers (ert-deftest flycheck-locate-config-file-by-path/just-a-base-name () :tags '(configuration) (flycheck-ert-with-temp-buffer (cd flycheck-test-directory) (should-not (flycheck-locate-config-file-by-path "flycheck-test.el" 'emacs-lisp)))) (ert-deftest flycheck-locate-config-file-by-path/with-path () :tags '(configuration) (flycheck-ert-with-temp-buffer (cd flycheck-test-directory) (should (equal (flycheck-locate-config-file-by-path "../Makefile" 'emacs-lisp) (expand-file-name "../Makefile" flycheck-test-directory))))) (ert-deftest flycheck-locate-config-file-by-path/non-existing-file () :tags '(configuration) (flycheck-ert-with-temp-buffer (cd flycheck-test-directory) (should-not (flycheck-locate-config-file-by-path "../foobar" 'emacs-lisp)))) (ert-deftest flycheck-locate-config-file-ancestor-directories/not-existing-file () :tags '(configuration) (flycheck-ert-with-temp-buffer (setq buffer-file-name (expand-file-name "flycheck-test.el" flycheck-test-directory)) (should-not (flycheck-locate-config-file-ancestor-directories "foo" 'emacs-lisp)))) (ert-deftest flycheck-locate-config-file-ancestor-directories/file-on-same-level () :tags '(configuration) (flycheck-ert-with-temp-buffer (setq buffer-file-name (expand-file-name "flycheck-test.el" flycheck-test-directory)) (should (equal (flycheck-locate-config-file-ancestor-directories "run.el" 'emacs-lisp) (expand-file-name "run.el" flycheck-test-directory))))) (ert-deftest flycheck-locate-config-file-ancestor-directories/file-on-parent-level () :tags '(configuration) (flycheck-ert-with-temp-buffer (setq buffer-file-name (expand-file-name "flycheck-test.el" flycheck-test-directory)) (should (equal (flycheck-locate-config-file-ancestor-directories "Makefile" 'emacs-lisp) (expand-file-name "../Makefile" flycheck-test-directory))))) (ert-deftest flycheck-locate-config-file/not-existing-file () :tags '(configuration) (flycheck-ert-with-env (list (cons "HOME" flycheck-test-directory)) (should-not (flycheck-locate-config-file-home "foo" 'emacs-lisp)))) (ert-deftest flycheck-locate-config-file/existing-file-in-parent-directory () :tags '(configuration) (flycheck-ert-with-env (list (cons "HOME" flycheck-test-directory)) (should-not (flycheck-locate-config-file-home "Makefile" 'emacs-lisp)))) (ert-deftest flycheck-locate-config-file/existing-file-in-home-directory () :tags '(configuration) (flycheck-ert-with-env (list (cons "HOME" flycheck-test-directory)) (should (equal (flycheck-locate-config-file-home "flycheck-test.el" 'emacs-lisp) (expand-file-name "flycheck-test.el" flycheck-test-directory))))) (ert-deftest flycheck-locate-config-file/multiple-files () :tags '(configuration) (flycheck-ert-with-temp-buffer (setq buffer-file-name (expand-file-name "specs/test-documentation.el" flycheck-test-directory)) (should (equal (flycheck-locate-config-file '("test-documentation.el" "flycheck-test.el") 'emacs-lisp) (expand-file-name "specs/test-documentation.el" flycheck-test-directory))))) (ert-deftest flycheck-locate-config-file/multiple-files-ordered () :tags '(configuration) (flycheck-ert-with-temp-buffer (setq buffer-file-name (expand-file-name "specs/test-documentation.el" flycheck-test-directory)) (should (equal (flycheck-locate-config-file '("flycheck-test.el" "test-documentation.el") 'emacs-lisp) (expand-file-name "flycheck-test.el" flycheck-test-directory))))) (ert-deftest flycheck-option-int/pass-through-nil () :tags '(option-filters) (should (null (flycheck-option-int nil)))) (ert-deftest flycheck-option-int/integer-argument () :tags '(option-filters) (should (equal (flycheck-option-int 10) "10"))) (ert-deftest flycheck-option-comma-separated-list/empty-list () :tags '(option-filters) (should (null (flycheck-option-comma-separated-list nil)))) (ert-deftest flycheck-option-comma-separated-list/with-single-nil () :tags '(option-filters) (should (null (flycheck-option-comma-separated-list '(nil))))) (ert-deftest flycheck-option-comma-separated-list/filter-returns-nil () :tags '(option-filters) (should (null (flycheck-option-comma-separated-list '(10 20) nil (lambda (_x) nil))))) (ert-deftest flycheck-option-comma-separated-list/default-separator () :tags '(option-filters) (should (equal (flycheck-option-comma-separated-list '("foo" "bar")) "foo,bar"))) (ert-deftest flycheck-option-comma-separated-list/custom-separator () :tags '(option-filters) (should (equal (flycheck-option-comma-separated-list '("foo" "bar") ":") "foo:bar"))) (ert-deftest flycheck-option-comma-separated-list/custom-filter () :tags '(option-filters) (should (equal (flycheck-option-comma-separated-list '(10 20) nil #'number-to-string) "10,20"))) ;;; Built-in checkers ;; Tell the byte compiler about the variables we'll use (eval-when-compile (defvar js2-mode-show-strict-warnings) (defvar js2-mode-show-parse-errors) (defvar js3-mode-show-parse-errors) (defvar python-indent-guess-indent-offset)) (flycheck-ert-def-checker-test ada-gnat ada syntax-error (require 'speedbar) (flycheck-ert-should-syntax-check "language/ada/syntaxerror.adb" 'ada-mode '(7 32 error "missing \";\"" :checker ada-gnat) '(8 5 error "misspelling of \"SYNTAXERROR\"" :checker ada-gnat))) (flycheck-ert-def-checker-test ada-gnat ada warnings (require 'speedbar) (flycheck-ert-should-syntax-check "language/ada/hello.adb" 'ada-mode '( 6 4 warning "variable \"Name\" is not referenced" :checker ada-gnat) '(8 11 warning "unrecognized pragma \"Foo\"" :checker ada-gnat))) (flycheck-ert-def-checker-test asciidoc asciidoc nil (let ((flycheck-disabled-checkers '(asciidoctor))) (flycheck-ert-should-syntax-check "language/asciidoc.adoc" 'adoc-mode '(1 nil warning "missing style: [paradef-default]: paragraph" :checker asciidoc) '(3 nil info "old tables syntax" :checker asciidoc) '(11 nil error "[tabledef-default] illegal width=%60%" :checker asciidoc)))) (flycheck-ert-def-checker-test asciidoctor asciidoc nil (flycheck-ert-should-syntax-check "language/asciidoctor.adoc" 'adoc-mode '(4 nil warning "section title out of sequence: expected level 1, got level 2" :checker asciidoctor) '(6 nil error "unmatched preprocessor directive: endif::[]" :checker asciidoctor))) (flycheck-ert-def-checker-test awk-gawk awk syntax-error (flycheck-ert-should-syntax-check "language/awk/syntax-error.awk" 'awk-mode '(2 nil warning "x=|\n ^ syntax error" :checker awk-gawk))) (flycheck-ert-def-checker-test bazel-buildifier bazel error (flycheck-ert-should-syntax-check "language/bazel/syntax-error.bazel" 'bazel-mode '(1 11 error "syntax error near !" :checker bazel-buildifier))) (flycheck-ert-def-checker-test bazel-buildifier bazel nil (flycheck-ert-should-syntax-check "language/bazel/warnings.bazel" 'bazel-mode '(1 nil warning "The file has no module docstring. (https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#module-docstring)" :id "module-docstring" :checker bazel-buildifier))) (flycheck-ert-def-checker-test c/c++-clang (c c++) error (let ((flycheck-disabled-checkers '(c/c++-gcc))) (flycheck-ert-should-syntax-check "language/c_c++/error.cpp" 'c++-mode '(2 20 error "no member named 'bar' in 'A'" :checker c/c++-clang) '(6 19 info "in instantiation of function template specialization 'foo' requested here" :checker c/c++-clang) '(8 9 warning "unknown pragma ignored" :checker c/c++-clang)))) (flycheck-ert-def-checker-test c/c++-clang (c c++) fatal-error (let ((flycheck-disabled-checkers '(c/c++-gcc))) (flycheck-ert-should-syntax-check "language/c_c++/includes.c" 'c-mode '(2 10 error "'library.h' file not found" :checker c/c++-clang)))) (flycheck-ert-def-checker-test c/c++-clang (c c++) warnings (let ((flycheck-disabled-checkers '(c/c++-gcc c/c++-cppcheck))) (flycheck-ert-should-syntax-check "language/c_c++/warning.c" 'c-mode '(5 10 warning "unused variable 'unused'" :checker c/c++-clang) '(7 15 warning "comparison of integers of different signs: 'int' and 'unsigned int'" :checker c/c++-clang) '(8 7 warning "no message" :checker c/c++-clang)))) (flycheck-ert-def-checker-test c/c++-clang (c c++) included-file-warning (let ((flycheck-clang-include-path '("./include")) (flycheck-disabled-checkers '(c/c++-gcc)) (flycheck-relevant-error-other-file-minimum-level 'warning)) (flycheck-ert-should-syntax-check "language/c_c++/in-included-file.cpp" 'c++-mode `(5 10 warning "unused variable 'unused'" :filename ,(flycheck-ert-resource-filename "language/c_c++/warning.c") :checker c/c++-clang) `(7 15 warning "comparison of integers of different signs: 'int' and 'unsigned int'" :filename ,(flycheck-ert-resource-filename "language/c_c++/warning.c") :checker c/c++-clang) `(8 7 warning "no message" :filename ,(flycheck-ert-resource-filename "language/c_c++/warning.c") :checker c/c++-clang)))) (flycheck-ert-def-checker-test c/c++-gcc (c c++) error (let ((flycheck-disabled-checkers '(c/c++-clang))) (flycheck-ert-should-syntax-check "language/c_c++/error.cpp" 'c++-mode '(2 20 error "'struct A' has no member named 'bar'" :checker c/c++-gcc) '(8 nil warning "ignoring #pragma nope" :id "-Wunknown-pragmas" :checker c/c++-gcc)))) (flycheck-ert-def-checker-test c/c++-gcc (c c++) fatal-error (let ((flycheck-disabled-checkers '(c/c++-clang))) (flycheck-ert-should-syntax-check "language/c_c++/includes.c" 'c-mode '(2 10 error "library.h: No such file or directory" :checker c/c++-gcc)))) (flycheck-ert-def-checker-test c/c++-gcc (c c++) warning (let ((flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck))) (flycheck-ert-should-syntax-check "language/c_c++/warning.c" 'c-mode '(5 10 warning "unused variable 'unused'" :id "-Wunused-variable" :checker c/c++-gcc) '(7 15 warning "comparison of integer expressions of different signedness: 'int' and 'unsigned int'" :id "-Wsign-compare" :checker c/c++-gcc) '(8 7 warning "#warning" :id "-Wcpp" :checker c/c++-gcc)))) (flycheck-ert-def-checker-test c/c++-gcc (c c++) included-file-warning (let ((flycheck-gcc-include-path '("./include")) (flycheck-disabled-checkers '(c/c++-clang)) (flycheck-relevant-error-other-file-minimum-level 'warning)) (flycheck-ert-should-syntax-check "language/c_c++/in-included-file.cpp" 'c++-mode `(5 10 warning "unused variable 'unused'" :filename ,(flycheck-ert-resource-filename "language/c_c++/warning.c") :id "-Wunused-variable" :checker c/c++-gcc) `(7 15 warning "comparison of integer expressions of different signedness: 'int' and 'unsigned int'" :filename ,(flycheck-ert-resource-filename "language/c_c++/warning.c") :id "-Wsign-compare" :checker c/c++-gcc) `(8 7 warning "#warning" :filename ,(flycheck-ert-resource-filename "language/c_c++/warning.c") :id "-Wcpp" :checker c/c++-gcc)))) (flycheck-ert-def-checker-test c/c++-cppcheck (c c++) nil :tags '(cppcheck-xml) (let ((flycheck-disabled-checkers '(c/c++-clang c/c++-gcc)) (flycheck-cppcheck-inconclusive nil) (flycheck-cppcheck-checks '("style"))) (flycheck-ert-should-syntax-check "language/c_c++/style2.cpp" 'c++-mode '(3 nil info "The scope of the variable 'i' can be reduced. Warning: Be careful when fixing this message, especially when there are inner loops. Here is an example where cppcheck will write that the scope for 'i' can be reduced:\nvoid f(int x)\n{\n int i = 0;\n if (x) {\n // it's safe to move 'int i = 0;' here\n for (int n = 0; n < 10; ++n) {\n // it is possible but not safe to move 'int i = 0;' here\n do_something(&i);\n }\n }\n}\nWhen you see this message it is always safe to reduce the variable scope 1 level." :id "variableScope" :checker c/c++-cppcheck)) (flycheck-ert-should-syntax-check "language/c_c++/style.cpp" 'c-mode '(12 nil error "Code 'std::string' is invalid C code. Use --std or --language to configure the language." :id "syntaxError" :checker c/c++-cppcheck)) (flycheck-ert-should-syntax-check "language/c_c++/style.cpp" 'c++-mode '(3 nil error "Division by zero." :id "zerodiv" :checker c/c++-cppcheck) '(5 nil info "Unused variable: unused" :id "unusedVariable" :checker c/c++-cppcheck) '(9 nil error "Division by zero." :id "zerodiv" :checker c/c++-cppcheck) '(12 nil warning "Parameter 'foo' is passed by value. It could be passed as a const reference which is usually faster and recommended in C++." :id "passedByValue" :checker c/c++-cppcheck)))) (flycheck-ert-def-checker-test cfengine cfengine error (skip-unless (fboundp 'cfengine3-mode)) (flycheck-ert-should-syntax-check "language/cfengine/error.cf" 'cfengine3-mode '(8 21 error "Unknown promise type 'nosuchpromisetype'" :checker cfengine))) (flycheck-ert-def-checker-test cfengine cfengine warning (skip-unless (fboundp 'cfengine3-mode)) (flycheck-ert-should-syntax-check "language/cfengine/warning.cf" 'cfengine3-mode '(3 35 warning "Removed constraint 'host_licenses_paid' in promise type 'common' [-Wremoved]" :checker cfengine))) (flycheck-ert-def-checker-test chef-foodcritic chef nil (flycheck-ert-should-syntax-check "language/chef/recipes/error.rb" 'ruby-mode `(1 nil error "Missing README in markdown format" :checker chef-foodcritic :id "FC011" :filename ,(flycheck-ert-resource-filename "language/chef/README.md")) `(1 nil error "Cookbook without metadata.rb file" :checker chef-foodcritic :id "FC031" :filename ,(flycheck-ert-resource-filename "language/chef/metadata.rb")) `(1 nil error "Missing LICENSE file" :checker chef-foodcritic :id "FC071" :filename ,(flycheck-ert-resource-filename "language/chef/LICENSE")) '(3 nil error "Avoid string interpolation where not required" :checker chef-foodcritic :id "FC002") '(11 nil error "Use a service resource to start and stop services" :checker chef-foodcritic :id "FC004"))) (flycheck-ert-def-checker-test coffee coffee syntax-error (flycheck-ert-should-syntax-check "language/coffee/syntax-error.coffee" 'coffee-mode '(4 7 error "missing \"" :checker coffee))) (flycheck-ert-def-checker-test coffee-coffeelint coffee error :tags '(checkstyle-xml) (flycheck-ert-should-syntax-check "language/coffee/error.coffee" 'coffee-mode '(4 nil error "Throwing strings is forbidden; context:" :checker coffee-coffeelint))) (flycheck-ert-def-checker-test coffee-coffeelint coffee warning :tags '(checkstyle-xml) (let ((flycheck-coffeelintrc "lint.json")) (flycheck-ert-should-syntax-check "language/coffee/error.coffee" 'coffee-mode '(4 nil warning "Throwing strings is forbidden; context:" :checker coffee-coffeelint)))) (flycheck-ert-def-checker-test coq coq syntax-error (skip-unless (shut-up (load "gallina" 'noerror 'nomessage))) (flycheck-ert-should-syntax-check "language/coq/syntax-error.v" 'coq-mode '(6 12 error "\'end\' expected after [branches] (in [match_constr])." :checker coq :end-line 6 :end-column 14))) (flycheck-ert-def-checker-test coq coq error (skip-unless (shut-up (load "gallina" 'noerror 'nomessage))) (flycheck-ert-should-syntax-check "language/coq/error.v" 'coq-mode '(7 21 error "In environment evenb : nat -> bool n : nat n0 : nat n' : nat The term \"1\" has type \"nat\" while it is expected to have type \"bool\"." :checker coq :end-line 7 :end-column 22))) (flycheck-ert-def-checker-test css-csslint css nil :tags '(checkstyle-xml) (flycheck-ert-should-syntax-check "language/css/warning.css" 'css-mode '(3 6 warning "Heading (h1) should not be qualified." :id "Disallowqualifiedheadings" :checker css-csslint))) (flycheck-ert-def-checker-test css-csslint css syntax-error :tags '(checkstyle-xml) (flycheck-ert-should-syntax-check "language/css/syntax-error.css" 'css-mode '(4 14 error "Expected a `FUNCTION` or `IDENT` after colon at line 4, col 14." :id "ParsingErrors" :checker css-csslint))) (flycheck-ert-def-checker-test cuda cuda syntax-error (flycheck-ert-should-syntax-check "language/cuda/syntax-error.cu" 'cuda-mode '(5 0 error "error: identifier \"ac\" is undefined" :checker cuda))) (flycheck-ert-def-checker-test cuda cuda syntax-warning (flycheck-ert-should-syntax-check "language/cuda/syntax-warning.cu" 'cuda-mode '(3 0 warning "variable \"b\" was set but never used" :checker cuda))) (flycheck-ert-def-checker-test cwl cwl syntax-error (let ((flycheck-cwl-schema-path "schema/CommonWorkflowLanguage.yml")) (flycheck-ert-should-syntax-check "language/cwl/cwl.cwl" 'cwl-mode '(6 5 error "value is a str, expected null or CommandLineBinding" :checker cwl)))) (ert-deftest flycheck-d-module-re/matches-module-name () :tags '(language-d) (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (let ((s "module spam.with.eggs ;")) (should (string-match flycheck-d-module-re s)) (should (string= "spam.with.eggs" (match-string 1 s))))) (ert-deftest flycheck-d-base-directory/no-module-declaration () :tags '(language-d) (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (flycheck-ert-with-resource-buffer "language/d/src/dmd/no_module.d" (should (flycheck-same-files-p (flycheck-d-base-directory) (flycheck-ert-resource-filename "language/d/src/dmd"))))) (ert-deftest flycheck-d-base-directory/with-module-declaration () :tags '(language-d) (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (flycheck-ert-with-resource-buffer "language/d/src/dmd/warning.d" (should (flycheck-same-files-p (flycheck-d-base-directory) (flycheck-ert-resource-filename "language/d/src"))))) (ert-deftest flycheck-d-base-directory/package-file () :tags '(language-d) (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (flycheck-ert-with-resource-buffer "language/d/src/dmd/package.d" (should (flycheck-same-files-p (flycheck-d-base-directory) (flycheck-ert-resource-filename "language/d/src"))))) (flycheck-ert-def-checker-test d-dmd d warning-include-path (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (let ((flycheck-dmd-include-path '("../../lib"))) (flycheck-ert-should-syntax-check "language/d/src/dmd/warning.d" 'd-mode '(9 5 warning "statement is not reachable" :checker d-dmd) '(20 17 warning "function `dmd.warning.bar` is deprecated" :checker d-dmd)))) (flycheck-ert-def-checker-test d-dmd d missing-import (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (flycheck-ert-should-syntax-check "language/d/src/dmd/warning.d" 'd-mode '(4 8 error "module `external_library` is in file 'external_library.d' which cannot be read" :checker d-dmd))) (flycheck-ert-def-checker-test d-dmd d continuation-line (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (flycheck-ert-should-syntax-check "language/d/src/dmd/continuation.d" 'd-mode '(5 12 error "undefined identifier `invalid`" :checker d-dmd) '(10 12 error "template instance `continuation.T!()` error instantiating" :checker d-dmd) '(13 1 info "instantiated from here: `U!()`" :checker d-dmd))) (flycheck-ert-def-checker-test d-dmd d non-d-extension (skip-unless (fboundp 'd-mode)) (unless (version<= "24.4" emacs-version) (ert-skip "Skipped because CC Mode is broken on 24.3. See https://github.com/flycheck/flycheck/issues/531 and Emacs bug #19206")) (flycheck-ert-with-temp-buffer (insert "!invalid") (d-mode) (flycheck-ert-buffer-sync) (flycheck-ert-should-errors '(1 1 error "declaration expected, not `!`" :checker d-dmd)))) (flycheck-ert-def-checker-test dockerfile-hadolint dockerfile error (flycheck-ert-should-syntax-check "language/dockerfile/Dockerfile.error" 'dockerfile-mode '(2 1 error "unexpected 'I' expecting '#', '\\', ADD, ARG, CMD, COPY, ENTRYPOINT, ENV, EXPOSE, FROM, HEALTHCHECK, LABEL, MAINTAINER, ONBUILD, RUN, SHELL, STOPSIGNAL, USER, VOLUME, WORKDIR, at least one space, or end of input" :checker dockerfile-hadolint))) (flycheck-ert-def-checker-test dockerfile-hadolint dockerfile warnings (flycheck-ert-should-syntax-check "language/dockerfile/Dockerfile.warning" 'dockerfile-mode '(1 nil warning "Always tag the version of an image explicitly" :id "DL3006" :checker dockerfile-hadolint) '(2 nil warning "Do not use apt-get upgrade or dist-upgrade" :id "DL3005" :checker dockerfile-hadolint) '(2 nil warning "Delete the apt-get lists after installing something" :id "DL3009" :checker dockerfile-hadolint) '(3 nil warning "Use absolute WORKDIR" :id "DL3000" :checker dockerfile-hadolint))) (flycheck-ert-def-checker-test elixir-credo elixir infos-without-strict-mode (flycheck-ert-should-syntax-check "language/elixir/lib/infos.ex" 'elixir-mode '(1 11 info "Modules should have a @moduledoc tag." :checker elixir-credo))) (flycheck-ert-def-checker-test elixir-credo elixir infos-with-strict-mode (let ((flycheck-elixir-credo-strict t)) (flycheck-ert-should-syntax-check "language/elixir/lib/infos.ex" 'elixir-mode '(1 11 info "Modules should have a @moduledoc tag." :checker elixir-credo) '(2 nil info "Do not use parentheses when defining a function which has no arguments." :checker elixir-credo)))) (flycheck-ert-def-checker-test elixir-credo elixir warnings (flycheck-ert-should-syntax-check "language/elixir/lib/warnings.ex" 'elixir-mode '(5 nil warning "There are identical sub-expressions to the left and to the right of the '&&' operator." :checker elixir-credo) '(8 8 warning "length(list) == 0 is expensive. Prefer Enum.empty?/1 or list == []" :checker elixir-credo))) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp nil (flycheck-ert-should-syntax-check "language/emacs-lisp/warnings.el" 'emacs-lisp-mode '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc) '(16 6 warning "foobar called with 1 argument, but accepts only 0" :checker emacs-lisp) '(21 1 warning "the function `dummy-package-foo' is not known to be defined." :checker emacs-lisp ))) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp uses-right-major-mode (flycheck-ert-should-syntax-check "language/emacs-lisp/checkdoc-elisp-mode-regression.el" 'emacs-lisp-mode '(11 nil info "All variables and subroutines might as well have a documentation string" :checker emacs-lisp-checkdoc))) (flycheck-ert-def-checker-test (emacs-lisp-checkdoc) emacs-lisp inherits-checkdoc-variables ;; This test doesn't run on 24.3 and earlier because the corresponding ;; checkdoc variables were only introduced in 24.4. (skip-unless (version<= "24.4" emacs-version)) (flycheck-ert-should-syntax-check "language/emacs-lisp/local-checkdoc-variables.el" 'emacs-lisp-mode)) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp checks-compressed-file (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/emacs-lisp/warnings.el.gz" 'emacs-lisp-mode '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc) '(16 6 warning "foobar called with 1 argument, but accepts only 0" :checker emacs-lisp) '(21 1 warning "the function `dummy-package-foo' is not known to be defined." :checker emacs-lisp)))) (flycheck-ert-def-checker-test emacs-lisp emacs-lisp syntax-error (let ((flycheck-disabled-checkers '(emacs-lisp-checkdoc))) (flycheck-ert-should-syntax-check "language/emacs-lisp/syntax-error.el" 'emacs-lisp-mode '(3 1 error "End of file during parsing" :checker emacs-lisp)))) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp without-file-name ;; Regression test for checkdoc in buffers without file names. See ;; https://github.com/flycheck/flycheck/issues/73 and ;; https://github.com/bbatsov/prelude/issues/259 (flycheck-ert-with-resource-buffer "language/emacs-lisp/warnings.el" (set-visited-file-name nil 'no-query) (emacs-lisp-mode) (should-not (buffer-file-name)) (flycheck-ert-buffer-sync) ;; TODO: Consider whether checkdoc is really useful in buffers without file ;; names… (should flycheck-current-errors))) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp does-not-check-autoloads-buffers ;; Regression test ensuring that Emacs Lisp won't check autoload buffers. ;; These buffers are temporary buffers created during package installation to ;; collect the autoloads of newly installed packages before writing the ;; autoloads file. See `https://github.com/flycheck/flycheck/issues/45' and ;; `https://github.com/bbatsov/prelude/issues/253' for details. (flycheck-ert-with-file-buffer (locate-library "shut-up-autoloads") (should-not (flycheck-may-use-checker 'emacs-lisp)) (should-not (flycheck-may-use-checker 'emacs-lisp-checkdoc)))) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp checkdoc-does-not-check-cask-files (flycheck-ert-with-file-buffer (expand-file-name "Cask" flycheck-test-source-directory) (should-not (flycheck-may-use-checker 'emacs-lisp-checkdoc)))) (flycheck-ert-def-checker-test (emacs-lisp emacs-lisp-checkdoc) emacs-lisp does-not-check-with-no-byte-compile ;; We need to use a hook here, because `no-byte-compile' seems to be ;; explicitly changed when loading Emacs Lisp files (let ((disable-byte-comp (lambda () (setq-local no-byte-compile t)))) (add-hook 'emacs-lisp-mode-hook disable-byte-comp) (unwind-protect (flycheck-ert-should-syntax-check "language/emacs-lisp/warnings.el" 'emacs-lisp-mode '(12 nil info "First sentence should end with punctuation" :checker emacs-lisp-checkdoc)) (remove-hook 'emacs-lisp-mode-hook disable-byte-comp)))) (flycheck-ert-def-checker-test emacs-lisp emacs-lisp check-declare-warnings (let ((flycheck-emacs-lisp-check-declare t)) (flycheck-ert-should-syntax-check "language/emacs-lisp/check-declare-warnings.el" 'emacs-lisp-mode (cond ((version< emacs-version "25") '(0 nil warning "`this-function-is-not-declared' was defined in this-file-does-not-exist.el: file not found" :checker emacs-lisp)) ((version< emacs-version "26") '(9 1 warning "`this-function-is-not-declared' was defined in this-file-does-not-exist.el: file not found" :checker emacs-lisp)) (t '(9 nil warning "`this-function-is-not-declared' was defined in this-file-does-not-exist.el: file not found" :checker emacs-lisp)))))) (flycheck-ert-def-checker-test emacs-lisp emacs-lisp disable-check-declare (let ((flycheck-emacs-lisp-check-declare nil)) (flycheck-ert-should-syntax-check "language/emacs-lisp/check-declare-warnings.el" 'emacs-lisp-mode))) (flycheck-ert-def-checker-test ember-template ember-template error (flycheck-ert-should-syntax-check "language/ember-template-lint/ember-template-lint/error.hbs" 'web-mode '(2 16 error "Incorrect indentation for `` beginning at L2:C16. Expected `` to be at an indentation of 2 but was found at 16." :id "block-indentation" :checker ember-template))) (flycheck-ert-def-checker-test ember-template ember-template warning (flycheck-ert-should-syntax-check "language/ember-template-lint/ember-template-lint/warning.hbs" 'web-mode '(1 nil warning "Non-translated string used" :id "no-bare-strings" :checker ember-template))) (flycheck-ert-def-checker-test erlang erlang error (shut-up (flycheck-ert-should-syntax-check "language/erlang/erlang/error.erl" 'erlang-mode '(3 nil warning "export_all flag enabled - all functions will be exported" :checker erlang) '(7 nil error "head mismatch" :checker erlang)))) (flycheck-ert-def-checker-test erlang erlang warning (flycheck-ert-should-syntax-check "language/erlang/erlang/warning.erl" 'erlang-mode '(3 nil warning "export_all flag enabled - all functions will be exported" :checker erlang) '(6 nil warning "wrong number of arguments in format call" :checker erlang))) (flycheck-ert-def-checker-test erlang-rebar3 erlang error (flycheck-ert-should-syntax-check "language/erlang/rebar3/src/erlang-error.erl" 'erlang-mode '(3 nil warning "export_all flag enabled - all functions will be exported" :checker erlang-rebar3) '(7 nil error "head mismatch" :checker erlang-rebar3))) (flycheck-ert-def-checker-test erlang-rebar3 erlang build (shut-up (flycheck-ert-should-syntax-check "language/erlang/rebar3/_checkouts/dependency/src/dependency.erl" 'erlang-mode `(7 nil error "head mismatch" :checker erlang-rebar3 :filename ,(flycheck-ert-resource-filename "language/erlang/rebar3/src/erlang-error.erl")))) ;; Ensure that the dependency file wasn't built as standalone ;; project which would create a separate _build directory (should (not (file-exists-p (flycheck-ert-resource-filename "language/erlang/rebar3/_build/default/lib/dependency/_build"))))) (flycheck-ert-def-checker-test eruby-erubis eruby nil (let ((flycheck-disabled-checkers '(eruby-ruumba))) (flycheck-ert-should-syntax-check "language/eruby.erb" '(html-erb-mode rhtml-mode) '(9 nil error "syntax error, unexpected end-of-input, expecting `end'" :checker eruby-erubis)))) (flycheck-ert-def-checker-test eruby-ruumba eruby syntax-error (let ((flycheck-disabled-checkers '(eruby-erubis))) (flycheck-ert-should-syntax-check "language/eruby.erb" '(html-erb-mode rhtml-mode) '(8 1 error "unexpected token $end (Using Ruby 2.4 parser; configure using `TargetRubyVersion` parameter, under `AllCops`)" :id "Lint/Syntax" :checker eruby-ruumba)))) (flycheck-ert-def-checker-test fortran-gfortran fortran error (flycheck-ert-should-syntax-check "language/fortran/error.f" '(fortran-mode f90-mode) '(1 1 error "Non-numeric character in statement label at (1)" :checker fortran-gfortran) '(2 1 error "Non-numeric character in statement label at (1)" :checker fortran-gfortran) '(3 1 error "Non-numeric character in statement label at (1)" :checker fortran-gfortran))) (flycheck-ert-def-checker-test fortran-gfortran fortran free-form-error (let ((flycheck-gfortran-layout 'free)) (flycheck-ert-should-syntax-check "language/fortran/error.f" '(fortran-mode f90-mode) '(3 3 error "Expecting END PROGRAM statement at (1)" :checker fortran-gfortran)))) (flycheck-ert-def-checker-test fortran-gfortran fortran warning (flycheck-ert-should-syntax-check "language/fortran/warning.f90" '(fortran-mode f90-mode) '(1 20 warning "Unused dummy argument 'p' at (1)" :checker fortran-gfortran) '(18 9 warning "Same actual argument associated with INTENT(IN) argument 'a' and INTENT(OUT) argument 'b' at (1)" :checker fortran-gfortran))) (flycheck-ert-def-checker-test go-gofmt go syntax-error (flycheck-ert-should-syntax-check "language/go/src/syntax/syntax-error.go" 'go-mode '(5 9 error "expected '(', found ta" :checker go-gofmt) '(6 1 error "expected declaration, found '}'" :checker go-gofmt))) (flycheck-ert-def-checker-test (go-build go-golint go-vet) go complete-chain (flycheck-ert-with-env `(("GOPATH" . ,(flycheck-ert-resource-filename "language/go"))) (flycheck-ert-should-syntax-check "language/go/src/warnings.go" 'go-mode '(4 2 error "imported and not used: \"fmt\"" :checker go-build) '(4 2 warning "should not use dot imports" :checker go-golint) '(7 1 warning "exported function Warn should have comment or be unexported" :checker go-golint) '(8 2 error "undefined: fmt" :checker go-build) '(11 1 warning "exported function Warnf should have comment or be unexported" :checker go-golint) '(12 2 error "undefined: fmt" :checker go-build) '(17 2 error "undefined: fmt" :checker go-build) '(19 13 error "cannot use 1 (type untyped int) as type string in argument to Warnf" :checker go-build) '(25 9 warning "if block ends with a return statement, so drop this else and outdent its block" :checker go-golint)))) (flycheck-ert-def-checker-test go-build go handles-packages (flycheck-ert-with-env `(("GOPATH" . ,(flycheck-ert-resource-filename "language/go"))) (flycheck-ert-should-syntax-check "language/go/src/b1/main.go" 'go-mode))) (flycheck-ert-def-checker-test go-build go missing-package (let ((go-root (or (getenv "GOROOT") "/usr/local/go")) (go-path (concat (getenv "HOME") "/go"))) (flycheck-ert-with-env '(("GOPATH" . nil)) (flycheck-ert-should-syntax-check "language/go/src/b1/main.go" 'go-mode `(4 2 error ,(format "cannot find package \"b2\" in any of:\n\t%s/src/b2 (from $GOROOT)\n\t%s/src/b2 (from $GOPATH)" go-root go-path) :checker go-build))))) (flycheck-ert-def-checker-test go-test go nil (flycheck-ert-with-env `(("GOPATH" . ,(flycheck-ert-resource-filename "checkers/go"))) (flycheck-ert-should-syntax-check "language/go/src/test/test-error_test.go" 'go-mode '(8 2 error "undefined: fmt" :checker go-test)))) (flycheck-ert-def-checker-test go-errcheck go nil (flycheck-ert-with-env `(("GOPATH" . ,(flycheck-ert-resource-filename "language/go"))) (flycheck-ert-should-syntax-check "language/go/src/errcheck/errcheck.go" 'go-mode '(7 9 warning "Ignored `error` returned from `f.Close()`" :checker go-errcheck) '(9 9 warning "Ignored `error` returned from `os.Stat(\"enoent\")`" :checker go-errcheck)))) (flycheck-ert-def-checker-test go-unconvert go nil :tags '(language-go external-tool) (flycheck-ert-with-env `(("GOPATH" . ,(flycheck-ert-resource-filename "language/go"))) (flycheck-ert-should-syntax-check "language/go/src/unconvert/unconvert.go" 'go-mode '(7 17 warning "unnecessary conversion" :checker go-unconvert)))) (flycheck-ert-def-checker-test go-staticcheck go nil :tags '(language-go external-tool) (let ((flycheck-disabled-checkers '(go-golint go-unconvert))) (flycheck-ert-with-env `(("GOPATH" . ,(flycheck-ert-resource-filename "language/go"))) (flycheck-ert-should-syntax-check "language/go/src/staticcheck/staticcheck1.go" 'go-mode '(8 6 error "unnecessary assignment to the blank identifier" :checker go-staticcheck :id "S1005") '(12 39 error "calling strings.Replace with n == 0 will return no results, did you mean -1?" :checker go-staticcheck :id "SA1018") '(16 6 error "func unused is unused" :checker go-staticcheck :id "U1000"))))) (flycheck-ert-def-checker-test groovy groovy syntax-error ;; Work around ;; https://github.com/Groovy-Emacs-Modes/groovy-emacs-modes/issues/11 (require 'cl) (flycheck-ert-should-syntax-check "language/groovy.groovy" 'groovy-mode '(2 14 error "unexpected token: {" :checker groovy))) (flycheck-ert-def-checker-test haml haml "haml-error" (flycheck-ert-should-syntax-check "language/haml/haml-error.haml" 'haml-mode '(5 nil error "Inconsistent indentation: 3 spaces used for indentation, but the rest of the document was indented using 2 spaces." :checker haml))) (flycheck-ert-def-checker-test haml haml "ruby-error" (flycheck-ert-should-syntax-check "language/haml/ruby-error.haml" 'haml-mode '(1 nil error "unexpected end-of-input" :checker haml))) (flycheck-ert-def-checker-test handlebars handlebars nil (flycheck-ert-should-syntax-check "language/handlebars.hbs" '(handlebars-mode web-mode) '(2 nil error "Expecting 'ID', 'STRING', 'NUMBER', 'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', got 'INVALID'" :checker handlebars))) (flycheck-ert-def-checker-test haskell-stack-ghc haskell syntax-error (skip-unless (file-exists-p (getenv "HOME"))) (let ((flycheck-disabled-checkers '(haskell-ghc))) (flycheck-ert-should-syntax-check "language/haskell/SyntaxError.hs" 'haskell-mode '(3 1 error "parse error on input `module'" :checker haskell-stack-ghc)))) (flycheck-ert-def-checker-test haskell-stack-ghc haskell type-error (skip-unless (file-exists-p (getenv "HOME"))) (let ((flycheck-disabled-checkers '(haskell-ghc))) (flycheck-ert-should-syntax-check "language/haskell/Error.hs" 'haskell-mode '(4 16 error "* Couldn't match type `Bool' with `[Char]' Expected type: String Actual type: Bool * In the first argument of `putStrLn', namely `True' In the expression: putStrLn True In an equation for `foo': foo = putStrLn True" :checker haskell-stack-ghc)))) (flycheck-ert-def-checker-test (haskell-stack-ghc haskell-hlint) haskell literate (skip-unless (file-exists-p (getenv "HOME"))) (let ((flycheck-disabled-checkers '(haskell-ghc))) (flycheck-ert-should-syntax-check "language/haskell/Literate.lhs" 'haskell-literate-mode '(6 1 warning "Top-level binding with no type signature: foo :: a" :id "-Wmissing-signatures" :checker haskell-stack-ghc)))) (flycheck-ert-def-checker-test (haskell-stack-ghc haskell-hlint) haskell complete-chain (skip-unless (file-exists-p (getenv "HOME"))) (let ((flycheck-disabled-checkers '(haskell-ghc))) (flycheck-ert-should-syntax-check "language/haskell/Warnings.hs" 'haskell-mode '(4 1 warning "Eta reduce Found: spam eggs = map lines eggs Perhaps: spam = map lines" :checker haskell-hlint) '(4 1 warning "Top-level binding with no type signature: spam :: [String] -> [[String]]" :id "-Wmissing-signatures" :checker haskell-stack-ghc) '(7 8 info "Redundant bracket Found: (putStrLn \"hello world\") Perhaps: putStrLn \"hello world\"" :checker haskell-hlint)))) (flycheck-ert-def-checker-test haskell-stack-ghc haskell nonstandard-stack-yaml-file (skip-unless (file-exists-p (getenv "HOME"))) (let* ((flycheck-disabled-checkers '(haskell-ghc)) (proj-dir "language/haskell/stack-project-with-renamed-stack-yaml") (flycheck-ghc-stack-project-file (expand-file-name "stack-nonstandard.yaml" (flycheck-ert-resource-filename proj-dir)))) (flycheck-ert-should-syntax-check (concat proj-dir "/src/Foo.hs") 'haskell-mode))) (flycheck-ert-def-checker-test haskell-ghc haskell syntax-error (let ((flycheck-disabled-checkers '(haskell-stack-ghc))) (flycheck-ert-should-syntax-check "language/haskell/SyntaxError.hs" 'haskell-mode '(3 1 error "parse error on input `module'" :checker haskell-ghc)))) (flycheck-ert-def-checker-test haskell-ghc haskell type-error (let ((flycheck-disabled-checkers '(haskell-stack-ghc))) (flycheck-ert-should-syntax-check "language/haskell/Error.hs" 'haskell-mode '(4 16 error "* Couldn't match type `Bool' with `[Char]' Expected type: String Actual type: Bool * In the first argument of `putStrLn', namely `True' In the expression: putStrLn True In an equation for `foo': foo = putStrLn True" :checker haskell-ghc)))) (flycheck-ert-def-checker-test (haskell-ghc haskell-hlint) haskell literate (let ((flycheck-disabled-checkers '(haskell-stack-ghc))) (flycheck-ert-should-syntax-check "language/haskell/Literate.lhs" 'haskell-literate-mode '(6 1 warning "Top-level binding with no type signature: foo :: a" :id "-Wmissing-signatures" :checker haskell-ghc)))) (flycheck-ert-def-checker-test (haskell-ghc haskell-hlint) haskell complete-chain (let ((flycheck-disabled-checkers '(haskell-stack-ghc))) (flycheck-ert-should-syntax-check "language/haskell/Warnings.hs" 'haskell-mode '(4 1 warning "Eta reduce Found: spam eggs = map lines eggs Perhaps: spam = map lines" :checker haskell-hlint) '(4 1 warning "Top-level binding with no type signature: spam :: [String] -> [[String]]" :id "-Wmissing-signatures" :checker haskell-ghc) '(7 8 info "Redundant bracket Found: (putStrLn \"hello world\") Perhaps: putStrLn \"hello world\"" :checker haskell-hlint)))) (flycheck-ert-def-checker-test html-tidy html nil (flycheck-ert-should-syntax-check "language/html.html" '(html-mode) '(3 1 warning "missing declaration" :checker html-tidy) '(8 5 error " is not recognized!" :checker html-tidy) '(8 5 warning "discarding unexpected " :checker html-tidy))) (defconst flycheck-test-javascript-modes '(js-mode js2-mode js3-mode js2-jsx-mode rjsx-mode)) (when (version<= "25" emacs-version) (add-to-list 'flycheck-test-javascript-modes 'js-jsx-mode)) (flycheck-ert-def-checker-test javascript-jshint javascript syntax-error :tags '(checkstyle-xml) ;; Silence JS2 and JS3 parsers (let ((js2-mode-show-parse-errors nil) (js2-mode-show-strict-warnings nil) (js3-mode-show-parse-errors nil) (inhibit-message t) (flycheck-disabled-checkers '(javascript-eslint javascript-gjslint))) (flycheck-ert-should-syntax-check "language/javascript/syntax-error.js" '(js-mode js2-mode js3-mode rjsx-mode) '(3 1 error "Unrecoverable syntax error. (75% scanned)." :checker javascript-jshint :id "E041") '(3 25 error "Expected an identifier and instead saw ')'." :checker javascript-jshint :id "E030")))) (flycheck-ert-def-checker-test javascript-jshint javascript nil :tags '(checkstyle-xml) (let ((flycheck-jshintrc "jshintrc") (inhibit-message t) (flycheck-disabled-checkers '(javascript-eslint javascript-gjslint))) (flycheck-ert-should-syntax-check "language/javascript/warnings.js" '(js-mode js2-mode js3-mode rjsx-mode) '(4 9 warning "'foo' is defined but never used." :id "W098" :checker javascript-jshint)))) (flycheck-ert-def-checker-test javascript-eslint javascript error (let ((flycheck-disabled-checkers '(javascript-jshint)) (inhibit-message t)) (flycheck-ert-should-syntax-check "language/javascript/syntax-error.js" flycheck-test-javascript-modes '(3 25 error "Parsing error: Unexpected token )" :checker javascript-eslint)))) (flycheck-ert-def-checker-test javascript-eslint javascript warning (let ((flycheck-disabled-checkers '(javascript-jshint)) (inhibit-message t)) (flycheck-ert-should-syntax-check "language/javascript/warnings.js" flycheck-test-javascript-modes '(3 2 warning "Use the function form of 'use strict'." :id "strict" :checker javascript-eslint :end-line 5 :end-column 2) '(4 9 warning "'foo' is assigned a value but never used." :id "no-unused-vars" :checker javascript-eslint :end-line 4 :end-column 12)))) (flycheck-ert-def-checker-test javascript-standard javascript error (let ((flycheck-checker 'javascript-standard) (inhibit-message t)) (flycheck-ert-should-syntax-check "language/javascript/style.js" flycheck-test-javascript-modes '(3 10 error "Missing space before function parentheses." :checker javascript-standard) '(4 1 error "Unexpected tab character." :checker javascript-standard) '(4 1 error "Expected indentation of 2 spaces but found 1 tab." :checker javascript-standard) '(4 2 error "Unexpected var, use let or const instead." :checker javascript-standard) '(4 6 error "'foo' is assigned a value but never used." :checker javascript-standard) '(4 13 error "Strings must use singlequote." :checker javascript-standard) '(4 27 error "Extra semicolon." :checker javascript-standard) '(5 5 error "Extra semicolon." :checker javascript-standard)))) (flycheck-ert-def-checker-test javascript-standard javascript semistandard (let ((flycheck-checker 'javascript-standard) (flycheck-javascript-standard-executable "semistandard") (inhibit-message t)) (flycheck-ert-should-syntax-check "language/javascript/style.js" flycheck-test-javascript-modes '(3 10 error "Missing space before function parentheses." :checker javascript-standard) '(4 1 error "Unexpected tab character." :checker javascript-standard) '(4 1 error "Expected indentation of 2 spaces but found 1 tab." :checker javascript-standard) '(4 2 error "Unexpected var, use let or const instead." :checker javascript-standard) '(4 6 error "'foo' is assigned a value but never used." :checker javascript-standard) '(4 13 error "Strings must use singlequote." :checker javascript-standard)))) (flycheck-ert-def-checker-test json-jsonlint json nil (flycheck-ert-should-syntax-check "language/json.json" 'json-mode '(1 44 error "found: ',' - expected: 'EOF'." :checker json-jsonlint))) (flycheck-ert-def-checker-test json-python-json json nil (let ((flycheck-disabled-checkers '(json-jsonlint))) (flycheck-ert-should-syntax-check "language/json.json" 'json-mode '(1 44 error "Extra data" :checker json-python-json)))) (flycheck-ert-def-checker-test json-jq json nil (let ((flycheck-disabled-checkers '(json-jsonlint json-python-json))) (flycheck-ert-should-syntax-check "language/json.json" 'json-mode '(1 44 error "Expected value before ','" :checker json-jq)))) (flycheck-ert-def-checker-test less less file-error (let* ((candidates (list "no-such-file.less" "npm://no-such-file.less" "no-such-file.less")) (message (string-join candidates ","))) (flycheck-ert-should-syntax-check "language/less/file-error.less" 'less-css-mode `(3 1 error ,(concat "'no-such-file.less' wasn't found. Tried - " message) :checker less)))) (flycheck-ert-def-checker-test less less syntax-error (flycheck-ert-should-syntax-check "language/less/syntax-error.less" 'less-css-mode '(1 1 error "Unrecognised input" :checker less))) (flycheck-ert-def-checker-test llvm-llc llvm nil (flycheck-ert-should-syntax-check "language/llvm.ll" 'llvm-mode '(4 19 error "'%tmp' defined with type 'i32'" :checker llvm-llc))) (flycheck-ert-def-checker-test lua-luacheck lua syntax-error (flycheck-ert-should-syntax-check "language/lua/syntax-error.lua" 'lua-mode '(5 7 error "unfinished string" :id "E011" :checker lua-luacheck))) (flycheck-ert-def-checker-test lua-luacheck lua warnings (flycheck-ert-should-syntax-check "language/lua/warnings.lua" 'lua-mode '(1 1 warning "setting non-standard global variable 'global_var'" :id "W111" :checker lua-luacheck) '(3 16 warning "unused function 'test'" :id "W211" :checker lua-luacheck) '(3 21 warning "unused argument 'arg'" :id "W212" :checker lua-luacheck) '(4 11 warning "variable 'var2' is never set" :id "W221" :checker lua-luacheck))) (flycheck-ert-def-checker-test lua-luacheck lua custom-luacheckrc (let ((flycheck-luacheckrc "custom.luacheckrc")) (flycheck-ert-should-syntax-check "language/lua/warnings.lua" 'lua-mode '(1 1 warning "setting non-standard global variable 'global_var'" :id "W111" :checker lua-luacheck) '(3 16 warning "unused function 'test'" :id "W211" :checker lua-luacheck) '(4 11 warning "variable 'var2' is never set" :id "W221" :checker lua-luacheck)))) (flycheck-ert-def-checker-test lua-luacheck lua custom-standards (let ((flycheck-luacheck-standards '("ngx_lua"))) (flycheck-ert-should-syntax-check "language/lua/ngx_lua.warnings.lua" 'lua-mode '(3 16 warning "unused function 'test'" :id "W211" :checker lua-luacheck) '(3 21 warning "unused argument 'arg'" :id "W212" :checker lua-luacheck) '(4 11 warning "variable 'var2' is never set" :id "W221" :checker lua-luacheck)))) (flycheck-ert-def-checker-test lua lua nil (let ((flycheck-disabled-checkers '(lua-luacheck))) (flycheck-ert-should-syntax-check "language/lua/syntax-error.lua" 'lua-mode '(5 nil error "unfinished string near '\"oh no'" :checker lua)))) (flycheck-ert-def-checker-test opam opam nil (flycheck-ert-should-syntax-check "language/opam.opam" 'tuareg-opam-mode '(0 nil error "Missing field 'maintainer'" :id "23" :checker opam) '(0 nil warning "Missing field 'authors'" :id "25" :checker opam) '(0 nil warning "Missing field 'homepage'" :id "35" :checker opam) '(0 nil warning "Missing field 'bug-reports'" :id "36" :checker opam) '(2 1 error "Invalid field maintainers" :id "3" :checker opam))) (flycheck-ert-def-checker-test (perl perl-perlcritic) perl nil (flycheck-ert-should-syntax-check "language/perl.pl" '(perl-mode cperl-mode) '(6 nil error "Global symbol \"$x\" requires explicit package name (did you forget to declare \"my $x\"?)" :checker perl) '(6 nil error "BEGIN not safe after errors--compilation aborted" :checker perl) '(6 6 error "Glob written as <...> (See page 167 of PBP)" :id "BuiltinFunctions::RequireGlobFunction" :checker perl-perlcritic))) (flycheck-ert-def-checker-test perl perl modules ;; Files that require unlisted modules should fail to check (flycheck-ert-should-syntax-check "language/perl/Script.pl" '(perl-mode cperl-mode) '(3 nil error "Global symbol \"$dependency_a\" requires explicit package name (did you forget to declare \"my $dependency_a\"?)" :checker perl) '(4 nil error "Global symbol \"$dependency_b\" requires explicit package name (did you forget to declare \"my $dependency_b\"?)" :checker perl)) ;; Including those modules should allow them to check (let ((flycheck-perl-include-path '(".")) (flycheck-perl-module-list '("DependencyA"))) (flycheck-ert-should-syntax-check "language/perl/Script.pl" '(perl-mode cperl-mode) '(4 nil error "Global symbol \"$dependency_b\" requires explicit package name (did you forget to declare \"my $dependency_b\"?)" :checker perl))) ;; ;; Multiple modules should be allowed (let ((flycheck-perl-include-path '(".")) (flycheck-perl-module-list '("DependencyA" "DependencyB"))) (flycheck-ert-should-syntax-check "language/perl/Script.pl" '(perl-mode cperl-mode)))) (flycheck-ert-def-checker-test php php syntax-error (when (version<= emacs-version "25") (ert-skip "PHP mode (via CC mode) seems broken on 24.5.")) (flycheck-ert-should-syntax-check "language/php/syntax-error.php" 'php-mode '(8 nil error "Assignments can only happen to writable values" :checker php))) (flycheck-ert-def-checker-test (php php-phpcs php-phpmd) php nil :tags '(phpmd-xml checkstyle-xml) (flycheck-ert-should-syntax-check "language/php/warnings.php" 'php-mode '(1 1 error "Missing file doc comment" :id "PEAR.Commenting.FileComment.Missing" :checker php-phpcs) '(21 nil warning "Avoid unused private fields such as '$FOO'." :id "UnusedPrivateField" :checker php-phpmd) '(21 20 error "Private member variable \"FOO\" must be prefixed with an underscore" :id "PEAR.NamingConventions.ValidVariableName.PrivateNoUnderscore" :checker php-phpcs) '(23 5 error "The open comment tag must be the only content on the line" :id "Generic.Commenting.DocComment.ContentAfterOpen" :checker php-phpcs) '(23 5 error "Doc comment for parameter \"$baz\" missing" :id "PEAR.Commenting.FunctionComment.MissingParamTag" :checker php-phpcs) '(23 9 error "Doc comment short description must be on the first line" :id "Generic.Commenting.DocComment.SpacingBeforeShort" :checker php-phpcs) '(23 29 error "The close comment tag must be the only content on the line" :id "Generic.Commenting.DocComment.ContentBeforeClose" :checker php-phpcs) '(23 29 error "Missing @return tag in function comment" :id "PEAR.Commenting.FunctionComment.MissingReturn" :checker php-phpcs) '(24 nil warning "Avoid unused private methods such as 'bar'." :id "UnusedPrivateMethod" :checker php-phpmd) '(24 nil warning "Avoid unused parameters such as '$baz'." :id "UnusedFormalParameter" :checker php-phpmd) '(24 13 error "Private method name \"A::bar\" must be prefixed with an underscore" :id "PEAR.NamingConventions.ValidFunctionName.PrivateNoUnderscore" :checker php-phpcs) '(26 nil warning "Avoid variables with short names like $i. Configured minimum length is 3." :id "ShortVariable" :checker php-phpmd) '(26 nil warning "Avoid unused local variables such as '$i'." :id "UnusedLocalVariable" :checker php-phpmd) '(26 12 error "TRUE, FALSE and NULL must be lowercase; expected \"false\" but found \"FALSE\"" :id "Generic.PHP.LowerCaseConstant.Found" :checker php-phpcs))) (flycheck-ert-def-checker-test proselint (text markdown) nil ;; Unset LC_ALL which is set to LC_ALL=C for other checkers in ./run.el, ;; because Click, used by ProseLint, when running with python 3 will refuse to ;; work unless an Unicode locale is exported. See: ;; http://click.pocoo.org/5/python3/#python-3-surrogate-handling (let ((flycheck-disabled-checkers '(markdown-markdownlint-cli markdown-mdl))) (flycheck-ert-with-env '(("LC_ALL" . nil)) (flycheck-ert-should-syntax-check "language/text/text.txt" '(text-mode markdown-mode) '(1 7 warning "Substitute 'damn' every time you're inclined to write 'very'; your editor will delete it and the writing will be just as it should be." :id "weasel_words.very" :checker proselint :end-line 1 :end-column 12) '(2 4 warning "Redundancy. Use 'associate' instead of 'associate together'." :id "redundancy.garner" :checker proselint :end-line 3 :end-column 1) '(3 5 warning "Gender bias. Use 'lawyer' instead of 'lady lawyer'." :id "sexism.misc" :checker proselint :end-line 3 :end-column 17))))) (flycheck-ert-def-checker-test processing processing syntax-error (flycheck-ert-should-syntax-check "language/processing/syntax_error/syntax_error.pde" 'processing-mode '(4 2 error "Syntax error, maybe a missing semicolon?" :checker processing))) (flycheck-ert-def-checker-test protobuf-protoc protobuf syntax-error (flycheck-ert-should-syntax-check "language/protobuf/protobuf/syntax-error.proto" 'protobuf-mode '(2 23 error "Missing field number." :checker protobuf-protoc))) (flycheck-ert-def-checker-test protobuf-prototool protobuf warnings (flycheck-ert-should-syntax-check "language/protobuf/prototool/missing_syntax.proto" 'protobuf-mode '(1 1 warning "No syntax specified. Please use 'syntax = \"proto2\";' or 'syntax = \"proto3\";' to specify a syntax version." :checker protobuf-prototool) '(4 3 warning "Expected \"required\", \"optional\", or \"repeated\"." :checker protobuf-prototool))) (flycheck-ert-def-checker-test pug pug syntax-error (flycheck-ert-should-syntax-check "language/pug/pug.pug" 'pug-mode '(2 1 error "unexpected token \"indent\"" :checker pug))) (flycheck-ert-def-checker-test pug pug non-block-or-mixin-at-top-level-of-extended-template-error (flycheck-ert-should-syntax-check "language/pug/foo.pug" 'pug-mode '(9 1 error "Only named blocks and mixins can appear at the top level of an extending template" :checker pug))) (flycheck-ert-def-checker-test pug pug unknown-filter (flycheck-ert-should-syntax-check "language/pug/foo-unknown-filter.pug" 'pug-mode '(1 1 error "unknown filter \":myfilter\"" :checker pug))) (flycheck-ert-def-checker-test pug pug include-extends-error (flycheck-ert-should-syntax-check "language/pug/pug-extends.pug" 'pug-mode '(1 nil error "the \"basedir\" option is required to use includes and extends with \"absolute\" paths" :checker pug))) (flycheck-ert-def-checker-test pug pug type-error (flycheck-ert-should-syntax-check "language/pug/pug-runtime-error.pug" 'pug-mode '(5 nil error "Cannot read property 'bar' of undefined" :checker pug))) ;; N.B. the puppet 4 and 3 tests are mutually exclusive ;; due to one having column and the other not (flycheck-ert-def-checker-test puppet-parser puppet parser-error-puppet-4 (skip-unless (version<= "4" (shell-command-to-string "printf %s \"$(puppet --version)\""))) (flycheck-ert-should-syntax-check "language/puppet/parser-error.pp" 'puppet-mode '(3 9 error "Syntax error at '>'" :checker puppet-parser))) (flycheck-ert-def-checker-test puppet-parser puppet parser-error-puppet-3 (skip-unless (version<= (shell-command-to-string "printf %s \"$(puppet --version)\"") "4")) (flycheck-ert-should-syntax-check "language/puppet/puppet3-parser-error.pp" 'puppet-mode '(4 3 error "Syntax error at 'helloagain'" :checker puppet-parser)) (flycheck-ert-should-syntax-check "language/puppet/puppet3-parser-multiline-error.pp" 'puppet-mode '(4 25 error "Unclosed quote after \"'\" followed by '\\n}\\n...'" :checker puppet-parser))) (flycheck-ert-def-checker-test puppet-lint puppet nil (flycheck-ert-should-syntax-check "language/puppet/warnings.pp" 'puppet-mode '(2 nil error "foo::bar not in autoload module layout (autoloader_layout)" :checker puppet-lint) '(3 nil warning "case statement without a default case (case_without_default)" :checker puppet-lint))) (flycheck-ert-def-checker-test python-flake8 python syntax-error (let ((python-indent-guess-indent-offset nil) ; Silence Python Mode! (flycheck-python-flake8-executable "python3")) (flycheck-ert-should-syntax-check "language/python/syntax-error.py" 'python-mode '(3 7 error "SyntaxError: invalid syntax" :id "E999" :checker python-flake8)))) (flycheck-ert-def-checker-test python-flake8 python nil (let ((flycheck-python-flake8-executable "python3")) (flycheck-ert-should-syntax-check "language/python/test.py" 'python-mode '(5 1 warning "'sys.antigravit' imported but unused" :id "F401" :checker python-flake8) '(7 1 warning "expected 2 blank lines, found 1" :id "E302" :checker python-flake8) '(12 29 warning "unexpected spaces around keyword / parameter equals" :id "E251" :checker python-flake8) '(12 31 warning "unexpected spaces around keyword / parameter equals" :id "E251" :checker python-flake8) '(22 1 error "undefined name 'antigravity'" :id "F821" :checker python-flake8)))) (flycheck-ert-def-checker-test python-pyright python nil (let ((flycheck-disabled-checkers '(python-mypy)) (flycheck-checkers '(python-pyright))) (flycheck-ert-should-syntax-check "language/python/invalid_type.py" 'python-mode '(2 12 error "Expression of type \"str\" cannot be assigned to return type \"int\"\n  \"str\" is incompatible with \"int\"" :checker python-pyright :end-line 2 :end-column 13)))) (flycheck-ert-def-checker-test python-mypy python nil (let ((flycheck-disabled-checkers '(python-flake8)) (flycheck-checkers '(python-mypy)) (flycheck-python-mypy-cache-dir null-device)) (flycheck-ert-should-syntax-check "language/python/invalid_type.py" 'python-mode '(2 12 error "Incompatible return value type (got \"str\", expected \"int\")" :checker python-mypy)))) (flycheck-ert-def-checker-test python-pylint python nil (let ((flycheck-disabled-checkers '(python-flake8 python-mypy)) (flycheck-python-pylint-executable "python3")) (flycheck-ert-should-syntax-check "language/python/test.py" 'python-mode '(1 1 info "Missing module docstring" :id "missing-module-docstring" :checker python-pylint) '(5 1 error "No name 'antigravit' in module 'sys'" :id "no-name-in-module" :checker python-pylint) '(5 1 warning "Unused antigravit imported from sys" :id "unused-import" :checker python-pylint) '(7 1 info "Missing class docstring" :id "missing-class-docstring" :checker python-pylint) '(7 1 warning "Class 'Spam' inherits from object, can be safely removed from bases in python3" :id "useless-object-inheritance" :checker python-pylint) '(9 5 info "Method name \"withEggs\" doesn't conform to snake_case naming style" :id "invalid-name" :checker python-pylint) '(9 5 info "Missing function or method docstring" :id "missing-function-docstring" :checker python-pylint) '(9 5 warning "Method could be a function" :id "no-self-use" :checker python-pylint) '(12 5 info "Missing function or method docstring" :id "missing-function-docstring" :checker python-pylint) '(12 5 warning "Either all return statements in a function should return an expression, or none of them should." :id "inconsistent-return-statements" :checker python-pylint) '(12 5 warning "Method could be a function" :id "no-self-use" :checker python-pylint) '(14 16 error "Module 'sys' has no 'python_version' member" :id "no-member" :checker python-pylint) '(22 1 error "Undefined variable 'antigravity'" :id "undefined-variable" :checker python-pylint)))) (flycheck-ert-def-checker-test python-pylint python no-symbolic-id (let ((flycheck-disabled-checkers '(python-flake8 python-mypy)) (flycheck-pylint-use-symbolic-id nil) (flycheck-python-pylint-executable "python3")) (flycheck-ert-should-syntax-check "language/python/test.py" 'python-mode '(1 1 info "Missing module docstring" :id "C0114" :checker python-pylint) '(5 1 error "No name 'antigravit' in module 'sys'" :id "E0611" :checker python-pylint) '(5 1 warning "Unused antigravit imported from sys" :id "W0611" :checker python-pylint) '(7 1 info "Missing class docstring" :id "C0115" :checker python-pylint) '(7 1 warning "Class 'Spam' inherits from object, can be safely removed from bases in python3" :id "R0205" :checker python-pylint) '(9 5 info "Method name \"withEggs\" doesn't conform to snake_case naming style" :id "C0103" :checker python-pylint) '(9 5 info "Missing function or method docstring" :id "C0116" :checker python-pylint) '(9 5 warning "Method could be a function" :id "R0201" :checker python-pylint) '(12 5 info "Missing function or method docstring" :id "C0116" :checker python-pylint) '(12 5 warning "Either all return statements in a function should return an expression, or none of them should." :id "R1710" :checker python-pylint) '(12 5 warning "Method could be a function" :id "R0201" :checker python-pylint) '(14 16 error "Module 'sys' has no 'python_version' member" :id "E1101" :checker python-pylint) '(22 1 error "Undefined variable 'antigravity'" :id "E0602" :checker python-pylint)))) (flycheck-ert-def-checker-test python-pylint python negative-columns (let ((flycheck-disabled-checkers '(python-flake8 python-mypy)) (python-indent-guess-indent-offset nil) ; Silence Python Mode (flycheck-python-pylint-executable "python3")) (flycheck-ert-should-syntax-check "language/python/gh_1383.py" 'python-mode '(2 1 warning "Unused import sys" :id "unused-import" :checker python-pylint) '(4 1 warning "String statement has no effect" :id "pointless-string-statement" :checker python-pylint)))) (flycheck-ert-def-checker-test python-pycompile python python27 (skip-unless (executable-find "python2")) (let ((flycheck-disabled-checkers '(python-flake8 python-pylint python-mypy)) (flycheck-python-pycompile-executable "python2") (python-indent-guess-indent-offset nil)) (flycheck-ert-should-syntax-check "language/python/syntax-error.py" 'python-mode `(3 nil error "invalid syntax" :checker python-pycompile)))) (flycheck-ert-def-checker-test python-pycompile python has-no-warnings (let ((flycheck-disabled-checkers '(python-flake8 python-pylint python-mypy))) (flycheck-ert-should-syntax-check "language/python/test.py" 'python-mode))) (flycheck-ert-def-checker-test r-lintr r nil ;; Disable caching in lintr tests to make sure that the file is re-checked ;; every time (skip-unless (flycheck-r-has-lintr (flycheck-checker-executable 'r-lintr))) (let ((flycheck-lintr-caching nil)) (flycheck-ert-should-syntax-check "language/r.R" 'R-mode '(1 28 info "Opening curly braces should never go on their own line and should always be followed by a new line." :checker r-lintr) '(1 56 info "Put spaces around all infix operators." :checker r-lintr) '(4 6 warning "Do not use absolute paths." :checker r-lintr) '(7 5 error "unexpected end of input" :checker r-lintr)))) (flycheck-ert-def-checker-test racket racket nil (skip-unless (funcall (flycheck-checker-get 'racket 'predicate))) (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/racket.rkt" 'racket-mode '(4 3 error "read: expected a `)' to close `('" :checker racket)))) (flycheck-ert-def-checker-test rpm-rpmlint rpm nil (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/rpm.spec" '(sh-mode rpm-spec-mode) '(1 nil warning "no-cleaning-of-buildroot %clean" :checker rpm-rpmlint) '(1 nil warning "no-cleaning-of-buildroot %install" :checker rpm-rpmlint) '(1 nil warning "no-buildroot-tag" :checker rpm-rpmlint) '(7 nil error "buildarch-instead-of-exclusivearch-tag x86_64" :checker rpm-rpmlint) '(22 nil warning "macro-in-%changelog %{_bindir}" :checker rpm-rpmlint)))) (flycheck-ert-def-checker-test tcl-nagelfar tcl nil (flycheck-ert-should-syntax-check "language/tcl/test.tcl" 'tcl-mode '(7 nil warning "Expr without braces" :checker tcl-nagelfar) '(8 nil info "Suspicious variable name \"val_${val}\"" :checker tcl-nagelfar) '(9 nil info "Suspicious variable name \"val_${val}\"" :checker tcl-nagelfar) '(12 nil error "Wrong number of arguments \(4\) to \"set\"" :checker tcl-nagelfar))) (flycheck-ert-def-checker-test terraform terraform nil (flycheck-ert-should-syntax-check "language/terraform/terraform/syntax-error.tf" 'terraform-mode '(2 nil error "The \";\" character is not valid. Use newlines to separate arguments and blocks,\nand commas to separate items in collection values." :checker terraform) '(2 nil error "An argument definition must end with a newline." :checker terraform))) (flycheck-ert-def-checker-test terraform-tflint terraform nil (flycheck-ert-should-syntax-check "language/terraform/tflint/error.tf" 'terraform-mode '(2 12 warning "Module source \"git://hashicorp.com/consul.git\" is not pinned" :id "terraform_module_pinned_source" :checker terraform-tflint :end-line 2 :end-column 44) '(7 19 error "\"t1.2xlarge\" is an invalid value as instance_type" :id "aws_instance_invalid_type" :checker terraform-tflint :end-line 7 :end-column 31))) (flycheck-ert-def-checker-test markdown-markdownlint-cli markdown nil (flycheck-ert-should-syntax-check "language/markdown.md" 'markdown-mode '(1 nil error "First line in file should be a top level heading [Context: \"## Second Header First\"]" :id "MD041/first-line-heading/first-line-h1" :checker markdown-markdownlint-cli) '(3 nil error "Multiple consecutive blank lines [Expected: 1; Actual: 2]" :id "MD012/no-multiple-blanks" :checker markdown-markdownlint-cli) '(4 15 error "Trailing spaces [Expected: 0 or 2; Actual: 7]" :id "MD009/no-trailing-spaces" :checker markdown-markdownlint-cli))) (flycheck-ert-def-checker-test markdown-mdl markdown nil (let ((flycheck-disabled-checkers '(markdown-markdownlint-cli))) (flycheck-ert-should-syntax-check "language/markdown.md" 'markdown-mode '(1 nil error "First header should be a top level header" :id "MD002" :checker markdown-mdl) '(3 nil error "Multiple consecutive blank lines" :id "MD012" :checker markdown-mdl) '(4 nil error "Trailing spaces" :id "MD009" :checker markdown-mdl)))) (flycheck-ert-def-checker-test nix nix nil (flycheck-ert-should-syntax-check "language/nix/syntax-error.nix" 'nix-mode '(3 1 error "syntax error, unexpected IN, expecting ';'," :checker nix))) (flycheck-ert-def-checker-test nix-linter nix nil (flycheck-ert-should-syntax-check "language/nix/warnings.nix" 'nix-mode '(1 1 warning "LetInInheritRecset" :id "LetInInheritRecset" :checker nix-linter) '(3 4 warning "Unneeded `rec` on set" :id "UnneededRec" :checker nix-linter))) (ert-deftest flycheck-locate-sphinx-source-directory/not-in-a-sphinx-project () :tags '(language-rst) (flycheck-ert-with-resource-buffer "language/rst/errors.rst" (should-not (flycheck-locate-sphinx-source-directory)))) (ert-deftest flycheck-locate-sphinx-source-directory/in-a-sphinx-project () :tags '(language-rst) (flycheck-ert-with-resource-buffer "language/rst/sphinx/index.rst" (should (string= (flycheck-locate-sphinx-source-directory) (flycheck-ert-resource-filename "language/rst/sphinx/"))))) (flycheck-ert-def-checker-test rst rst nil (flycheck-ert-should-syntax-check "language/rst/errors.rst" 'rst-mode '(8 nil warning "Title underline too short." :checker rst) '(14 nil error "Unexpected section title." :checker rst) '(16 nil error "Unknown target name: \"restructuredtext\"." :checker rst) '(19 nil warning "Title underline too short." :checker rst) '(21 nil error "Unknown target name: \"cool\"." :checker rst) '(26 nil error "Unexpected section title." :checker rst))) (flycheck-ert-def-checker-test rst-sphinx rst nil (flycheck-ert-should-syntax-check "language/rst/sphinx/index.rst" 'rst-mode '(2 nil warning "Title underline too short." :checker rst-sphinx) '(9 nil warning "Unknown target name: \"cool\"." :checker rst-sphinx) '(9 nil warning "'envvar' reference target not found: FOO" :checker rst-sphinx))) (flycheck-ert-def-checker-test rst-sphinx rst not-outside-of-a-sphinx-project (flycheck-ert-with-resource-buffer "language/rst/errors.rst" (rst-mode) (should-not (flycheck-may-use-checker 'rst-sphinx)))) (flycheck-ert-def-checker-test ruby-rubocop ruby syntax-error (flycheck-ert-should-syntax-check "language/ruby/syntax-error.rb" 'ruby-mode '(5 7 error "unexpected token tCONSTANT (Using Ruby 2.4 parser; configure using `TargetRubyVersion` parameter, under `AllCops`)" :id "Lint/Syntax" :checker ruby-rubocop) '(5 24 error "unterminated string meets end of file (Using Ruby 2.4 parser; configure using `TargetRubyVersion` parameter, under `AllCops`)" :id "Lint/Syntax" :checker ruby-rubocop))) (flycheck-ert-def-checker-test ruby-standard ruby syntax-error (let ((flycheck-disabled-checkers '(ruby-rubocop))) (flycheck-ert-should-syntax-check "language/ruby/syntax-error.rb" 'ruby-mode '(5 7 error "unexpected token tCONSTANT (Using Ruby 2.4 parser; configure using `TargetRubyVersion` parameter, under `AllCops`)" :id "Lint/Syntax" :checker ruby-standard) '(5 24 error "unterminated string meets end of file (Using Ruby 2.4 parser; configure using `TargetRubyVersion` parameter, under `AllCops`)" :id "Lint/Syntax" :checker ruby-standard)))) (flycheck-ert-def-checker-test ruby-rubylint ruby syntax-error (ert-skip "Pending: https://github.com/YorickPeterse/ruby-lint/issues/202") (let ((flycheck-disabled-checkers '(ruby-rubocop ruby-reek))) (flycheck-ert-should-syntax-check "language/ruby/syntax-error.rb" 'ruby-mode '(5 7 error "unexpected token tCONSTANT" :checker ruby-rubylint)))) (flycheck-ert-def-checker-test ruby ruby syntax-error (let ((flycheck-disabled-checkers '(ruby-rubocop ruby-reek ruby-rubylint))) (flycheck-ert-should-syntax-check "language/ruby/syntax-error.rb" 'ruby-mode '(4 nil warning "assigned but unused variable - days" :checker ruby) '(5 nil error "syntax error, unexpected constant, expecting end-of-input" :checker ruby)))) (flycheck-ert-def-checker-test ruby-jruby ruby syntax-error (let ((flycheck-disabled-checkers '(ruby-rubocop ruby-reek ruby-rubylint ruby))) (flycheck-ert-should-syntax-check "language/ruby/syntax-error.rb" 'ruby-mode '(5 nil error "syntax error, unexpected tCONSTANT" :checker ruby-jruby)))) (flycheck-ert-def-checker-test (ruby-rubocop ruby-reek ruby-rubylint) ruby with-rubylint (flycheck-ert-should-syntax-check "language/ruby/warnings.rb" 'ruby-mode '(1 1 info "Missing frozen string literal comment." :id "[Correctable] Style/FrozenStringLiteralComment" :checker ruby-rubocop) '(3 nil warning "Person assumes too much for instance variable '@name'" :id "InstanceVariableAssumption" :checker ruby-reek) '(3 1 info "Missing top-level class documentation comment." :id "Style/Documentation" :checker ruby-rubocop) '(5 5 warning "unused local variable arr" :checker ruby-rubylint) '(5 5 warning "Useless assignment to variable - `arr`." :id "Lint/UselessAssignment" :checker ruby-rubocop) '(5 11 info "Use `%i` or `%I` for an array of symbols." :id "[Correctable] Style/SymbolArray" :checker ruby-rubocop) '(6 10 info "Prefer single-quoted strings when you don't need string interpolation or special symbols." :id "[Correctable] Style/StringLiterals" :checker ruby-rubocop) '(10 5 info "the use of then/do is not needed here" :checker ruby-rubylint) '(10 5 info "Use a guard clause (`return unless true`) instead of wrapping the code inside a conditional expression." :id "Style/GuardClause":checker ruby-rubocop) '(10 5 info "Favor modifier `if` usage when having a single-line body. Another good alternative is the usage of control flow `&&`/`||`." :id "[Correctable] Style/IfUnlessModifier" :checker ruby-rubocop) '(10 8 warning "Literal `true` appeared as a condition." :id "Lint/LiteralAsCondition" :checker ruby-rubocop) '(10 13 info "Do not use `then` for multi-line `if`." :id "[Correctable] Style/MultilineIfThen" :checker ruby-rubocop) '(11 7 info "Redundant `return` detected." :id "[Correctable] Style/RedundantReturn" :checker ruby-rubocop) '(11 24 error "undefined instance variable @name" :checker ruby-rubylint) '(16 1 error "wrong number of arguments for 'test' (expected 2..3 but got 0)" :checker ruby-rubylint))) (flycheck-ert-def-checker-test ruby-reek ruby warnings (let ((flycheck-disabled-checkers '(ruby-rubocop ruby-rubylint))) (flycheck-ert-should-syntax-check "language/ruby/warnings.rb" 'ruby-mode '(3 nil warning "Person assumes too much for instance variable '@name'" :id "InstanceVariableAssumption" :checker ruby-reek)))) (flycheck-ert-def-checker-test ruby ruby warnings (let ((flycheck-disabled-checkers '(ruby-rubocop ruby-reek ruby-rubylint))) (flycheck-ert-should-syntax-check "language/ruby/warnings.rb" 'ruby-mode '(5 nil warning "assigned but unused variable - arr" :checker ruby) '(16 nil warning "possibly useless use of == in void context" :checker ruby)))) (flycheck-ert-def-checker-test ruby-jruby ruby nil (let ((flycheck-disabled-checkers '(ruby-rubocop ruby-reek ruby-rubylint ruby))) (flycheck-ert-should-syntax-check "language/ruby/warnings.rb" 'ruby-mode '(16 nil warning "Useless use of == in void context." :checker ruby-jruby)))) (defun flycheck-ert-cargo-clean (manifest-path) "Call `cargo clean` on the manifest at MANIFEST-PATH. The manifest path is relative to `flycheck-test-resources-directory'." ;; `cargo` builds binaries when we call the checker, so we need to start from ;; a clean directory each time we want to test. (call-process "cargo" nil nil nil "clean" "--manifest-path" (expand-file-name manifest-path flycheck-test-resources-directory))) (flycheck-ert-def-checker-test rust-cargo rust warning (let ((flycheck-disabled-checkers '(rust)) (flycheck-rust-crate-type "bin") (flycheck-rust-binary-name "flycheck-test")) (flycheck-ert-cargo-clean "language/rust/flycheck-test/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/warnings.rs" 'rust-mode '(3 4 warning "function is never used: `main`" :checker rust-cargo :id "dead_code" :group 1 :end-line 3 :end-column 8) '(3 4 info "`#[warn(dead_code)]` on by default" :checker rust-cargo :id "dead_code" :group 1 :end-line 3 :end-column 8) '(4 9 warning "unused variable: `x`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 10) '(4 9 info "if this is intentional, prefix it with an underscore: `_x`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 10)))) (flycheck-ert-def-checker-test rust-cargo rust default-target (let ((flycheck-disabled-checkers '(rust)) (flycheck-rust-crate-type nil) (flycheck-rust-binary-name nil)) (flycheck-ert-cargo-clean "language/rust/flycheck-test/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/warnings.rs" 'rust-mode '(3 4 warning "function is never used: `main`" :checker rust-cargo :id "dead_code" :group 1 :end-line 3 :end-column 8) '(3 4 info "`#[warn(dead_code)]` on by default" :checker rust-cargo :id "dead_code" :group 1 :end-line 3 :end-column 8) '(4 9 warning "unused variable: `x`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 10) '(4 9 info "if this is intentional, prefix it with an underscore: `_x`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 10)))) (flycheck-ert-def-checker-test rust-cargo rust lib-main (let ((flycheck-disabled-checkers '(rust)) (flycheck-rust-crate-type "bin") (flycheck-rust-binary-name "lib-main")) (flycheck-ert-should-syntax-check "language/rust/lib-main/src/main.rs" 'rust-mode `(3 12 error "cannot find value `zorglub` in this scope (not found in this scope)" :checker rust-cargo :id "E0425" :filename ,(flycheck-ert-resource-filename "language/rust/lib-main/src/lib.rs") :group 1 :end-line 3 :end-column 19)))) (flycheck-ert-def-checker-test rust-cargo rust conventional-layout (let ((flycheck-disabled-checkers '(rust))) (let ((flycheck-rust-crate-type "lib")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/src/lib.rs" 'rust-mode '(3 4 warning "function is never used: `foo_lib`" :checker rust-cargo :id "dead_code" :group 1 :end-line 3 :end-column 11) '(6 17 warning "unused variable: `foo_lib_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 6 :end-column 29) '(6 17 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 2 :end-line 6 :end-column 29) '(6 17 info "if this is intentional, prefix it with an underscore: `_foo_lib_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 6 :end-column 29))) (let ((flycheck-rust-crate-type "lib")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/src/a.rs" 'rust-mode '(1 4 warning "function is never used: `foo_a`" :checker rust-cargo :id "dead_code" :group 1 :end-line 1 :end-column 9) '(1 4 info "`#[warn(dead_code)]` on by default" :checker rust-cargo :id "dead_code" :group 1 :end-line 1 :end-column 9) '(4 17 warning "unused variable: `foo_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 27) '(4 17 info "if this is intentional, prefix it with an underscore: `_foo_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 27))) (let ((flycheck-rust-crate-type "bin") (flycheck-rust-binary-name "cargo-targets")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/src/main.rs" 'rust-mode '(1 17 warning "unused variable: `foo_main`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 25) '(1 17 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 25) '(1 17 info "if this is intentional, prefix it with an underscore: `_foo_main`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 25) '(4 17 warning "unused variable: `foo_main_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 30) '(4 17 info "if this is intentional, prefix it with an underscore: `_foo_main_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 30))) (let ((flycheck-rust-crate-type "bin") (flycheck-rust-binary-name "a")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/src/bin/a.rs" 'rust-mode '(1 17 warning "unused variable: `foo_bin_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 26) '(1 17 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 26) '(1 17 info "if this is intentional, prefix it with an underscore: `_foo_bin_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 26) '(4 17 warning "unused variable: `foo_bin_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 31) '(4 17 info "if this is intentional, prefix it with an underscore: `_foo_bin_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 31))) (let ((flycheck-rust-crate-type "bench") (flycheck-rust-binary-name "a")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/benches/a.rs" 'rust-mode '(1 17 warning "unused variable: `foo_bench_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 28) '(1 17 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 28) '(1 17 info "if this is intentional, prefix it with an underscore: `_foo_bench_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 28) '(4 17 warning "unused variable: `foo_bench_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 33) '(4 17 info "if this is intentional, prefix it with an underscore: `_foo_bench_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 33))) (let ((flycheck-rust-crate-type "test") (flycheck-rust-binary-name "a")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/tests/a.rs" 'rust-mode '(2 16 warning "unused variable: `foo_test_a_test`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 2 :end-column 31) '(2 16 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 1 :end-line 2 :end-column 31) '(2 16 info "if this is intentional, prefix it with an underscore: `_foo_test_a_test`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 2 :end-column 31) '(4 4 warning "function is never used: `foo_test_a`" :checker rust-cargo :id "dead_code" :group 2 :end-line 4 :end-column 14) '(4 4 info "`#[warn(dead_code)]` on by default" :checker rust-cargo :id "dead_code" :group 2 :end-line 4 :end-column 14))) (let ((flycheck-rust-crate-type "example") (flycheck-rust-binary-name "a")) (flycheck-ert-cargo-clean "language/rust/cargo-targets/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/cargo-targets/examples/a.rs" 'rust-mode '(1 17 warning "unused variable: `foo_ex_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 25) '(1 17 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 25) '(1 17 info "if this is intentional, prefix it with an underscore: `_foo_ex_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 1 :end-column 25) '(4 17 warning "unused variable: `foo_ex_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 30) '(4 17 info "if this is intentional, prefix it with an underscore: `_foo_ex_a_test`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 4 :end-column 30))))) (flycheck-ert-def-checker-test rust-cargo rust workspace-subcrate (let ((flycheck-disabled-checkers '(rust)) (flycheck-rust-crate-type "lib") (flycheck-rust-check-tests t)) (flycheck-ert-cargo-clean "language/rust/workspace/crate1/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/workspace/crate1/src/lib.rs" 'rust-mode '(2 7 warning "unused variable: `a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 2 :end-column 8) '(2 7 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 1 :end-line 2 :end-column 8) '(2 7 info "if this is intentional, prefix it with an underscore: `_a`" :checker rust-cargo :id "unused_variables" :group 1 :end-line 2 :end-column 8)))) (flycheck-ert-def-checker-test rust-cargo rust dev-dependencies (let ((flycheck-disabled-checkers '(rust)) (flycheck-rust-crate-type "lib") (flycheck-rust-check-tests t)) (flycheck-ert-cargo-clean "language/rust/dev-deps/Cargo.toml") (flycheck-ert-should-syntax-check "language/rust/dev-deps/src/lib.rs" 'rust-mode '(2 1 warning "unused `#[macro_use]` import" :checker rust-cargo :id "unused_imports" :group 1 :end-line 2 :end-column 13) '(2 1 info "`#[warn(unused_imports)]` on by default" :checker rust-cargo :id "unused_imports" :group 1 :end-line 2 :end-column 13) '(8 9 warning "unused variable: `foo`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 8 :end-column 12) '(8 9 info "`#[warn(unused_variables)]` on by default" :checker rust-cargo :id "unused_variables" :group 2 :end-line 8 :end-column 12) '(8 9 info "if this is intentional, prefix it with an underscore: `_foo`" :checker rust-cargo :id "unused_variables" :group 2 :end-line 8 :end-column 12)))) (flycheck-ert-def-checker-test rust rust syntax-error (let ((flycheck-disabled-checkers '(rust-cargo))) (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/syntax-error.rs" 'rust-mode '(4 5 error "cannot find value `bla` in this scope (not found in this scope)" :checker rust :id "E0425" :group 1 :end-line 4 :end-column 8)))) (flycheck-ert-def-checker-test rust rust type-error (let ((flycheck-disabled-checkers '(rust-cargo))) (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/multiline-error.rs" 'rust-mode '(7 9 error "mismatched types (expected `u8`, found `i8`)" :checker rust :id "E0308" :group 1 :end-line 7 :end-column 10) '(7 9 info "you can convert an `i8` to `u8` and panic if the converted value wouldn't fit: `i.try_into().unwrap()`" :checker rust :id "E0308" :group 1 :end-line 7 :end-column 10)))) (flycheck-ert-def-checker-test rust rust warning (let ((flycheck-disabled-checkers '(rust-cargo))) (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/warnings.rs" 'rust-mode '(4 9 warning "unused variable: `x`" :checker rust :id "unused_variables" :group 1 :end-line 4 :end-column 10) '(4 9 info "`#[warn(unused_variables)]` on by default" :checker rust :id "unused_variables" :group 1 :end-line 4 :end-column 10) '(4 9 info "if this is intentional, prefix it with an underscore: `_x`" :checker rust :id "unused_variables" :group 1 :end-line 4 :end-column 10)))) (flycheck-ert-def-checker-test rust rust note-and-help (let ((flycheck-disabled-checkers '(rust-cargo))) (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/note-and-help.rs" 'rust-mode '(10 9 info "move occurs because `_x` has type `NonPOD`, which does not implement the `Copy` trait" :checker rust :id "E0382" :group 1 :end-line 10 :end-column 11) '(11 14 info "value moved here" :checker rust :id "E0382" :group 1 :end-line 11 :end-column 16) '(12 14 error "use of moved value: `_x` (value used here after move)" :checker rust :id "E0382" :group 1 :end-line 12 :end-column 16)))) (flycheck-ert-def-checker-test rust rust crate-root-not-set (let ((flycheck-disabled-checkers '(rust-cargo))) (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/importing.rs" 'rust-mode '(1 5 error "failed to resolve: there are too many leading `super` keywords (there are too many leading `super` keywords)" :checker rust :id "E0433" :group 2 :end-line 1 :end-column 10) '(4 24 error "failed to resolve: use of undeclared crate or module `imported` (use of undeclared crate or module `imported`)" :checker rust :id "E0433" :group 3 :end-line 4 :end-column 32)))) (flycheck-ert-def-checker-test rust rust macro-error (let ((flycheck-disabled-checkers '(rust-cargo))) (flycheck-ert-should-syntax-check "language/rust/flycheck-test/src/macro-error.rs" 'rust-mode '(2 13 error "1 positional argument in format string, but no arguments were given" :checker rust :group 1 :end-line 2 :end-column 15)))) (flycheck-ert-def-checker-test sass sass nil (let ((flycheck-disabled-checkers '(sass/scss-sass-lint))) (flycheck-ert-should-syntax-check "language/sass/error.sass" 'sass-mode '(5 nil error "Inconsistent indentation: 3 spaces were used for indentation, but the rest of the document was indented using 2 spaces." :checker sass)))) (flycheck-ert-def-checker-test sass sass warning (let ((flycheck-disabled-checkers '(sass/scss-sass-lint))) (flycheck-ert-should-syntax-check "language/sass/warning.sass" 'sass-mode '(2 nil warning "this is deprecated" :checker sass)))) (flycheck-ert-def-checker-test scala scala nil (flycheck-ert-should-syntax-check "language/scala/syntax-error.scala" 'scala-mode '(3 nil error "identifier expected but '{' found." :checker scala))) (flycheck-ert-def-checker-test scala-scalastyle scala error (let ((flycheck-scalastylerc "scalastyle.xml")) (flycheck-ert-should-syntax-check "language/scala/style-error.scala" 'scala-mode '(6 5 error "Don't use println" :checker scala-scalastyle)))) (flycheck-ert-def-checker-test scala-scalastyle scala warning (let ((flycheck-scalastylerc "scalastyle.xml")) (flycheck-ert-should-syntax-check "language/scala/style-warning.scala" 'scala-mode '(5 9 warning "Redundant braces after class definition" :checker scala-scalastyle)))) (defvar geiser-impl--implementation) (defun flycheck/chicken-mode () "Enable Scheme and Geiser mode for Chicken scheme." (interactive) (scheme-mode) (setq-local geiser-impl--implementation 'chicken) (geiser-mode)) (flycheck-ert-def-checker-test scheme-chicken scheme error-no-line-number (skip-unless (version<= "25.1" emacs-version)) (flycheck-ert-should-syntax-check "language/chicken/error-no-line-number.scm" 'flycheck/chicken-mode '(0 nil error "(cddr) during expansion of (for-each ...) - bad argument type: ()\n\n\tCall history:\n\n\t\t (##core#begin (for-each))\n\t\t (for-each)\t<--" :checker scheme-chicken))) (flycheck-ert-def-checker-test scheme-chicken scheme syntax-error (skip-unless (version<= "25.1" emacs-version)) (flycheck-ert-should-syntax-check "language/chicken/syntax-error.scm" 'flycheck/chicken-mode '(1 nil error "not enough arguments\n\n\t(define)\n\n\tExpansion history:\n\n\t\t (##core#begin (define))\n\t\t (define)\t<--" :checker scheme-chicken))) (flycheck-ert-def-checker-test scheme-chicken scheme syntax-error-no-line-number (skip-unless (version<= "25.1" emacs-version)) (flycheck-ert-should-syntax-check "language/chicken/syntax-error-no-line-number.scm" 'flycheck/chicken-mode '(0 nil error "illegal atomic form\n\n\t()\n\n\tExpansion history:\n\n\t\t (##core#begin ())\t<--" :checker scheme-chicken))) (flycheck-ert-def-checker-test scheme-chicken scheme syntax-read-error (skip-unless (version<= "25.1" emacs-version)) (flycheck-ert-should-syntax-check "language/chicken/syntax-read-error.scm" 'flycheck/chicken-mode '(1 nil error "invalid sharp-sign read syntax: #\\n" :checker scheme-chicken))) (flycheck-ert-def-checker-test scss-lint scss nil (let ((flycheck-scss-lintrc "scss-lint.yml")) (flycheck-ert-should-syntax-check "language/scss/lint-error.scss" 'scss-mode '(1 1 error "Avoid using id selectors" :checker scss-lint :id "IdSelector") '(3 16 warning "Color `red` should be written in hexadecimal form as `#ff0000`" :checker scss-lint :id "ColorKeyword")))) (flycheck-ert-def-checker-test scss-lint scss syntax-error (flycheck-ert-should-syntax-check "language/scss/error.scss" 'scss-mode '(3 1 error "Syntax Error: Invalid CSS after \"... c olor: red\": expected \"{\", was \";\"" :checker scss-lint :id "Syntax"))) (flycheck-ert-def-checker-test scss scss nil (let ((flycheck-disabled-checkers '(scss-lint scss-stylelint sass/scss-sass-lint))) (flycheck-ert-should-syntax-check "language/scss/error.scss" 'scss-mode '(3 nil error "Invalid CSS after \"... c olor: red\": expected \"{\", was \";\"" :checker scss)))) (flycheck-ert-def-checker-test scss scss warning (let ((flycheck-disabled-checkers '(scss-lint scss-stylelint sass/scss-sass-lint))) (flycheck-ert-should-syntax-check "language/scss/warning.scss" 'scss-mode '(2 nil warning ".container is deprecated" :checker scss)))) (flycheck-ert-def-checker-test sh-bash (sh sh-bash) nil (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/sh/bash-syntax-error.bash" 'sh-mode '(5 nil error "syntax error near unexpected token `fi'" :checker sh-bash) '(5 nil error "`fi'" :checker sh-bash)))) (flycheck-ert-def-checker-test sh-posix-dash (sh sh-posix) nil (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/sh/posix-syntax-error.sh" 'sh-mode '(3 nil error "Syntax error: \"(\" unexpected" :checker sh-posix-dash)))) (flycheck-ert-def-checker-test sh-posix-bash (sh sh-posix) nil (let ((flycheck-disabled-checkers '(sh-posix-dash)) (inhibit-message t)) (flycheck-ert-should-syntax-check "language/sh/posix-syntax-error.sh" 'sh-mode '(3 nil error "syntax error near unexpected token `('" :checker sh-posix-bash) '(3 nil error "`cat <(echo blah)'" :checker sh-posix-bash)))) (flycheck-ert-def-checker-test sh-zsh (sh sh-zsh) nil (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/sh/zsh-syntax-error.zsh" 'sh-mode '(5 nil error "parse error near `fi'" :checker sh-zsh)))) (flycheck-ert-def-checker-test sh-shellcheck sh nil :tags '(checkstyle-xml) (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/sh/shellcheck.sh" 'sh-mode '(2 5 warning "Tilde does not expand in quotes. Use $HOME." :checker sh-shellcheck :id "SC2088") '(3 7 error "Double quote array expansions to avoid re-splitting elements." :checker sh-shellcheck :id "SC2068") '(4 8 warning "Declare and assign separately to avoid masking return values." :checker sh-shellcheck :id "SC2155") '(4 11 info "Use $(...) notation instead of legacy backticked `...`." :checker sh-shellcheck :id "SC2006") '(4 12 info "which is non-standard. Use builtin 'command -v' instead." :checker sh-shellcheck :id "SC2230")))) (flycheck-ert-def-checker-test slim slim nil (flycheck-ert-should-syntax-check "language/slim.slim" 'slim-mode `(2 1 error "Unexpected indentation" :checker slim))) (flycheck-ert-def-checker-test sqlint sql nil (flycheck-ert-should-syntax-check "language/sql.sql" 'sql-mode `(1 15 error "unterminated quoted string at or near \"';\n \"" :checker sql-sqlint))) (flycheck-ert-def-checker-test systemd-analyze systemd nil (flycheck-ert-should-syntax-check "language/systemd-analyze-test.service" 'systemd-mode '(0 nil error "Service has no ExecStart=, ExecStop=, or SuccessAction=. Refusing." :checker systemd-analyze) '(3 nil error "Invalid URL, ignoring: foo://bar" :checker systemd-analyze) '(5 nil error "ListenStream= references a path below legacy directory /var/run/, updating /var/run/dbus/system_bus_socket → /run/dbus/system_bus_socket; please update the unit file accordingly." :filename "/lib/systemd/system/dbus.socket" :checker systemd-analyze) '(6 nil error "Unknown key name 'ExecSmart' in section 'Service', ignoring." :checker systemd-analyze) '(8 nil error "Unknown section 'Dog'. Ignoring." :checker systemd-analyze))) (flycheck-ert-def-checker-test tex-chktex (tex latex) nil (flycheck-ert-should-syntax-check "language/tex.tex" 'latex-mode '(5 29 warning "Intersentence spacing (`\\@') should perhaps be used." :id "13" :checker tex-chktex))) (flycheck-ert-def-checker-test tex-lacheck (tex latex) nil (let ((flycheck-disabled-checkers '(tex-chktex))) (flycheck-ert-should-syntax-check "language/tex.tex" 'latex-mode '(5 nil warning "missing `\\@' before `.' in \"GNU.\"" :checker tex-lacheck) '(7 nil warning "possible unwanted space at \"{\"" :checker tex-lacheck)))) (flycheck-ert-def-checker-test texinfo texinfo nil (flycheck-ert-should-syntax-check "language/texinfo.texi" 'texinfo-mode '(3 nil warning "@settitle missing argument" :checker texinfo) '(7 nil error "unknown command `bold'" :checker texinfo) '(7 nil error "misplaced {" :checker texinfo) '(7 nil error "misplaced }" :checker texinfo) '(9 nil warning "printindex before document beginning: @printindex cp" :checker texinfo))) (flycheck-ert-def-checker-test textlint (text markdown) nil (let ((flycheck-disabled-checkers '(proselint markdown-markdownlint-cli markdown-mdl)) (flycheck-textlint-config "language/text/textlintrc.json")) (flycheck-ert-should-syntax-check "language/text/text.txt" '(text-mode markdown-mode) '(1 7 error "\"very\" is a weasel word and can weaken meaning" :id "write-good" :checker textlint)))) (flycheck-ert-def-checker-test typescript-tslint typescript nil (let ((flycheck-disabled-checkers '(javascript-eslint))) (flycheck-ert-should-syntax-check "language/typescript/sample.ts" 'typescript-mode '(2 23 warning "Module 'chai' is not listed as dependency in package.json" :checker typescript-tslint :id "no-implicit-dependencies" :end-line 2 :end-column 29) '(5 3 warning "Forbidden 'var' keyword, use 'let' or 'const' instead" :checker typescript-tslint :id "no-var-keyword" :end-line 5 :end-column 6) '(6 15 warning "Missing semicolon" :checker typescript-tslint :id "semicolon" :end-line 6 :end-column 15)))) (flycheck-ert-def-checker-test verilog-verilator verilog error (flycheck-ert-should-syntax-check "language/verilog/verilator_error.v" 'verilog-mode '(4 nil error "Unsupported: $fopen with multichannel descriptor. Add ,\"w\" as second argument to open a file descriptor." :checker verilog-verilator))) (flycheck-ert-def-checker-test verilog-verilator verilog warning (flycheck-ert-should-syntax-check "language/verilog/verilator_warning.v" 'verilog-mode '(2 nil warning "Signal is not driven, nor used: 'val'" :checker verilog-verilator))) (flycheck-ert-def-checker-test vhdl-ghdl vhdl error (flycheck-ert-should-syntax-check "language/vhdl.vhd" 'vhdl-mode '(4 1 error "';' is expected instead of ''" :checker vhdl-ghdl))) (flycheck-ert-def-checker-test xml-xmlstarlet xml nil (let ((inhibit-message t)) (flycheck-ert-should-syntax-check "language/xml.xml" 'nxml-mode '(4 10 error "Opening and ending tag mismatch: spam line 3 and with" :checker xml-xmlstarlet)))) (flycheck-ert-def-checker-test xml-xmllint xml nil (let ((flycheck-disabled-checkers '(xml-xmlstarlet)) (inhibit-message t)) (flycheck-ert-should-syntax-check "language/xml.xml" 'nxml-mode '(4 nil error "parser error : Opening and ending tag mismatch: spam line 3 and with" :checker xml-xmllint) '(5 nil error "parser error : Extra content at the end of the document" :checker xml-xmllint)))) (flycheck-ert-def-checker-test yaml-jsyaml yaml nil (flycheck-ert-should-syntax-check "language/yaml.yaml" 'yaml-mode '(4 5 error "bad indentation of a mapping entry" :checker yaml-jsyaml))) (flycheck-ert-def-checker-test yaml-ruby yaml nil (let ((flycheck-disabled-checkers '(yaml-jsyaml))) (flycheck-ert-should-syntax-check "language/yaml.yaml" 'yaml-mode '(4 5 error "mapping values are not allowed in this context" :checker yaml-ruby)))) (flycheck-ert-def-checker-test yaml-yamllint yaml nil (let ((flycheck-disabled-checkers '(yaml-yamlyaml))) (flycheck-ert-should-syntax-check "language/yaml.yaml" 'yaml-mode '(3 1 warning "missing document start "---" (document-start)" :checker yaml-yamllint)) (flycheck-ert-should-syntax-check "language/yaml.yaml" 'yaml-mode '(4 5 error "syntax error: mapping values are not allowed here" :checker yaml-yamllint)))) (flycheck-ert-def-checker-test jsonnet jsonnet nil (flycheck-ert-should-syntax-check "language/jsonnet/static_error.jsonnet" 'jsonnet-mode '(1 23 "Not a unary operator: =" :checker jsonnet))) (flycheck-ert-def-checker-test jsonnet jsonnet nil (flycheck-ert-should-syntax-check "language/jsonnet/runtime_error.jsonnet" 'jsonnet-mode '(2 6 "Field does not exist: flat" :checker jsonnet :end-line 2 :end-column 14))) (flycheck-ert-initialize flycheck-test-resources-directory) (provide 'flycheck-test) ;; Local Variables: ;; coding: utf-8 ;; indent-tabs-mode: nil ;; End: ;;; flycheck-test.el ends here