aboutsummaryrefslogtreecommitdiff
path: root/tests/test-org-drill-map-leitner-capture.el
blob: 114f51ec2587d58dee1d95b46f4d15278be9bedb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
;;; test-org-drill-map-leitner-capture.el --- Tests for map-leitner-capture  -*- lexical-binding: t; -*-

;;; Commentary:
;; Tests for `org-drill-map-leitner-capture', the per-entry callback that
;; routes a leitner-tagged heading into either `org-drill-leitner-boxed-entries'
;; (when DRILL_LEITNER_BOX is set 0-5) or `org-drill-leitner-unboxed-entries'
;; (when the property is missing).  Box values >5 are graduates and are
;; ignored.

;;; Code:

(require 'ert)
(require 'cl-lib)
(require 'org)
(require 'org-drill)

(defmacro with-leitner-tempfile (content &rest body)
  "Run BODY in a tempfile-backed org buffer with CONTENT, with empty leitner queues."
  (declare (indent 1))
  `(let ((tmpfile (make-temp-file "org-drill-leitner-test-" nil ".org"))
         (org-drill-leitner-boxed-entries nil)
         (org-drill-leitner-unboxed-entries nil))
     (unwind-protect
         (with-current-buffer (find-file-noselect tmpfile)
           (let ((org-startup-folded nil))
             (insert ,content)
             (org-mode)
             (goto-char (point-min))
             ,@body))
       (when (file-exists-p tmpfile) (delete-file tmpfile)))))

(ert-deftest test-map-leitner-capture-no-box-property-pushes-unboxed ()
  "Entry with no DRILL_LEITNER_BOX lands in the unboxed queue."
  (with-leitner-tempfile "* Card :leitner:\nbody\n"
    (let ((session (org-drill-session))
          (org-drill-question-tag org-drill-leitner-tag))
      (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
        (org-drill-map-leitner-capture session))
      (should (= 1 (length org-drill-leitner-unboxed-entries)))
      (should (= 0 (length org-drill-leitner-boxed-entries))))))

(ert-deftest test-map-leitner-capture-box-in-range-pushes-boxed ()
  "Entry with DRILL_LEITNER_BOX 0-5 lands in the boxed queue."
  (dolist (box '("0" "1" "2" "3" "4" "5"))
    (with-leitner-tempfile (format "* Card :leitner:\n:PROPERTIES:\n:DRILL_LEITNER_BOX: %s\n:END:\nbody\n" box)
      (let ((session (org-drill-session))
            (org-drill-question-tag org-drill-leitner-tag))
        (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
          (org-drill-map-leitner-capture session))
        (should (= 1 (length org-drill-leitner-boxed-entries)))
        (should (= 0 (length org-drill-leitner-unboxed-entries)))))))

(ert-deftest test-map-leitner-capture-graduate-box-skipped ()
  "Entry with DRILL_LEITNER_BOX > 5 is ignored — already graduated."
  (with-leitner-tempfile "* Card :leitner:\n:PROPERTIES:\n:DRILL_LEITNER_BOX: 6\n:END:\nbody\n"
    (let ((session (org-drill-session))
          (org-drill-question-tag org-drill-leitner-tag))
      (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
        (org-drill-map-leitner-capture session))
      (should (= 0 (length org-drill-leitner-boxed-entries)))
      (should (= 0 (length org-drill-leitner-unboxed-entries))))))

(ert-deftest test-map-leitner-capture-no-headline-skipped ()
  "A buffer with no headline at all is skipped entirely."
  (with-leitner-tempfile "Just text, no headlines\n"
    (let ((session (org-drill-session))
          (org-drill-question-tag org-drill-leitner-tag))
      (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
        (org-drill-map-leitner-capture session))
      (should (= 0 (length org-drill-leitner-boxed-entries)))
      (should (= 0 (length org-drill-leitner-unboxed-entries))))))

(ert-deftest test-map-leitner-capture-increments-session-counter ()
  "Each call bumps the session's `cnt' slot."
  (with-leitner-tempfile "* Card :leitner:\nbody\n"
    (let ((session (org-drill-session)))
      (oset session cnt 0)
      (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
        (org-drill-map-leitner-capture session)
        (org-drill-map-leitner-capture session))
      (should (= 2 (oref session cnt))))))

(provide 'test-org-drill-map-leitner-capture)
;;; test-org-drill-map-leitner-capture.el ends here