view .elisp/settings/50.compilation-tweaks.el @ 478:6bcdbe7b8e42

emacs: fix up hg test output regular expressions Includes some unit tests cribbed from compilation-mode's own tests.
author Augie Fackler <raf@durin42.com>
date Wed, 20 Feb 2019 16:27:47 -0500
parents b0264224e2ec
children
line wrap: on
line source

(require 'compile)

(setq af--hg-test-traceback "^\\+  File ['\"]\\([^'\"]+\\)['\"], line \\([0-9]+\\),")

(setq compilation-error-regexp-alist-alist
  (cons `(mercurial-test-output-tb ,af--hg-test-traceback 1 2)
        (assq-delete-all 'mercurial-test-output-tb
                         compilation-error-regexp-alist-alist)))

(setq af--hg-check-code-error-re "  \\([^:\n]+\\):\\([0-9]+\\):$")

(setq compilation-error-regexp-alist-alist
  (cons `(mercurial-check-code-output ,af--hg-check-code-error-re 1 2)
        (assq-delete-all 'mercurial-check-code-output
                          compilation-error-regexp-alist-alist)))

(add-to-list 'compilation-error-regexp-alist 'mercurial-test-output-tb)
(add-to-list 'compilation-error-regexp-alist 'mercurial-check-code-output)

;; to debug:
;;(setq compilation-error-regexp-alist '(mercurial-check-code-output
;;                                       mercurial-test-output-tb))


;; stolen from compile-tests.el
(defun af--compile--test-error-line (test)
  (erase-buffer)
  (setq compilation-locs (make-hash-table))
  (insert (car test))
  (compilation-parse-errors (point-min) (point-max))
  (let ((msg (get-text-property (nth 1 test) 'compilation-message)))
    (should msg)
    (let ((loc (compilation--message->loc msg))
          (col  (nth 2 test))
          (line (nth 3 test))
          (file (nth 4 test))
          (type (nth 5 test))
          end-col end-line)
      (if (consp col)
          (setq end-col (cdr col) col (car col)))
      (if (consp line)
          (setq end-line (cdr line) line (car line)))
      (should (equal (compilation--loc->col loc) col))
      (should (equal (compilation--loc->line loc) line))
      (when file
        (should (equal (caar (compilation--loc->file-struct loc)) file)))
      (when end-col
        (should (equal (car (cadr (nth 2 (compilation--loc->file-struct loc))))
                       end-col)))
      (should (equal (car (nth 2 (compilation--loc->file-struct loc)))
                     (or end-line line)))
      (when type
        (should (equal type (compilation--message->type msg)))))
    msg))

(defvar af--compile-tests--test-regexps-data
  ;; The computed column numbers are zero-indexed, so subtract 1 from
  ;; what's reported in the string.  The end column numbers are for
  ;; the character after, so it matches what's reported in the string.
  '(;;hg test-check-code
    ("+  contrib/debugshell.py:37:" 1 nil 37 "contrib/debugshell.py")
    ("+    File \"/tmp/hg/mercurial/commands.py\", line 3115, in help_"
     1 nil 3115 "/tmp/hg/mercurial/commands.py")
    ))

(require 'ert)
(ert-deftest af--hg-error-cases ()
  "Test hg-specific compilation-mode regular expressions"
  (with-temp-buffer
    (font-lock-mode -1)
    (mapc #'af--compile--test-error-line af--compile-tests--test-regexps-data)))

;; To run tests:
;;
;; emacs -batch -l .elisp/settings/50.compilation-tweaks.el -f ert-run-tests-batch-and-exit