org-mode/testing/lisp/test-org-timer.el

276 lines
8.7 KiB
EmacsLisp
Raw Normal View History

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-07 02:24:54 -05:00
;;; test-org-timer.el --- Tests for org-timer.el
2015-02-15 19:40:07 -05:00
;; Copyright (C) 2014-2015 Kyle Meyer
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-07 02:24:54 -05:00
;; Author: Kyle Meyer <kyle@kyleam.com>
;; This file is not part of GNU Emacs.
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Code:
(defmacro test-org-timer/with-temp-text (text &rest body)
"Like `org-test-with-temp-text', but set timer-specific variables.
Also, mute output from `message'."
(declare (indent 1))
`(letf (((symbol-function 'message) (lambda (&rest args) nil)))
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-07 02:24:54 -05:00
(org-test-with-temp-text ,text
(let (org-timer-start-time
org-timer-pause-time
org-timer-countdown-timer
org-timer-display)
(unwind-protect (progn ,@body)
(when (timerp org-timer-countdown-timer)
(cancel-timer org-timer-countdown-timer)))))))
(defmacro test-org-timer/with-current-time (time &rest body)
"Run BODY, setting `current-time' output to TIME."
(declare (indent 1))
`(letf (((symbol-function 'current-time) (lambda () ,time)))
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-07 02:24:54 -05:00
,@body))
;;; Time conversion and formatting
(ert-deftest test-org-timer/secs-to-hms ()
"Test conversion between HMS format and seconds."
;; Seconds to HMS, and back again
(should
(equal "0:00:30"
(org-timer-secs-to-hms 30)))
(should
(equal 30
(org-timer-hms-to-secs (org-timer-secs-to-hms 30))))
;; Minutes to HMS, and back again
(should
(equal "0:02:10"
(org-timer-secs-to-hms 130)))
(should
(equal 130
(org-timer-hms-to-secs (org-timer-secs-to-hms 130))))
;; Hours to HMS, and back again
(should
(equal "1:01:30"
(org-timer-secs-to-hms 3690)))
(should
(equal 3690
(org-timer-hms-to-secs (org-timer-secs-to-hms 3690))))
;; Negative seconds to HMS, and back again
(should
(equal "-1:01:30"
(org-timer-secs-to-hms -3690)))
(should
(equal -3690
(org-timer-hms-to-secs (org-timer-secs-to-hms -3690)))))
(ert-deftest test-org-timer/fix-incomplete ()
"Test conversion to complete HMS format."
;; No fix is needed.
(should
(equal "1:02:03"
(org-timer-fix-incomplete "1:02:03")))
;; Hour is missing.
(should
(equal "0:02:03"
(org-timer-fix-incomplete "02:03")))
;; Minute is missing.
(should
(equal "0:00:03"
(org-timer-fix-incomplete "03"))))
(ert-deftest test-org-timer/change-times ()
"Test changing HMS format by offset."
;; Add time.
(should
(equal "
1:31:15
4:00:55"
(org-test-with-temp-text "
0:00:25
2:30:05"
(org-timer-change-times-in-region (point-min) (point-max)
"1:30:50")
(buffer-string))))
;; Subtract time.
(should
(equal "
-1:30:25
0:59:15"
(org-test-with-temp-text "
0:00:25
2:30:05"
(org-timer-change-times-in-region (point-min) (point-max)
"-1:30:50")
(buffer-string)))))
;;; Timers
;; Dummy times for overriding `current-time'
(defvar test-org-timer/time0 '(21635 62793 797149 675000))
;; Add 3 minutes and 26 seconds.
(defvar test-org-timer/time1
(time-add test-org-timer/time0 (seconds-to-time 206)))
;; Add 2 minutes and 41 seconds (6 minutes and 7 seconds total).
(defvar test-org-timer/time2
(time-add test-org-timer/time1 (seconds-to-time 161)))
;; Add 4 minutes and 55 seconds (11 minutes and 2 seconds total).
(defvar test-org-timer/time3
(time-add test-org-timer/time2 (seconds-to-time 295)))
(ert-deftest test-org-timer/start-relative ()
"Test starting relative timer."
;; Insert plain timer string, starting with `org-timer-start'.
(should
(equal "0:03:26"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer))
(org-trim (buffer-string)))))
;; Insert item timer string.
(should
(equal "- 0:03:26 ::"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-item))
(org-trim (buffer-string)))))
;; Start with `org-timer'.
(should
(equal "0:00:00 0:03:26"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer))
(org-trim (buffer-string)))))
;; Restart with `org-timer'.
(should
(equal "0:00:00"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer '(4)))
(org-trim (buffer-string))))))
(ert-deftest test-org-timer/set-timer ()
"Test setting countdown timer."
(should
(equal "0:06:34"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-set-timer 10))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer))
(org-trim (buffer-string))))))
(ert-deftest test-org-timer/pause-timer ()
"Test pausing relative and countdown timers."
;; Pause relative timer.
(should
(equal "0:03:26"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-pause-or-continue))
(org-timer)
(org-trim (buffer-string)))))
;; Pause then continue relative timer.
(should
(equal "0:08:21"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-pause-or-continue))
(test-org-timer/with-current-time test-org-timer/time2
(org-timer-pause-or-continue))
(test-org-timer/with-current-time test-org-timer/time3
(org-timer))
(org-trim (buffer-string)))))
;; Pause then continue countdown timer.
(should
(equal "0:01:39"
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-set-timer 10))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-pause-or-continue))
(test-org-timer/with-current-time test-org-timer/time2
(org-timer-pause-or-continue))
(test-org-timer/with-current-time test-org-timer/time3
(org-timer))
(org-trim (buffer-string))))))
(ert-deftest test-org-timer/stop ()
"Test stopping relative and countdown timers."
;; Stop running relative timer.
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-stop))
(should-not org-timer-start-time))
;; Stop paused relative timer.
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-start))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-pause-or-continue)
(org-timer-stop))
(should-not org-timer-start-time)
(should-not org-timer-pause-time))
;; Stop running countdown timer.
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-set-timer 10))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-stop))
(should-not org-timer-start-time)
(should-not org-timer-countdown-timer))
;; Stop paused countdown timer.
(test-org-timer/with-temp-text ""
(test-org-timer/with-current-time test-org-timer/time0
(org-timer-set-timer 10))
(test-org-timer/with-current-time test-org-timer/time1
(org-timer-pause-or-continue)
(org-timer-stop))
(should-not org-timer-start-time)
(should-not org-timer-pause-time)
(should-not org-timer-countdown-timer)))
(ert-deftest test-org-timer/other-timer-error ()
"Test for error when other timer running."
;; Relative timer is running.
(should-error
(test-org-timer/with-temp-text ""
(org-timer-start)
test: Fixes for running tests interactively. * testing/examples/babel.org: Change spaces to dashes in #+name lines. * testing/lisp/test-ob-exp.el (org-test-with-expanded-babel-code): (ob-exp/evaluate-all-executables-in-order): (ob-exp/exports-inline-code): (ob-exp/exports-inline): (ob-exp/exports-inline-code-double-eval): (ob-exp/exports-inline-code-eval-code-once): (ob-exp/exports-inline-code-double-eval-exports-both): (ob-exp/use-case-of-reading-entry-properties): (ob-exp/export-from-a-temp-buffer): (ob-export/export-with-results-before-block): (ob-export/export-under-commented-headline): * testing/lisp/test-ob-lob.el (test-ob-lob/export-lob-lines): * testing/lisp/test-ob.el (test-org-babel/inline-src_blk-default-results-replace-line-1): (test-org-babel/inline-src_blk-default-results-replace-line-2): (test-org-babel/inline-src_blk-manual-results-replace): (test-org-babel/inline-src_blk-results-scalar): (test-org-babel/inline-src_blk-results-verbatim): (test-org-babel/inline-src_blk-preceded-punct-preceded-by-point): * testing/lisp/test-ox.el (test-org-export/export-scope): Bind ‘org-babel-inline-result-wrap’ and/or ‘org-export-babel-evaluate’ so tests work when users have customized these variables. * testing/lisp/test-ob-exp.el (ob-export/export-with-results-before-block): Add ‘org-trim’ where an extra newline was creeping in. * testing/lisp/test-ob-lob.el (test-ob-lob/call-with-header-arguments): Neutralize org-babel-insert-result, which was stomping on the buffer contents and disrupting the test * testing/lisp/test-org-element.el (test-org-element/block-switches): Replace (should (and ...)) with multiple (should ...). This gives more precise indications of what is wrong when a test fails. (test-org-element/link-parser): Require org-docview. * testing/lisp/test-org-timer.el (test-org-timer/other-timer-error): Add the error type for ‘should-error’. * testing/lisp/test-ox.el (test-org-export/set-title): (test-org-export/handle-options): (test-org-export/with-timestamps): (test-org-export/comment-tree): (test-org-export/handle-inlinetasks): Let ‘org-export-filter-body-functions’ and ‘org-export-filter-final-output-functions’ to nil where an empty string is the expected result. ‘org-export-filter-apply-functions’ treats an empty string as special, and changes it to nil. This creates test failures when the user has customized these variables. * testing/org-test.el (org-test-with-temp-text): Let ‘org-mode-hook’ to nil. (org-test-table-target-expect): Require ert since this function calls some of its should* functions.
2015-01-22 00:59:04 -05:00
(org-timer-set-timer 10))
:type (list 'error 'user-error))
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-07 02:24:54 -05:00
;; Countdown timer is running.
(should-error
(test-org-timer/with-temp-text ""
(org-timer-set-timer 10)
test: Fixes for running tests interactively. * testing/examples/babel.org: Change spaces to dashes in #+name lines. * testing/lisp/test-ob-exp.el (org-test-with-expanded-babel-code): (ob-exp/evaluate-all-executables-in-order): (ob-exp/exports-inline-code): (ob-exp/exports-inline): (ob-exp/exports-inline-code-double-eval): (ob-exp/exports-inline-code-eval-code-once): (ob-exp/exports-inline-code-double-eval-exports-both): (ob-exp/use-case-of-reading-entry-properties): (ob-exp/export-from-a-temp-buffer): (ob-export/export-with-results-before-block): (ob-export/export-under-commented-headline): * testing/lisp/test-ob-lob.el (test-ob-lob/export-lob-lines): * testing/lisp/test-ob.el (test-org-babel/inline-src_blk-default-results-replace-line-1): (test-org-babel/inline-src_blk-default-results-replace-line-2): (test-org-babel/inline-src_blk-manual-results-replace): (test-org-babel/inline-src_blk-results-scalar): (test-org-babel/inline-src_blk-results-verbatim): (test-org-babel/inline-src_blk-preceded-punct-preceded-by-point): * testing/lisp/test-ox.el (test-org-export/export-scope): Bind ‘org-babel-inline-result-wrap’ and/or ‘org-export-babel-evaluate’ so tests work when users have customized these variables. * testing/lisp/test-ob-exp.el (ob-export/export-with-results-before-block): Add ‘org-trim’ where an extra newline was creeping in. * testing/lisp/test-ob-lob.el (test-ob-lob/call-with-header-arguments): Neutralize org-babel-insert-result, which was stomping on the buffer contents and disrupting the test * testing/lisp/test-org-element.el (test-org-element/block-switches): Replace (should (and ...)) with multiple (should ...). This gives more precise indications of what is wrong when a test fails. (test-org-element/link-parser): Require org-docview. * testing/lisp/test-org-timer.el (test-org-timer/other-timer-error): Add the error type for ‘should-error’. * testing/lisp/test-ox.el (test-org-export/set-title): (test-org-export/handle-options): (test-org-export/with-timestamps): (test-org-export/comment-tree): (test-org-export/handle-inlinetasks): Let ‘org-export-filter-body-functions’ and ‘org-export-filter-final-output-functions’ to nil where an empty string is the expected result. ‘org-export-filter-apply-functions’ treats an empty string as special, and changes it to nil. This creates test failures when the user has customized these variables. * testing/org-test.el (org-test-with-temp-text): Let ‘org-mode-hook’ to nil. (org-test-table-target-expect): Require ert since this function calls some of its should* functions.
2015-01-22 00:59:04 -05:00
(org-timer-start))
:type (list 'error 'user-error)))
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-07 02:24:54 -05:00
(provide 'test-org-timer)
;;; test-org-timer.el end here