org-mode/testing
Kyle Meyer 173b0cb6d6 org-timer.el: Merge API for the two timers
* lisp/org-timer.el (org-timer-stop): Support countdown timers in addition
to relative timers.

* lisp/org-timer.el (org-timer-cancel-timer): Remove function.

* lisp/org-timer.el (org-timer-pause-or-continue): Support countdown
timers in addition to relative timers.

* testing/lisp/test-org-timer.el: New file.

* doc/org.texi: Merge relative and countdown timer nodes.

Several previous issues are fixed with these changes.

- org-timer-set-timer and org-timer-cancel-timer did not reset
  org-timer-start-time after countdown completed.

- Because org-timer-start did not return org-timer-pause-time to nil,
  the modeline remained stuck at the paused time.

- When org-timer-start was called with a countdown timer, the modeline
  was updated for the new relative timer, but the countdown timer
  remained scheduled.

- When org-timer-pause-or-continue was called with a countdown timer
  running, the modeline was put in a paused state, but the countdown
  timer remained scheduled.

- When org-timer-stop was called with a countdown timer running, the
  timer was removed from the modeline, but the countdown timer remained
  scheduled.

- When org-timer-set-timer was called with a paused relative timer, the
  relative timer was not reset properly (org-timer-pause-time was still
  non-nil) and the modeline remained in the paused state of the relative
  timer, even though the countdown timer was scheduled with
  run-with-timer.

- Running org-timer-set-timer at the beginning of an empty buffer
  resulted in an args-out-of-range error (due to the org-get-at-eol
  call).
2014-12-09 10:13:29 +01:00
..
examples Add test for setup keywords initialization 2014-10-28 14:23:52 +01:00
jump@820bb7d81b now using newer version of jump.el -- run $ git submodule update 2010-10-21 13:05:59 +01:00
lisp org-timer.el: Merge API for the two timers 2014-12-09 10:13:29 +01:00
.gitignore ignore org-id file generated during testing 2011-11-15 11:19:39 -07:00
README testing/README: Changes to "Interactive testing" 2014-07-27 14:14:28 +02:00
org-batch-test-init.el testing: allow to select tests 2013-11-23 19:29:34 +01:00
org-test.el Merge branch 'maint' 2014-04-10 11:56:13 +02:00

README

# -*- mode:org -*-
#+TITLE: Org-mode Testing
#+PROPERTY: results silent

* Dependencies

The only dependency is [[http://www.emacswiki.org/emacs/ErtTestLibrary][ERT]] the Emacs testing library which ships with
Emacs24.  If you are running an older version of Emacs and don't
already have ERT installed it can be installed from its old [[https://github.com/ohler/ert][git
repository]].

* Non-interactive batch testing from the command line

The simplest way to run the Org-mode test suite is from the command
line with the following invocation.  Note that the paths below are
relative to the base of the Org-mode directory.

Also note that many of the current tests uses babel evaluation...

#+BEGIN_SRC sh :dir (expand-file-name "..")
  # For Emacs earlier than 24, add -L /path/to/ert
  emacs -Q --batch \
        -L lisp/ -L testing/ -L testing/lisp -l lisp/org.el \
        -l lisp/org-id.el -l testing/org-test.el \
        --eval "(progn (org-reload) (setq org-confirm-babel-evaluate nil) \
        (org-babel-do-load-languages 'org-babel-load-languages \
        '((emacs-lisp . t) (shell . t) (org . t))))" \
        -f org-test-run-batch-tests
#+END_SRC

The options in the above command are explained below.

| -Q      | ignores any personal configuration ensuring a vanilla Emacs instance is used |
| --batch | runs Emacs in "batch" mode with no gui and termination after execution       |
| -l      | loads Org-mode and the org mode test suite defined in testing/org-test.el    |
| --eval  | reloads Org-mode and allows evaluation of code blocks by the tests           |
| -f      | actually runs the tests using the `org-test-run-batch-tests' function        |

* Interactive testing from within Emacs

To run the Org-mode test suite from a current Emacs instance simply
load and run the test suite with the following commands.

1) First load the test suite.
   #+BEGIN_SRC emacs-lisp :var here=(buffer-file-name)
     (add-to-list 'load-path (file-name-directory here))
     (require 'org-test)
   #+END_SRC

2) Load required Babel languages
   #+BEGIN_SRC emacs-lisp
     (org-babel-do-load-languages
      'org-babel-load-languages
      (and
       (mapc (lambda (lang) (add-to-list 'org-babel-load-languages (cons lang t)))
             '(emacs-lisp shell org))
       org-babel-load-languages))
   #+END_SRC

3) Then run the test suite.  Babel evaluation confirmation is disabled
   and ~C-c C-c~ is enabled while running the tests.
   #+BEGIN_SRC emacs-lisp
     (let (org-babel-no-eval-on-ctrl-c-ctrl-c
           org-confirm-babel-evaluate)
       (org-test-run-all-tests))
   #+END_SRC

   When a test fails, run it interactively and investigate the problem
   in the ERT results buffer.

   How to run one test:
   Use this as a demo example of a failing test
   #+BEGIN_SRC emacs-lisp
     (ert-deftest test-org/org-link-escape-ascii-character-demo-of-fail ()
       (should (string= "%5B"  ;; expecting %5B is right
                        (org-link-escape "[")))
       (should (string= "%5C"  ;; expecting %5C is wrong, %5D right
                        (org-link-escape "]"))))
   #+END_SRC
   or evaluate the ert-deftest form of the test you want to run.  Then
   "M-x ert RET test-org/org-link-escape-ascii-character-demo-of-fail RET"
   When not visible yet switch to the ERT results buffer named
   "\*ert\*".  When a test failed the ERT results buffer shows the
   details of the first "should" that failed.  See
   (info "(ert)Running Tests Interactively") on how to re-run, start
   the debugger etc.

   How to run all tests of a single test file:
   "M-x ert-delete-all-tests RET", confirm.  Open the file
   ./lisp/test-*.el, "M-x eval-buffer RET", "M-x ert RET t RET"

   Consider to set pp-escape-newlines nil before running the test when
   looking at "should" in the ERT results buffer.  Especially when
   using "l" to look at passed test results and possibly missing an
   appropriate setting of pp-escape-newlines made only temporarily for
   the running time of the test as e. g. tests using
   org-test-table-target-expect-tblfm do.

* Troubleshooting

- If the value of the =org-babel-no-eval-on-ctrl-c-ctrl-c= is non-nil
  then it will result in some test failure, as there are tests which
  rely on this behavior.