aboutsummaryrefslogtreecommitdiff
path: root/tests/test-org-drill-display-state.el
blob: 000a007e8bceaacc0b6361d56f2a99d9d1edbfcd (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
;;; test-org-drill-display-state.el --- Tests for display-state save/restore  -*- lexical-binding: t; -*-

;;; Commentary:
;; Tests for `org-drill--setup-display' and `org-drill--restore-display',
;; which save the user's text scale, variable-pitch mode, and modeline at
;; session start and put them back at session end.  Also covers the
;; `directory' branch of `org-drill-current-scope'.

;;; Code:

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

;;;; --save-display-state / --restore-display

(ert-deftest test-save-display-state-records-current-buffer ()
  "After save, `org-drill--saved-display-buffer' holds the buffer."
  (with-temp-buffer
    (let ((org-drill-text-size-during-session nil)
          (org-drill-use-variable-pitch nil)
          (org-drill-hide-modeline-during-session nil)
          (org-drill--saved-display-buffer nil))
      (org-drill--setup-display)
      (should (eq (current-buffer) org-drill--saved-display-buffer)))))

(ert-deftest test-save-display-state-skips-when-flags-nil ()
  "With every flag nil, save records buffer but doesn't capture face/mode state."
  (with-temp-buffer
    (let ((org-drill-text-size-during-session nil)
          (org-drill-use-variable-pitch nil)
          (org-drill-hide-modeline-during-session nil)
          (org-drill--saved-display-buffer nil)
          (org-drill--saved-text-scale 'sentinel)
          (org-drill--saved-variable-pitch-mode 'unbound)
          (org-drill--saved-modeline-format 'sentinel))
      (org-drill--setup-display)
      ;; Saved-text-scale is left untouched because the flag was nil.
      (should (eq 'sentinel org-drill--saved-text-scale))
      (should (eq 'unbound org-drill--saved-variable-pitch-mode))
      (should (eq 'sentinel org-drill--saved-modeline-format)))))

(ert-deftest test-save-display-state-captures-modeline-when-hide-flag-set ()
  "With `org-drill-hide-modeline-during-session' t, the modeline is saved and cleared."
  (with-temp-buffer
    (let ((org-drill-text-size-during-session nil)
          (org-drill-use-variable-pitch nil)
          (org-drill-hide-modeline-during-session t)
          (org-drill--saved-display-buffer nil)
          (org-drill--saved-modeline-format nil))
      (setq-local mode-line-format "marker-mode-line")
      (org-drill--setup-display)
      (should (equal "marker-mode-line" org-drill--saved-modeline-format))
      (should (null mode-line-format)))))

(ert-deftest test-restore-display-puts-modeline-back ()
  "Restore sets mode-line-format on the saved-display-buffer back to its prior value."
  (with-temp-buffer
    (let ((org-drill-text-size-during-session nil)
          (org-drill-use-variable-pitch nil)
          (org-drill-hide-modeline-during-session t)
          (org-drill--saved-display-buffer (current-buffer))
          (org-drill--saved-text-scale nil)
          (org-drill--saved-variable-pitch-mode 'unbound)
          (org-drill--saved-modeline-format "saved-modeline"))
      (setq-local mode-line-format nil)
      (org-drill--restore-display)
      (should (equal "saved-modeline" mode-line-format))
      (should (null org-drill--saved-modeline-format))
      (should (null org-drill--saved-display-buffer)))))

(ert-deftest test-restore-display-handles-killed-buffer-target ()
  "If the saved-display-buffer was killed, restore must not crash."
  (let ((tmp (generate-new-buffer " *drill-display-tmp*")))
    (let ((org-drill-text-size-during-session nil)
          (org-drill-use-variable-pitch nil)
          (org-drill-hide-modeline-during-session t)
          (org-drill--saved-display-buffer tmp)
          (org-drill--saved-text-scale nil)
          (org-drill--saved-variable-pitch-mode 'unbound)
          (org-drill--saved-modeline-format "saved-modeline"))
      (kill-buffer tmp)
      (org-drill--restore-display)
      (should (null org-drill--saved-display-buffer)))))

(ert-deftest test-restore-display-restores-variable-pitch-mode ()
  "Restore turns variable-pitch-mode back on in the saved-display-buffer
when it was active at session start."
  (with-temp-buffer
    (let ((toggled nil))
      (cl-letf (((symbol-function 'variable-pitch-mode)
                 (lambda (arg) (setq toggled arg))))
        (let ((org-drill-text-size-during-session nil)
              (org-drill-use-variable-pitch t)
              (org-drill-hide-modeline-during-session nil)
              (org-drill--saved-display-buffer (current-buffer))
              (org-drill--saved-text-scale nil)
              (org-drill--saved-variable-pitch-mode t)
              (org-drill--saved-modeline-format nil))
          (org-drill--restore-display)
          (should (= 1 toggled))
          (should (null org-drill--saved-variable-pitch-mode)))))))

(ert-deftest test-restore-display-disables-variable-pitch-when-it-was-off ()
  "Restore turns variable-pitch-mode off when it was off at session start."
  (with-temp-buffer
    (let ((toggled nil))
      (cl-letf (((symbol-function 'variable-pitch-mode)
                 (lambda (arg) (setq toggled arg))))
        (let ((org-drill-text-size-during-session nil)
              (org-drill-use-variable-pitch t)
              (org-drill-hide-modeline-during-session nil)
              (org-drill--saved-display-buffer (current-buffer))
              (org-drill--saved-text-scale nil)
              (org-drill--saved-variable-pitch-mode nil)
              (org-drill--saved-modeline-format nil))
          (org-drill--restore-display)
          (should (= -1 toggled)))))))

(ert-deftest test-restore-display-restores-text-scale ()
  "Restore puts the default face's :height back to the saved value."
  (let ((set-args nil))
    (cl-letf (((symbol-function 'set-face-attribute)
               (lambda (&rest args) (push args set-args))))
      (let ((org-drill-text-size-during-session 14)
            (org-drill-use-variable-pitch nil)
            (org-drill-hide-modeline-during-session nil)
            (org-drill--saved-display-buffer (current-buffer))
            (org-drill--saved-text-scale 100)
            (org-drill--saved-variable-pitch-mode 'unbound)
            (org-drill--saved-modeline-format nil))
        (org-drill--restore-display)
        (should (cl-some (lambda (a) (memq 100 a)) set-args))
        (should (null org-drill--saved-text-scale))))))

;;;; org-drill-current-scope (directory branch)

(ert-deftest test-org-drill-current-scope-directory-returns-org-files-list ()
  "The `directory' scope expands to a list of .org files in the buffer's directory."
  (let* ((tmpdir (make-temp-file "org-drill-scope-" t))
         (a (expand-file-name "a.org" tmpdir))
         (b (expand-file-name "b.org" tmpdir))
         (skip (expand-file-name ".hidden.org" tmpdir))
         (other (expand-file-name "c.txt" tmpdir)))
    (unwind-protect
        (progn
          (write-region "" nil a)
          (write-region "" nil b)
          (write-region "" nil skip)
          (write-region "" nil other)
          (with-current-buffer (find-file-noselect a)
            (let ((files (org-drill-current-scope 'directory)))
              (should (member a files))
              (should (member b files))
              (should-not (member skip files))
              (should-not (member other files)))))
      (when (file-exists-p a) (delete-file a))
      (when (file-exists-p b) (delete-file b))
      (when (file-exists-p skip) (delete-file skip))
      (when (file-exists-p other) (delete-file other))
      (delete-directory tmpdir))))

(provide 'test-org-drill-display-state)
;;; test-org-drill-display-state.el ends here