aboutsummaryrefslogtreecommitdiff
path: root/tests/test-org-drill-leitner-start-box.el
blob: a221e7d9d9e49d639647684bd9e9a9a6a4f646e1 (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
;;; test-org-drill-leitner-start-box.el --- Tests for leitner-start-box  -*- lexical-binding: t; -*-

;;; Commentary:
;; Tests for `org-drill-leitner-start-box', which moves N entries from the
;; unboxed queue into box 1 by setting their DRILL_LEITNER_BOX property.

;;; Code:

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

(defmacro with-leitner-unboxed-tempfile (content &rest body)
  "Run BODY in a tempfile-backed org buffer with CONTENT.
Initializes leitner queues empty, mocks `sit-for' and `message' to ignore."
  (declare (indent 1))
  `(let ((tmpfile (make-temp-file "org-drill-start-box-" 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))
             (cl-letf (((symbol-function 'sit-for) #'ignore)
                       ((symbol-function 'message) #'ignore))
               ,@body)))
       (when (file-exists-p tmpfile) (delete-file tmpfile)))))

(ert-deftest test-leitner-start-box-sets-box-property-on-each-entry ()
  "Each unboxed entry processed gets DRILL_LEITNER_BOX = \"1\"."
  (with-leitner-unboxed-tempfile
      "* A :leitner:\nbody\n* B :leitner:\nbody\n"
    (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
      (let ((org-drill-question-tag org-drill-leitner-tag))
        (org-drill-all-leitner-capture 'file))
      (should (= 2 (length org-drill-leitner-unboxed-entries)))
      (org-drill-leitner-start-box 2)
      (let ((boxed-count 0))
        (org-map-entries
         (lambda ()
           (when (equal "1" (org-entry-get (point) "DRILL_LEITNER_BOX"))
             (cl-incf boxed-count))))
        (should (= 2 boxed-count))))))

(ert-deftest test-leitner-start-box-respects-number-arg ()
  "Asking for fewer entries than available only boxes that many."
  (with-leitner-unboxed-tempfile
      "* A :leitner:\nbody\n* B :leitner:\nbody\n* C :leitner:\nbody\n"
    (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
      (let ((org-drill-question-tag org-drill-leitner-tag))
        (org-drill-all-leitner-capture 'file))
      (org-drill-leitner-start-box 1)
      (let ((boxed-count 0))
        (org-map-entries
         (lambda ()
           (when (equal "1" (org-entry-get (point) "DRILL_LEITNER_BOX"))
             (cl-incf boxed-count))))
        (should (= 1 boxed-count))))))

(ert-deftest test-leitner-start-box-zero-is-noop ()
  "Asking for zero entries doesn't touch any."
  (with-leitner-unboxed-tempfile
      "* A :leitner:\nbody\n"
    (cl-letf (((symbol-function 'org-drill-progress-message) #'ignore))
      (let ((org-drill-question-tag org-drill-leitner-tag))
        (org-drill-all-leitner-capture 'file))
      (org-drill-leitner-start-box 0)
      (let ((boxed-count 0))
        (org-map-entries
         (lambda ()
           (when (equal "1" (org-entry-get (point) "DRILL_LEITNER_BOX"))
             (cl-incf boxed-count))))
        (should (= 0 boxed-count))))))

(provide 'test-org-drill-leitner-start-box)
;;; test-org-drill-leitner-start-box.el ends here