2010-10-02 21:23:27 +00:00
|
|
|
|
;;;; org-test.el --- Tests for Org-mode
|
|
|
|
|
|
2014-01-07 13:18:17 +00:00
|
|
|
|
;; Copyright (c) 2010-2014 Sebastian Rose, Eric Schulte
|
2010-10-02 21:23:27 +00:00
|
|
|
|
;; Authors:
|
|
|
|
|
;; Sebastian Rose, Hannover, Germany, sebastian_rose gmx de
|
2010-10-03 16:45:07 +00:00
|
|
|
|
;; Eric Schulte, Santa Fe, New Mexico, USA, schulte.eric gmail com
|
2011-09-18 08:35:50 +00:00
|
|
|
|
;; David Maus, Brunswick, Germany, dmaus ictsoc de
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
|
|
|
|
;; Released under the GNU General Public License version 3
|
|
|
|
|
;; see: http://www.gnu.org/licenses/gpl-3.0.html
|
|
|
|
|
|
2011-09-18 08:35:50 +00:00
|
|
|
|
;; Definition of `special-mode' copied from Emacs23's simple.el to be
|
|
|
|
|
;; provide a testing environment for Emacs22.
|
|
|
|
|
|
2010-10-02 21:23:27 +00:00
|
|
|
|
;;;; Comments:
|
|
|
|
|
|
|
|
|
|
;; Interactive testing for Org mode.
|
|
|
|
|
|
2010-10-03 16:45:07 +00:00
|
|
|
|
;; The heart of all this is the commands `org-test-current-defun'. If
|
|
|
|
|
;; called while in a `defun' all ert tests with names matching the
|
|
|
|
|
;; name of the function are run.
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2011-09-12 15:50:28 +00:00
|
|
|
|
;;; Test Development
|
|
|
|
|
;; For test development purposes a number of navigation and test
|
|
|
|
|
;; function construction routines are available as a git submodule
|
|
|
|
|
;; (jump.el)
|
|
|
|
|
;; Install with...
|
|
|
|
|
;; $ git submodule init
|
|
|
|
|
;; $ git submodule update
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;;; Code:
|
2013-03-13 10:23:56 +00:00
|
|
|
|
|
|
|
|
|
;;; Ob constants
|
|
|
|
|
|
|
|
|
|
(defconst org-test-file-ob-anchor
|
|
|
|
|
"94839181-184f-4ff4-a72f-94214df6f5ba")
|
|
|
|
|
|
|
|
|
|
(defconst org-test-link-in-heading-file-ob-anchor
|
|
|
|
|
"a8b1d111-eca8-49f0-8930-56d4f0875155")
|
2012-03-19 20:38:12 +00:00
|
|
|
|
|
2013-05-19 07:20:17 +00:00
|
|
|
|
(unless (and (boundp 'org-batch-test) org-batch-test)
|
|
|
|
|
(let* ((org-test-dir (expand-file-name
|
|
|
|
|
(file-name-directory
|
|
|
|
|
(or load-file-name buffer-file-name))))
|
|
|
|
|
(org-lisp-dir (expand-file-name
|
|
|
|
|
(concat org-test-dir "../lisp"))))
|
|
|
|
|
|
|
|
|
|
(unless (featurep 'org)
|
|
|
|
|
(setq load-path (cons org-lisp-dir load-path))
|
|
|
|
|
(require 'org)
|
|
|
|
|
(require 'org-id)
|
|
|
|
|
(require 'ox)
|
|
|
|
|
(org-babel-do-load-languages
|
|
|
|
|
'org-babel-load-languages '((sh . t) (org . t))))
|
|
|
|
|
|
|
|
|
|
(let* ((load-path (cons
|
|
|
|
|
org-test-dir
|
|
|
|
|
(cons
|
|
|
|
|
(expand-file-name "jump" org-test-dir)
|
|
|
|
|
load-path))))
|
|
|
|
|
(require 'cl)
|
|
|
|
|
(when (= emacs-major-version 22)
|
|
|
|
|
(defvar special-mode-map
|
|
|
|
|
(let ((map (make-sparse-keymap)))
|
|
|
|
|
(suppress-keymap map)
|
|
|
|
|
(define-key map "q" 'quit-window)
|
|
|
|
|
(define-key map " " 'scroll-up)
|
|
|
|
|
(define-key map "\C-?" 'scroll-down)
|
|
|
|
|
(define-key map "?" 'describe-mode)
|
|
|
|
|
(define-key map "h" 'describe-mode)
|
|
|
|
|
(define-key map ">" 'end-of-buffer)
|
|
|
|
|
(define-key map "<" 'beginning-of-buffer)
|
|
|
|
|
(define-key map "g" 'revert-buffer)
|
|
|
|
|
(define-key map "z" 'kill-this-buffer)
|
|
|
|
|
map))
|
|
|
|
|
|
|
|
|
|
(put 'special-mode 'mode-class 'special)
|
|
|
|
|
(define-derived-mode special-mode nil "Special"
|
|
|
|
|
"Parent major mode from which special major modes should inherit."
|
|
|
|
|
(setq buffer-read-only t)))
|
|
|
|
|
(require 'ert)
|
|
|
|
|
(require 'ert-x)
|
|
|
|
|
(when (file-exists-p
|
|
|
|
|
(expand-file-name "jump/jump.el" org-test-dir))
|
|
|
|
|
(require 'jump)
|
|
|
|
|
(require 'which-func)))))
|
2011-09-09 20:21:06 +00:00
|
|
|
|
|
2010-10-02 21:23:27 +00:00
|
|
|
|
(defconst org-test-default-test-file-name "tests.el"
|
|
|
|
|
"For each defun a separate file with tests may be defined.
|
|
|
|
|
tests.el is the fallback or default if you like.")
|
|
|
|
|
|
|
|
|
|
(defconst org-test-default-directory-name "testing"
|
|
|
|
|
"Basename or the directory where the tests live.
|
|
|
|
|
org-test searches this directory up the directory tree.")
|
|
|
|
|
|
2010-10-03 16:45:07 +00:00
|
|
|
|
(defconst org-test-dir
|
|
|
|
|
(expand-file-name (file-name-directory (or load-file-name buffer-file-name))))
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-10-04 00:44:10 +00:00
|
|
|
|
(defconst org-base-dir
|
|
|
|
|
(expand-file-name ".." org-test-dir))
|
|
|
|
|
|
2010-10-05 01:36:39 +00:00
|
|
|
|
(defconst org-test-example-dir
|
|
|
|
|
(expand-file-name "examples" org-test-dir))
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-10-05 01:36:39 +00:00
|
|
|
|
(defconst org-test-file
|
|
|
|
|
(expand-file-name "normal.org" org-test-example-dir))
|
|
|
|
|
|
2010-10-05 02:07:51 +00:00
|
|
|
|
(defconst org-test-no-heading-file
|
|
|
|
|
(expand-file-name "no-heading.org" org-test-example-dir))
|
2010-10-05 01:36:39 +00:00
|
|
|
|
|
|
|
|
|
(defconst org-test-link-in-heading-file
|
|
|
|
|
(expand-file-name "link-in-heading.org" org-test-dir))
|
2010-10-04 14:29:00 +00:00
|
|
|
|
|
2013-05-19 07:20:17 +00:00
|
|
|
|
(defconst org-id-locations-file
|
|
|
|
|
(expand-file-name ".test-org-id-locations" org-test-dir))
|
|
|
|
|
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-10-03 16:45:07 +00:00
|
|
|
|
;;; Functions for writing tests
|
2011-11-13 19:30:25 +00:00
|
|
|
|
(put 'missing-test-dependency
|
|
|
|
|
'error-conditions
|
|
|
|
|
'(error missing-test-dependency))
|
|
|
|
|
|
2011-09-21 22:34:43 +00:00
|
|
|
|
(defun org-test-for-executable (exe)
|
|
|
|
|
"Throw an error if EXE is not available.
|
|
|
|
|
This can be used at the top of code-block-language specific test
|
|
|
|
|
files to avoid loading the file on systems without the
|
|
|
|
|
executable."
|
2011-09-26 12:16:55 +00:00
|
|
|
|
(unless (reduce
|
|
|
|
|
(lambda (acc dir)
|
|
|
|
|
(or acc (file-exists-p (expand-file-name exe dir))))
|
|
|
|
|
exec-path :initial-value nil)
|
2011-11-13 19:30:25 +00:00
|
|
|
|
(signal 'missing-test-dependency (list exe))))
|
2011-09-21 22:34:43 +00:00
|
|
|
|
|
2010-10-02 21:23:27 +00:00
|
|
|
|
(defun org-test-buffer (&optional file)
|
|
|
|
|
"TODO: Setup and return a buffer to work with.
|
|
|
|
|
If file is non-nil insert it's contents in there.")
|
|
|
|
|
|
|
|
|
|
(defun org-test-compare-with-file (&optional file)
|
|
|
|
|
"TODO: Compare the contents of the test buffer with FILE.
|
|
|
|
|
If file is not given, search for a file named after the test
|
|
|
|
|
currently executed.")
|
|
|
|
|
|
2010-10-06 16:23:50 +00:00
|
|
|
|
(defmacro org-test-at-id (id &rest body)
|
|
|
|
|
"Run body after placing the point in the headline identified by ID."
|
|
|
|
|
(declare (indent 1))
|
|
|
|
|
`(let* ((id-location (org-id-find ,id))
|
|
|
|
|
(id-file (car id-location))
|
|
|
|
|
(visited-p (get-file-buffer id-file))
|
|
|
|
|
to-be-removed)
|
2013-01-27 23:09:58 +00:00
|
|
|
|
(unwind-protect
|
|
|
|
|
(save-window-excursion
|
|
|
|
|
(save-match-data
|
|
|
|
|
(org-id-goto ,id)
|
|
|
|
|
(setq to-be-removed (current-buffer))
|
|
|
|
|
(condition-case nil
|
|
|
|
|
(progn
|
|
|
|
|
(org-show-subtree)
|
|
|
|
|
(org-show-block-all))
|
|
|
|
|
(error nil))
|
|
|
|
|
(save-restriction ,@body)))
|
|
|
|
|
(unless (or visited-p (not to-be-removed))
|
|
|
|
|
(kill-buffer to-be-removed)))))
|
2012-01-11 17:11:15 +00:00
|
|
|
|
(def-edebug-spec org-test-at-id (form body))
|
2010-10-06 16:23:50 +00:00
|
|
|
|
|
2010-10-04 14:06:16 +00:00
|
|
|
|
(defmacro org-test-in-example-file (file &rest body)
|
2010-10-03 16:45:07 +00:00
|
|
|
|
"Execute body in the Org-mode example file."
|
2010-10-04 14:06:16 +00:00
|
|
|
|
(declare (indent 1))
|
2010-10-05 01:36:39 +00:00
|
|
|
|
`(let* ((my-file (or ,file org-test-file))
|
2010-10-04 14:29:00 +00:00
|
|
|
|
(visited-p (get-file-buffer my-file))
|
|
|
|
|
to-be-removed)
|
2010-10-03 16:45:07 +00:00
|
|
|
|
(save-window-excursion
|
|
|
|
|
(save-match-data
|
2010-10-04 14:29:00 +00:00
|
|
|
|
(find-file my-file)
|
2011-10-11 07:07:27 +00:00
|
|
|
|
(unless (eq major-mode 'org-mode)
|
2011-09-25 07:26:50 +00:00
|
|
|
|
(org-mode))
|
2010-10-03 16:45:07 +00:00
|
|
|
|
(setq to-be-removed (current-buffer))
|
|
|
|
|
(goto-char (point-min))
|
2010-10-04 14:29:00 +00:00
|
|
|
|
(condition-case nil
|
|
|
|
|
(progn
|
|
|
|
|
(outline-next-visible-heading 1)
|
|
|
|
|
(org-show-subtree)
|
|
|
|
|
(org-show-block-all))
|
|
|
|
|
(error nil))
|
2010-10-06 16:23:50 +00:00
|
|
|
|
(save-restriction ,@body)))
|
2010-10-03 16:45:07 +00:00
|
|
|
|
(unless visited-p
|
|
|
|
|
(kill-buffer to-be-removed))))
|
2012-03-19 20:38:12 +00:00
|
|
|
|
(def-edebug-spec org-test-in-example-file (form body))
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-10-04 14:06:16 +00:00
|
|
|
|
(defmacro org-test-at-marker (file marker &rest body)
|
|
|
|
|
"Run body after placing the point at MARKER in FILE.
|
|
|
|
|
Note the uuidgen command-line command can be useful for
|
|
|
|
|
generating unique markers for insertion as anchors into org
|
|
|
|
|
files."
|
|
|
|
|
(declare (indent 2))
|
|
|
|
|
`(org-test-in-example-file ,file
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(re-search-forward (regexp-quote ,marker))
|
|
|
|
|
,@body))
|
2011-11-18 18:29:47 +00:00
|
|
|
|
(def-edebug-spec org-test-at-marker (form form body))
|
2010-10-04 14:06:16 +00:00
|
|
|
|
|
2011-09-19 16:01:32 +00:00
|
|
|
|
(defmacro org-test-with-temp-text (text &rest body)
|
|
|
|
|
"Run body in a temporary buffer with Org-mode as the active
|
|
|
|
|
mode holding TEXT. If the string \"<point>\" appears in TEXT
|
2011-09-23 21:49:31 +00:00
|
|
|
|
then remove it and place the point there before running BODY,
|
|
|
|
|
otherwise place the point at the beginning of the inserted text."
|
2011-09-19 16:01:32 +00:00
|
|
|
|
(declare (indent 1))
|
2013-11-17 20:31:03 +00:00
|
|
|
|
`(let ((inside-text (if (stringp ,text) ,text (eval ,text))))
|
|
|
|
|
(with-temp-buffer
|
2011-09-20 15:01:11 +00:00
|
|
|
|
(org-mode)
|
2013-11-17 20:31:03 +00:00
|
|
|
|
(let ((point (string-match (regexp-quote "<point>") inside-text)))
|
2011-09-20 15:01:11 +00:00
|
|
|
|
(if point
|
2013-11-17 20:31:03 +00:00
|
|
|
|
(progn (insert (replace-match "" nil nil inside-text))
|
|
|
|
|
(goto-char (match-beginning 0)))
|
|
|
|
|
(progn (insert inside-text)
|
|
|
|
|
(goto-char (point-min)))))
|
2012-12-15 07:00:30 +00:00
|
|
|
|
,@body)))
|
2011-11-18 18:29:47 +00:00
|
|
|
|
(def-edebug-spec org-test-with-temp-text (form body))
|
|
|
|
|
|
|
|
|
|
(defmacro org-test-with-temp-text-in-file (text &rest body)
|
|
|
|
|
"Run body in a temporary file buffer with Org-mode as the active mode."
|
|
|
|
|
(declare (indent 1))
|
2013-11-17 20:31:03 +00:00
|
|
|
|
(let ((results (gensym)))
|
|
|
|
|
`(let ((file (make-temp-file "org-test"))
|
|
|
|
|
(kill-buffer-query-functions nil)
|
|
|
|
|
(inside-text (if (stringp ,text) ,text (eval ,text)))
|
|
|
|
|
,results)
|
|
|
|
|
(with-temp-file file (insert inside-text))
|
|
|
|
|
(find-file file)
|
2011-11-18 18:29:47 +00:00
|
|
|
|
(org-mode)
|
2012-12-15 07:49:23 +00:00
|
|
|
|
(setq ,results (progn ,@body))
|
2012-01-04 13:37:07 +00:00
|
|
|
|
(save-buffer) (kill-buffer (current-buffer))
|
2013-11-17 20:31:03 +00:00
|
|
|
|
(delete-file file)
|
2011-11-18 18:29:47 +00:00
|
|
|
|
,results)))
|
|
|
|
|
(def-edebug-spec org-test-with-temp-text-in-file (form body))
|
2011-09-19 16:01:32 +00:00
|
|
|
|
|
2012-12-28 13:59:17 +00:00
|
|
|
|
(defun org-test-table-target-expect (target &optional expect laps
|
|
|
|
|
&rest tblfm)
|
|
|
|
|
"For all TBLFM: Apply the formula to TARGET, compare EXPECT with result.
|
|
|
|
|
Either LAPS and TBLFM are nil and the table will only be aligned
|
|
|
|
|
or LAPS is the count of recalculations that should be made on
|
|
|
|
|
each TBLFM. To save ERT run time keep LAPS as low as possible to
|
|
|
|
|
get the table stable. Anyhow, if LAPS is 'iterate then iterate,
|
|
|
|
|
but this will run one recalculation longer. When EXPECT is nil
|
|
|
|
|
it will be set to TARGET.
|
|
|
|
|
|
2013-04-26 15:07:55 +00:00
|
|
|
|
When running a test interactively in ERT is not enough and you
|
|
|
|
|
need to examine the target table with e. g. the Org formula
|
|
|
|
|
debugger or an Emacs Lisp debugger (e. g. with point in a data
|
|
|
|
|
field and calling the instrumented `org-table-eval-formula') then
|
|
|
|
|
copy and paste the table with formula from the ERT results buffer
|
|
|
|
|
or temporarily substitute the `org-test-with-temp-text' of this
|
|
|
|
|
function with `org-test-with-temp-text-in-file'. Also consider
|
|
|
|
|
setting `pp-escape-newlines' to nil manually."
|
2012-12-28 13:59:17 +00:00
|
|
|
|
(require 'pp)
|
|
|
|
|
(let ((back pp-escape-newlines) (current-tblfm))
|
|
|
|
|
(unless tblfm
|
|
|
|
|
(should-not laps)
|
|
|
|
|
(push "" tblfm)) ; Dummy formula.
|
|
|
|
|
(unless expect (setq expect target))
|
|
|
|
|
(while (setq current-tblfm (pop tblfm))
|
|
|
|
|
(org-test-with-temp-text (concat target current-tblfm)
|
2013-04-26 15:07:55 +00:00
|
|
|
|
;; Search the last of possibly several tables, let the ERT
|
|
|
|
|
;; test fail if not found.
|
|
|
|
|
(goto-char (point-max))
|
2012-12-28 13:59:17 +00:00
|
|
|
|
(while (not (org-at-table-p))
|
2013-04-26 15:07:55 +00:00
|
|
|
|
(should (eq 0 (forward-line -1))))
|
2012-12-28 13:59:17 +00:00
|
|
|
|
(when laps
|
|
|
|
|
(if (and (symbolp laps) (eq laps 'iterate))
|
|
|
|
|
(should (org-table-recalculate 'iterate t))
|
|
|
|
|
(should (integerp laps))
|
|
|
|
|
(should (< 0 laps))
|
|
|
|
|
(let ((cnt laps))
|
|
|
|
|
(while (< 0 cnt)
|
|
|
|
|
(should (org-table-recalculate 'all t))
|
|
|
|
|
(setq cnt (1- cnt))))))
|
|
|
|
|
(org-table-align)
|
|
|
|
|
(setq pp-escape-newlines nil)
|
|
|
|
|
;; Declutter the ERT results buffer by giving only variables
|
|
|
|
|
;; and not directly the forms to `should'.
|
|
|
|
|
(let ((expect (concat expect current-tblfm))
|
|
|
|
|
(result (buffer-substring-no-properties
|
|
|
|
|
(point-min) (point-max))))
|
|
|
|
|
(should (equal expect result)))
|
|
|
|
|
;; If `should' passed then set back `pp-escape-newlines' here,
|
|
|
|
|
;; else leave it nil as a side effect to see the failed table
|
|
|
|
|
;; on multiple lines in the ERT results buffer.
|
|
|
|
|
(setq pp-escape-newlines back)))))
|
|
|
|
|
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-10-04 00:44:10 +00:00
|
|
|
|
;;; Navigation Functions
|
2011-09-12 15:50:28 +00:00
|
|
|
|
(when (featurep 'jump)
|
2011-09-20 07:44:24 +00:00
|
|
|
|
(defjump org-test-jump
|
|
|
|
|
(("lisp/\\1.el" . "testing/lisp/test-\\1.el")
|
|
|
|
|
("lisp/\\1.el" . "testing/lisp/\\1.el/test.*.el")
|
|
|
|
|
("testing/lisp/test-\\1.el" . "lisp/\\1.el")
|
2012-03-19 20:38:12 +00:00
|
|
|
|
("testing/lisp/\\1.el" . "lisp/\\1.el/test.*.el"))
|
2011-09-20 07:44:24 +00:00
|
|
|
|
(concat org-base-dir "/")
|
|
|
|
|
"Jump between org-mode files and their tests."
|
|
|
|
|
(lambda (path)
|
|
|
|
|
(let* ((full-path (expand-file-name path org-base-dir))
|
|
|
|
|
(file-name (file-name-nondirectory path))
|
|
|
|
|
(name (file-name-sans-extension file-name)))
|
|
|
|
|
(find-file full-path)
|
|
|
|
|
(insert
|
|
|
|
|
";;; " file-name "\n\n"
|
|
|
|
|
";; Copyright (c) " (nth 5 (decode-time (current-time)))
|
|
|
|
|
" " user-full-name "\n"
|
|
|
|
|
";; Authors: " user-full-name "\n\n"
|
|
|
|
|
";; Released under the GNU General Public License version 3\n"
|
|
|
|
|
";; see: http://www.gnu.org/licenses/gpl-3.0.html\n\n"
|
|
|
|
|
";;;; Comments:\n\n"
|
|
|
|
|
";; Template test file for Org-mode tests\n\n"
|
|
|
|
|
"\n"
|
|
|
|
|
";;; Code:\n"
|
|
|
|
|
"(let ((load-path (cons (expand-file-name\n"
|
|
|
|
|
" \"..\" (file-name-directory\n"
|
|
|
|
|
" (or load-file-name buffer-file-name)))\n"
|
|
|
|
|
" load-path)))\n"
|
2013-03-13 10:23:56 +00:00
|
|
|
|
" (require 'org-test)\n\n"
|
2011-09-20 07:44:24 +00:00
|
|
|
|
"\n"
|
|
|
|
|
";;; Tests\n"
|
|
|
|
|
"(ert-deftest " name "/example-test ()\n"
|
|
|
|
|
" \"Just an example to get you started.\"\n"
|
|
|
|
|
" (should t)\n"
|
|
|
|
|
" (should-not nil)\n"
|
|
|
|
|
" (should-error (error \"errr...\")))\n\n\n"
|
|
|
|
|
"(provide '" name ")\n\n"
|
|
|
|
|
";;; " file-name " ends here\n") full-path))
|
|
|
|
|
(lambda () ((lambda (res) (if (listp res) (car res) res)) (which-function)))))
|
2010-10-02 22:50:57 +00:00
|
|
|
|
|
2010-10-06 02:51:04 +00:00
|
|
|
|
(define-key emacs-lisp-mode-map "\M-\C-j" 'org-test-jump)
|
|
|
|
|
|
2011-02-01 05:28:34 +00:00
|
|
|
|
|
|
|
|
|
;;; Miscellaneous helper functions
|
|
|
|
|
(defun org-test-strip-text-props (s)
|
|
|
|
|
"Return S without any text properties."
|
|
|
|
|
(let ((noprop (copy-sequence s)))
|
|
|
|
|
(set-text-properties 0 (length noprop) nil noprop)
|
|
|
|
|
noprop))
|
2010-10-04 00:44:10 +00:00
|
|
|
|
|
2011-03-02 18:07:15 +00:00
|
|
|
|
|
|
|
|
|
(defun org-test-string-exact-match (regex string &optional start)
|
|
|
|
|
"case sensative string-match"
|
|
|
|
|
(let ((case-fold-search nil)
|
|
|
|
|
(case-replace nil))
|
|
|
|
|
(if(and (equal regex "")
|
|
|
|
|
(not(equal string "")))
|
|
|
|
|
nil
|
|
|
|
|
(if (equal 0 (string-match regex string start))
|
|
|
|
|
t
|
|
|
|
|
nil))))
|
|
|
|
|
|
2010-10-04 00:44:10 +00:00
|
|
|
|
;;; Load and Run tests
|
2010-10-04 01:03:41 +00:00
|
|
|
|
(defun org-test-load ()
|
2010-10-03 16:45:07 +00:00
|
|
|
|
"Load up the org-mode test suite."
|
2010-10-02 21:23:27 +00:00
|
|
|
|
(interactive)
|
2011-09-21 22:34:43 +00:00
|
|
|
|
(flet ((rld (base)
|
|
|
|
|
;; Recursively load all files, if files throw errors
|
|
|
|
|
;; then silently ignore the error and continue to the
|
|
|
|
|
;; next file. This allows files to error out if
|
|
|
|
|
;; required executables aren't available.
|
|
|
|
|
(mapc
|
|
|
|
|
(lambda (path)
|
|
|
|
|
(if (file-directory-p path)
|
2011-11-13 14:43:34 +00:00
|
|
|
|
(rld path)
|
2011-11-13 19:30:25 +00:00
|
|
|
|
(condition-case err
|
|
|
|
|
(when (string-match "^[A-Za-z].*\\.el$"
|
2012-12-15 07:49:23 +00:00
|
|
|
|
(file-name-nondirectory path))
|
2011-11-13 19:30:25 +00:00
|
|
|
|
(load-file path))
|
|
|
|
|
(missing-test-dependency
|
|
|
|
|
(let ((name (intern
|
|
|
|
|
(concat "org-missing-dependency/"
|
|
|
|
|
(file-name-nondirectory
|
|
|
|
|
(file-name-sans-extension path))))))
|
|
|
|
|
(eval `(ert-deftest ,name ()
|
|
|
|
|
:expected-result :failed (should nil))))))))
|
2011-09-21 22:34:43 +00:00
|
|
|
|
(directory-files base 'full
|
|
|
|
|
"^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*\\.el$"))))
|
2012-03-19 20:38:12 +00:00
|
|
|
|
(rld (expand-file-name "lisp" org-test-dir))))
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-10-03 16:45:07 +00:00
|
|
|
|
(defun org-test-current-defun ()
|
|
|
|
|
"Test the current function."
|
2010-10-02 21:23:27 +00:00
|
|
|
|
(interactive)
|
2010-11-02 20:11:16 +00:00
|
|
|
|
(ert (which-function)))
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
2010-11-22 18:29:05 +00:00
|
|
|
|
(defun org-test-current-file ()
|
|
|
|
|
"Run all tests for current file."
|
|
|
|
|
(interactive)
|
|
|
|
|
(ert (concat "test-"
|
|
|
|
|
(file-name-sans-extension
|
|
|
|
|
(file-name-nondirectory (buffer-file-name)))
|
|
|
|
|
"/")))
|
|
|
|
|
|
2012-03-19 20:38:12 +00:00
|
|
|
|
(defvar org-test-buffers nil
|
|
|
|
|
"Hold buffers open for running Org-mode tests.")
|
|
|
|
|
|
2011-08-23 14:36:45 +00:00
|
|
|
|
(defun org-test-touch-all-examples ()
|
|
|
|
|
(dolist (file (directory-files
|
|
|
|
|
org-test-example-dir 'full
|
|
|
|
|
"^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*\\.org$"))
|
2012-03-19 20:38:12 +00:00
|
|
|
|
(unless (get-file-buffer file)
|
|
|
|
|
(add-to-list 'org-test-buffers (find-file file)))))
|
|
|
|
|
|
|
|
|
|
(defun org-test-kill-all-examples ()
|
|
|
|
|
(while org-test-buffers
|
|
|
|
|
(let ((b (pop org-test-buffers)))
|
|
|
|
|
(when (buffer-live-p b) (kill-buffer b)))))
|
2011-08-23 14:36:45 +00:00
|
|
|
|
|
2011-11-14 21:14:50 +00:00
|
|
|
|
(defun org-test-update-id-locations ()
|
|
|
|
|
(org-id-update-id-locations
|
|
|
|
|
(directory-files
|
|
|
|
|
org-test-example-dir 'full
|
|
|
|
|
"^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*\\.org$")))
|
|
|
|
|
|
2013-05-19 07:20:17 +00:00
|
|
|
|
(defun org-test-run-batch-tests (&optional org-test-selector)
|
|
|
|
|
"Run all tests matching an optional regex which defaults to \"\\(org\\|ob\\)\".
|
2011-09-08 15:11:26 +00:00
|
|
|
|
Load all test files first."
|
|
|
|
|
(interactive)
|
2011-11-14 21:14:50 +00:00
|
|
|
|
(let ((org-id-track-globally t)
|
2013-05-19 07:20:17 +00:00
|
|
|
|
(org-test-selector
|
|
|
|
|
(if org-test-selector org-test-selector "\\(org\\|ob\\)"))
|
2013-11-30 16:02:46 +00:00
|
|
|
|
org-confirm-babel-evaluate org-startup-folded vc-handled-backends)
|
2011-11-14 21:14:50 +00:00
|
|
|
|
(org-test-touch-all-examples)
|
|
|
|
|
(org-test-update-id-locations)
|
|
|
|
|
(org-test-load)
|
2013-11-23 16:46:35 +00:00
|
|
|
|
(message "selected tests: %s" org-test-selector)
|
2013-05-19 07:20:17 +00:00
|
|
|
|
(ert-run-tests-batch-and-exit org-test-selector)))
|
2011-09-08 15:11:26 +00:00
|
|
|
|
|
2010-10-03 16:45:07 +00:00
|
|
|
|
(defun org-test-run-all-tests ()
|
2010-10-06 16:23:50 +00:00
|
|
|
|
"Run all defined tests matching \"\\(org\\|ob\\)\".
|
2010-10-03 16:45:07 +00:00
|
|
|
|
Load all test files first."
|
2010-10-02 22:50:57 +00:00
|
|
|
|
(interactive)
|
2011-11-14 21:52:22 +00:00
|
|
|
|
(org-test-touch-all-examples)
|
2013-11-23 16:46:35 +00:00
|
|
|
|
(org-test-update-id-locations)
|
2011-11-14 21:52:22 +00:00
|
|
|
|
(org-test-load)
|
2012-03-19 20:38:12 +00:00
|
|
|
|
(ert "\\(org\\|ob\\)")
|
|
|
|
|
(org-test-kill-all-examples))
|
2010-10-02 21:23:27 +00:00
|
|
|
|
|
|
|
|
|
(provide 'org-test)
|
2010-10-03 16:45:07 +00:00
|
|
|
|
|
2010-10-02 21:23:27 +00:00
|
|
|
|
;;; org-test.el ends here
|