2021-10-18 11:44:55 +00:00
|
|
|
|
|
|
|
* Setup
|
|
|
|
** test-file-path-stem
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-10-14 03:45:43 +00:00
|
|
|
(defvar chronometrist-test-file-path-stem
|
|
|
|
(format "%stest" (file-name-directory (or load-file-name default-directory))))
|
2021-10-18 11:44:55 +00:00
|
|
|
#+END_SRC
|
2021-10-14 03:45:43 +00:00
|
|
|
|
2021-10-18 11:44:55 +00:00
|
|
|
** test-backend
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-10-14 03:45:43 +00:00
|
|
|
(defvar chronometrist-test-backend
|
2021-10-15 02:09:59 +00:00
|
|
|
(make-instance 'chronometrist-plist-backend :path chronometrist-test-file-path-stem))
|
2021-10-21 09:25:17 +00:00
|
|
|
|
|
|
|
(chronometrist-reset-internal chronometrist-test-backend)
|
2021-10-18 11:44:55 +00:00
|
|
|
#+END_SRC
|
2021-10-15 02:09:59 +00:00
|
|
|
|
2021-10-18 11:44:55 +00:00
|
|
|
** test-first-record
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-10-15 02:09:59 +00:00
|
|
|
(defvar chronometrist-test-first-record
|
|
|
|
'(:name "Programming"
|
|
|
|
:start "2018-01-01T00:00:00+0530"
|
|
|
|
:stop "2018-01-01T01:00:00+0530"))
|
2021-10-18 11:44:55 +00:00
|
|
|
#+END_SRC
|
2021-10-15 02:09:59 +00:00
|
|
|
|
2021-10-18 11:44:55 +00:00
|
|
|
** test-latest-record
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-10-15 02:09:59 +00:00
|
|
|
(defvar chronometrist-test-latest-record
|
|
|
|
'(:name "Programming"
|
|
|
|
:tags (reading)
|
|
|
|
:book "Smalltalk-80: The Language and Its Implementation"
|
|
|
|
:start "2020-05-10T16:33:17+0530"
|
|
|
|
:stop "2020-05-10T17:10:48+0530"))
|
2021-10-18 11:44:55 +00:00
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
* Tests
|
2021-10-21 09:25:17 +00:00
|
|
|
** common
|
|
|
|
*** current-task
|
2021-10-18 11:44:55 +00:00
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-10-14 03:45:43 +00:00
|
|
|
(ert-deftest chronometrist-current-task ()
|
|
|
|
(chronometrist-insert chronometrist-test-backend '(:name "Test"))
|
|
|
|
(should (equal (chronometrist-current-task chronometrist-test-backend) "Test"))
|
|
|
|
(chronometrist-sexp-in-file (chronometrist-backend-file chronometrist-test-backend)
|
|
|
|
(goto-char (point-max))
|
|
|
|
(backward-list)
|
|
|
|
(chronometrist-sexp-delete-list)
|
|
|
|
(save-buffer))
|
|
|
|
(should (not (chronometrist-current-task chronometrist-test-backend))))
|
2021-10-18 11:44:55 +00:00
|
|
|
#+END_SRC
|
2021-11-17 20:46:45 +00:00
|
|
|
|
|
|
|
*** plist-p
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(ert-deftest chronometrist-plist-p ()
|
|
|
|
(should (eq t (chronometrist-plist-p '(:a 1 :b 2))))
|
|
|
|
(should (eq nil (chronometrist-plist-p '(0 :a 1 :b 2))))
|
|
|
|
(should (eq nil (chronometrist-plist-p '(:a 1 :b 2 3))))
|
|
|
|
(should (not (chronometrist-plist-p nil))))
|
|
|
|
#+END_SRC
|
|
|
|
|
2021-10-29 06:53:52 +00:00
|
|
|
** data structures
|
|
|
|
*** list-tasks
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(ert-deftest chronometrist-list-tasks ()
|
|
|
|
(let ((task-list (chronometrist-list-tasks chronometrist-test-backend)))
|
|
|
|
(should (listp task-list))
|
|
|
|
(should (seq-every-p #'stringp task-list))))
|
|
|
|
#+END_SRC
|
|
|
|
|
2021-11-17 20:46:45 +00:00
|
|
|
** time functions
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(ert-deftest chronometrist-format-duration-long ()
|
|
|
|
(should (equal (chronometrist-format-duration-long 5) ""))
|
|
|
|
(should (equal (chronometrist-format-duration-long 65) "1 minute"))
|
|
|
|
(should (equal (chronometrist-format-duration-long 125) "2 minutes"))
|
|
|
|
|
|
|
|
(should (equal (chronometrist-format-duration-long 3605) "1 hour"))
|
|
|
|
(should (equal (chronometrist-format-duration-long 3660) "1 hour, 1 minute"))
|
|
|
|
(should (equal (chronometrist-format-duration-long 3725) "1 hour, 2 minutes"))
|
|
|
|
|
|
|
|
(should (equal (chronometrist-format-duration-long 7200) "2 hours"))
|
|
|
|
(should (equal (chronometrist-format-duration-long 7260) "2 hours, 1 minute"))
|
|
|
|
(should (equal (chronometrist-format-duration-long 7320) "2 hours, 2 minutes")))
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
** plist pretty-printing
|
2021-11-22 11:31:57 +00:00
|
|
|
[[file:../elisp/chronometrist.org::#program-pretty-printer][source]]
|
|
|
|
|
2021-11-17 20:46:45 +00:00
|
|
|
*** plist-group-p
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(ert-deftest chronometrist-plist-group-p ()
|
|
|
|
(should (eq t (chronometrist-plist-group-p '("string" (:a 1 :b 2)))))
|
|
|
|
(should (not (chronometrist-plist-group-p nil)))
|
|
|
|
(should (not (chronometrist-plist-group-p '("string")))))
|
|
|
|
#+END_SRC
|
|
|
|
|
2021-11-22 11:31:57 +00:00
|
|
|
*** plist-pp-to-string
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-11-30 12:38:30 +00:00
|
|
|
(ert-deftest chronometrist-pp-to-string ()
|
2021-11-22 11:31:57 +00:00
|
|
|
(should
|
|
|
|
(equal
|
2021-11-30 12:38:30 +00:00
|
|
|
(chronometrist-pp-to-string
|
2021-11-22 11:31:57 +00:00
|
|
|
'(:name "Task"
|
|
|
|
:tags (foo bar)
|
|
|
|
:comment ((70 . "baz")
|
|
|
|
"zot"
|
|
|
|
(16 . "frob")
|
|
|
|
(20 20 "quux"))
|
|
|
|
:start "2020-06-25T19:27:57+0530"
|
|
|
|
:stop "2020-06-25T19:43:30+0530"))
|
|
|
|
(concat
|
|
|
|
"(:name \"Task\"\n"
|
|
|
|
" :tags (foo bar)\n"
|
|
|
|
" :comment ((70 . \"baz\")\n"
|
|
|
|
" \"zot\"\n"
|
|
|
|
" (16 . \"frob\")\n"
|
|
|
|
" (20 20 \"quux\"))\n"
|
|
|
|
" :start \"2020-06-25T19:27:57+0530\"\n"
|
|
|
|
" :stop \"2020-06-25T19:43:30+0530\")")))
|
|
|
|
(should
|
|
|
|
(equal
|
2021-11-30 12:38:30 +00:00
|
|
|
(chronometrist-pp-to-string
|
2021-11-22 11:31:57 +00:00
|
|
|
'(:name "Singing"
|
|
|
|
:tags (classical solo)
|
|
|
|
:piece ((:composer "Gioachino Rossini"
|
|
|
|
:name "Il barbiere di Siviglia"
|
|
|
|
:aria ("All'idea di quel metallo" "Dunque io son"))
|
|
|
|
(:composer "Ralph Vaughan Williams"
|
|
|
|
:name "Songs of Travel"
|
|
|
|
:movement ((4 . "Youth and Love")
|
|
|
|
(5 . "In Dreams")
|
|
|
|
(7 . "Wither Must I Wander?")))
|
|
|
|
(:composer "Ralph Vaughan Williams"
|
|
|
|
:name "Merciless Beauty"
|
|
|
|
:movement 1)
|
|
|
|
(:composer "Franz Schubert"
|
|
|
|
:name "Winterreise"
|
|
|
|
:movement ((1 . "Gute Nacht")
|
|
|
|
(2 . "Die Wetterfahne")
|
|
|
|
(4 . "Erstarrung"))))
|
|
|
|
:start "2020-11-01T12:01:20+0530"
|
|
|
|
:stop "2020-11-01T13:08:32+0530"))
|
|
|
|
(concat
|
|
|
|
"(:name \"Singing\"\n"
|
|
|
|
" :tags (classical solo)\n"
|
|
|
|
" :piece ((:composer \"Gioachino Rossini\"\n"
|
|
|
|
" :name \"Il barbiere di Siviglia\"\n"
|
|
|
|
" :aria (\"All'idea di quel metallo\" \"Dunque io son\"))\n"
|
|
|
|
" (:composer \"Ralph Vaughan Williams\"\n"
|
|
|
|
" :name \"Songs of Travel\"\n"
|
|
|
|
" :movement ((4 . \"Youth and Love\")\n"
|
|
|
|
" (5 . \"In Dreams\")\n"
|
|
|
|
" (7 . \"Wither Must I Wander?\")))\n"
|
|
|
|
" (:composer \"Ralph Vaughan Williams\"\n"
|
|
|
|
" :name \"Merciless Beauty\"\n"
|
|
|
|
" :movement 1)\n"
|
|
|
|
" (:composer \"Franz Schubert\"\n"
|
|
|
|
" :name \"Winterreise\"\n"
|
|
|
|
" :movement ((1 . \"Gute Nacht\")\n"
|
|
|
|
" (2 . \"Die Wetterfahne\")\n"
|
|
|
|
" (4 . \"Erstarrung\"))))\n"
|
|
|
|
" :start \"2020-11-01T12:01:20+0530\"\n"
|
|
|
|
" :stop \"2020-11-01T13:08:32+0530\")")))
|
|
|
|
(should (equal
|
2021-11-30 12:38:30 +00:00
|
|
|
(chronometrist-pp-to-string
|
2021-11-22 11:31:57 +00:00
|
|
|
'(:name "Cooking"
|
|
|
|
:tags (lunch)
|
|
|
|
:recipe (:name "moong-masoor ki dal"
|
|
|
|
:url "https://www.mirchitales.com/moong-masoor-dal-red-and-yellow-lentil-curry/")
|
|
|
|
:start "2020-09-23T15:22:39+0530"
|
|
|
|
:stop "2020-09-23T16:29:49+0530"))
|
|
|
|
(concat
|
|
|
|
"(:name \"Cooking\"\n"
|
|
|
|
" :tags (lunch)\n"
|
|
|
|
" :recipe (:name \"moong-masoor ki dal\"\n"
|
|
|
|
" :url \"https://www.mirchitales.com/moong-masoor-dal-red-and-yellow-lentil-curry/\")\n"
|
|
|
|
" :start \"2020-09-23T15:22:39+0530\"\n"
|
|
|
|
" :stop \"2020-09-23T16:29:49+0530\")")))
|
|
|
|
(should (equal
|
2021-11-30 12:38:30 +00:00
|
|
|
(chronometrist-pp-to-string
|
2021-11-22 11:31:57 +00:00
|
|
|
'(:name "Exercise"
|
|
|
|
:tags (warm-up)
|
|
|
|
:start "2018-11-21T15:35:04+0530"
|
|
|
|
:stop "2018-11-21T15:38:41+0530"
|
|
|
|
:comment ("stretching" (25 10 "push-ups"))))
|
|
|
|
(concat
|
|
|
|
"(:name \"Exercise\"\n"
|
|
|
|
" :tags (warm-up)\n"
|
|
|
|
" :start \"2018-11-21T15:35:04+0530\"\n"
|
|
|
|
" :stop \"2018-11-21T15:38:41+0530\"\n"
|
|
|
|
" :comment (\"stretching\" (25 10 \"push-ups\")))")))
|
|
|
|
(should (equal
|
2021-11-30 12:38:30 +00:00
|
|
|
(chronometrist-pp-to-string
|
2021-11-22 11:31:57 +00:00
|
|
|
'(:name "Guitar"
|
|
|
|
:tags (classical)
|
|
|
|
:warm-up ((right-hand-patterns "pima" "piam" "pmia" "pmai" "pami" "paim"))
|
|
|
|
:start "2021-09-28T17:49:18+0530"
|
|
|
|
:stop "2021-09-28T17:53:49+0530"))
|
|
|
|
(concat
|
|
|
|
"(:name \"Guitar\"\n"
|
|
|
|
" :tags (classical)\n"
|
|
|
|
" :warm-up ((right-hand-patterns \"pima\" \"piam\" \"pmia\" \"pmai\" \"pami\" \"paim\"))\n"
|
|
|
|
" :start \"2021-09-28T17:49:18+0530\"\n"
|
|
|
|
" :stop \"2021-09-28T17:53:49+0530\")"))))
|
|
|
|
#+END_SRC
|
|
|
|
|
2021-10-21 09:25:17 +00:00
|
|
|
** backend
|
|
|
|
*** count-records
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(ert-deftest chronometrist-count-records ()
|
|
|
|
(should (= (chronometrist-count-records chronometrist-test-backend) 12)))
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
*** latest-record
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(ert-deftest chronometrist-latest-record ()
|
|
|
|
(should (equal (chronometrist-latest-record chronometrist-test-backend)
|
|
|
|
chronometrist-test-latest-record)))
|
|
|
|
#+END_SRC
|
2021-10-14 03:45:43 +00:00
|
|
|
|
2021-10-29 06:53:52 +00:00
|
|
|
*** task-records-for-date
|
2021-10-18 11:44:55 +00:00
|
|
|
#+BEGIN_SRC emacs-lisp
|
2021-10-29 06:53:52 +00:00
|
|
|
(ert-deftest chronometrist-task-records-for-date ()
|
|
|
|
(should (equal (chronometrist-task-records-for-date chronometrist-test-backend
|
|
|
|
"Programming"
|
|
|
|
(chronometrist-iso-to-ts "2020-05-10"))
|
2021-10-21 09:25:17 +00:00
|
|
|
(list chronometrist-test-latest-record))))
|
2021-10-18 11:44:55 +00:00
|
|
|
#+END_SRC
|