;;; timeline-tools-test.el -- Tests for timeline-tools -*- lexical-binding: t -*- ;;; Commentary: ;; Most of the times in the test cases are not really reasonable, but if we can ;; cope with those, reasonable ones should also work ;) ;;; Code: (require 'ert) (require 'timeline-tools) (require 'cl-lib) ;; Basic parsing tests (ert-deftest timeline-tools-test-parse-clocklines-1 () "Test `timeline-tools-clocklines-in-range’ with simple setup." (let ((result (with-temp-buffer (insert "* Task 1\n") (insert ":LOGBOOK:\n") (insert "CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45\n") (insert ":END:\n") (org-mode) (timeline-tools-clocklines-in-range 1515279600.0 1515366000.0)))) (should (equal 1 (length result))) (should (equal 2 (length (car result)))) (should (markerp (car (car result)))) (should (equal (car (cdr (car result))) (cons 1515327300.0 1515330000.0))))) (ert-deftest timeline-tools-test-parse-clocklines-2 () "Test `timeline-tools-clocklines-in-range’ with multiple clocklines." (let ((result (with-temp-buffer (insert "* Task 1\n") (insert ":LOGBOOK:\n") (insert "CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45\n") (insert "CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55\n") (insert "CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53\n") (insert ":END:\n") (org-mode) (timeline-tools-clocklines-in-range 1515279600.0 1515600000.0)))) (should (equal 1 (length result))) (should (equal 4 (length (car result)))) (should (markerp (car (car result)))) (should (equal (cdr (car result)) (list (cons 1515327300.0 1515330000.0) (cons 1515424500.0 1515586200.0) (cons 1515575220.0 1515600000.0)))))) (ert-deftest timeline-tools-test-parse-clocklines-3 () "Test `timeline-tools-clocklines-in-range’ with multiple tasks." (let ((result (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 :END: ") (org-mode) (timeline-tools-clocklines-in-range 1515279600.0 1515600000.0)))) (should (equal 2 (length result))) (should (equal '(4 3) (mapcar #'length result))) (should (cl-every #'markerp (mapcar #'car result))) (should (equal (mapcar #'cdr result) '(((1515327300.0 . 1515330000.0) (1515424500.0 . 1515586200.0) (1515575220.0 . 1515600000.0)) ((1515334380.0 . 1515338220.0) (1515423600.0 . 1515424500.0))))))) (ert-deftest timeline-tools-test-parse-clocklines-4 () "Test `timeline-tools-clocklines-in-range’ with extended time range." (let ((result (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 :END: ") (org-mode) (timeline-tools-clocklines-in-range 1515279600.0 1515700000.0)))) (should (equal 2 (length result))) (should (equal '(4 3) (mapcar #'length result))) (should (cl-every #'markerp (mapcar #'car result))) (should (equal (mapcar #'cdr result) '(((1515327300.0 . 1515330000.0) (1515424500.0 . 1515586200.0) (1515575220.0 . 1515700000.0)) ((1515334380.0 . 1515338220.0) (1515423600.0 . 1515424500.0))))))) (ert-deftest timeline-tools-test-parse-clocklines-5 () "Test `timeline-tools-clocklines-in-range’ without org-mode." (let ((result (should-error (with-temp-buffer (insert "* Task 1\n") (insert ":LOGBOOK:\n") (insert "CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45\n") (insert ":END:\n") (timeline-tools-clocklines-in-range 1515279600.0 1515366000.0)) :type 'user-error))) (should (equal (cadr result) "Not in Org mode buffer, cannot parse clocklines")) (should (equal (car result) 'user-error)))) (ert-deftest timeline-tools-test-timeline-1 () "Test `timeline-tools-timeline’ with full arguments." (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 :END: ") (org-mode) (let ((timeline (timeline-tools-timeline (org-time-string-to-seconds "[2018-01-01 Mon 00:00]") (org-time-string-to-seconds "[2018-02-01 Thu 00:00]") (list (current-buffer)))) (task-1 (save-excursion (goto-char 2) (point-marker))) (task-2 (save-excursion (goto-char 216) (point-marker)))) (should (equal timeline (cl-mapcar #'(lambda (entry) (list (org-time-string-to-seconds (nth 0 entry)) (org-time-string-to-seconds (nth 1 entry)) (nth 2 entry))) `(("[2018-01-07 Sun 13:15]" "[2018-01-07 Sun 14:00]" ,task-1) ("[2018-01-07 Sun 15:13]" "[2018-01-07 Sun 16:17]" ,task-2) ("[2018-01-08 Mon 16:00]" "[2018-01-08 Mon 16:15]" ,task-2) ("[2018-01-08 Mon 16:15]" "[2018-01-10 Wed 13:10]" ,task-1) ("[2018-01-10 Wed 10:07]" "[2018-01-12 Fri 14:00]" ,task-1)))))))) (ert-deftest timeline-tools-test-timeline-2 () "Test `timeline-tools-timeline’ with restricted time." (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 :END: ") (org-mode) (let ((timeline (timeline-tools-timeline ;; these dates should cut at start and end (org-time-string-to-seconds "[2018-01-07 Sun 15:27]") (org-time-string-to-seconds "[2018-01-11 Thu 00:00]") (list (current-buffer)))) (task-1 (save-excursion (goto-char 2) (point-marker))) (task-2 (save-excursion (goto-char 216) (point-marker)))) (should (equal timeline (cl-mapcar #'(lambda (entry) (list (org-time-string-to-seconds (nth 0 entry)) (org-time-string-to-seconds (nth 1 entry)) (nth 2 entry))) `(("[2018-01-07 Sun 15:27]" "[2018-01-07 Sun 16:17]" ,task-2) ("[2018-01-08 Mon 16:00]" "[2018-01-08 Mon 16:15]" ,task-2) ("[2018-01-08 Mon 16:15]" "[2018-01-10 Wed 13:10]" ,task-1) ("[2018-01-10 Wed 10:07]" "[2018-01-11 Thu 00:00]" ,task-1)))))))) ;; Conflict resolution tests (ert-deftest timeline-tools-test-clockline-no-conflict-1 () "Test `timeline-tools-clockline-no-conflict’ with complex example." (let ((system-time-locale "C")) (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 :END: ") (org-mode) (should (equal (timeline-tools-clockline-no-conflict (org-time-string-to-seconds "[2018-01-07 Sun 13:00]") (org-time-string-to-seconds "[2018-01-11 Thu 13:33]") (current-buffer)) "CLOCK: [2018-01-07 Sun 13:00]--[2018-01-11 Thu 13:33] => 96:33")) (should (equal (buffer-string) " * Task 1 :LOGBOOK: CLOCK: [2018-01-11 Thu 13:33]--[2018-01-12 Fri 14:00] => 24:27 :END: * Task 2 :LOGBOOK: :END: "))))) (ert-deftest timeline-tools-test-add-clockline-to-marker-1 () "Test `timeline-tools-add-clockline-to-marker’ without running clock." (let ((system-time-locale "C")) (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 :END: ") (org-mode) (goto-char 216) (let ((result (timeline-tools-add-clockline-to-marker (point-marker) (org-time-string-to-seconds "[2018-01-07 Sun 13:00]") (org-time-string-to-seconds "[2018-01-11 Thu 13:33]")))) (should (null result)) (should (equal (buffer-string) " * Task 1 :LOGBOOK: CLOCK: [2018-01-11 Thu 13:33]--[2018-01-12 Fri 14:00] => 24:27 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:00]--[2018-01-11 Thu 13:33] => 96:33 :END: ")))))) (ert-deftest timeline-tools-test-add-clockline-to-marker-2 () "Test `timeline-tools-add-clockline-to-marker’ with running clock at same task." (let ((system-time-locale "C")) (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-10 Wed 13:10] CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 :END: ") (org-mode) (let (;; simulate running clock at Task 2 (org-clock-hd-marker (progn (goto-char 216) (point-marker))) (org-clock-marker (progn (goto-char 264) (point-marker))) (org-clock-start-time (org-time-string-to-time "[2018-01-10 Wed 13:10]"))) (let ((result (timeline-tools-add-clockline-to-marker org-clock-hd-marker (org-time-string-to-seconds "[2018-01-07 Sun 13:00]") (org-time-string-to-seconds "[2018-01-11 Thu 13:33]")))) (should (null result)) (should (equal org-clock-start-time (append (org-time-string-to-time "[2018-01-11 Thu 13:33]") '(0 0)))) (should (equal (buffer-string) " * Task 1 :LOGBOOK: CLOCK: [2018-01-11 Thu 13:33]--[2018-01-12 Fri 14:00] => 24:27 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-11 Thu 13:33] CLOCK: [2018-01-07 Sun 13:00]--[2018-01-11 Thu 13:33] => 96:33 :END: "))))))) (ert-deftest timeline-tools-test-add-clockline-to-marker-3 () "Test `timeline-tools-add-clockline-to-marker’ with running clock at same task." (let ((system-time-locale "C")) (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-10 Wed 13:10] CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 :END: ") (org-mode) (let (;; simulate running clock at Task 2 (org-clock-hd-marker (progn (goto-char 153) (point-marker))) (org-clock-marker (progn (goto-char 201) (point-marker))) (org-clock-start-time (org-time-string-to-time "[2018-01-10 Wed 13:10]"))) (let ((result (timeline-tools-add-clockline-to-marker (progn (goto-char 2) (point-marker)) (org-time-string-to-seconds "[2018-01-07 Sun 13:00]") (org-time-string-to-seconds "[2018-01-11 Thu 13:33]")))) (should (null result)) (should (equal org-clock-start-time (append (org-time-string-to-time "[2018-01-11 Thu 13:33]") '(0 0)))) (should (equal (buffer-string) " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:00]--[2018-01-11 Thu 13:33] => 96:33 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-11 Thu 13:33] :END: "))))))) (ert-deftest timeline-tools-test-add-clockline-to-marker-4 () "Test `timeline-tools-add-clockline-to-marker’ with running clock at other task, and where afterwards only the running clock line is left." (let ((system-time-locale "C")) (with-temp-buffer (insert " * Task 1 :LOGBOOK: CLOCK: [2018-01-10 Wed 10:07]--[2018-01-12 Fri 14:00] => 51:53 CLOCK: [2018-01-08 Mon 16:15]--[2018-01-10 Wed 13:10] => 44:55 CLOCK: [2018-01-07 Sun 13:15]--[2018-01-07 Sun 14:00] => 0:45 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-10 Wed 13:10] CLOCK: [2018-01-08 Mon 16:00]--[2018-01-08 Mon 16:15] => 0:15 CLOCK: [2018-01-07 Sun 15:13]--[2018-01-07 Sun 16:17] => 1:04 :END: ") (org-mode) (let (;; simulate running clock at Task 2 (org-clock-hd-marker (progn (goto-char 216) (point-marker))) (org-clock-marker (progn (goto-char 264) (point-marker))) (org-clock-start-time (org-time-string-to-time "[2018-01-10 Wed 13:10]"))) (let ((result (timeline-tools-add-clockline-to-marker (progn (goto-char 2) (point-marker)) (org-time-string-to-seconds "[2018-01-07 Sun 13:00]") (org-time-string-to-seconds "[2018-01-11 Thu 13:33]")))) (should (null result)) (should (equal org-clock-start-time (append (org-time-string-to-time "[2018-01-11 Thu 13:33]") '(0 0)))) (should (equal (buffer-string) " * Task 1 :LOGBOOK: CLOCK: [2018-01-07 Sun 13:00]--[2018-01-11 Thu 13:33] => 96:33 CLOCK: [2018-01-11 Thu 13:33]--[2018-01-12 Fri 14:00] => 24:27 :END: * Task 2 :LOGBOOK: CLOCK: [2018-01-11 Thu 13:33] :END: "))))))) ;;; timeline-tools-test.el ends here