summaryrefslogtreecommitdiff
path: root/tests/test-org-drill-font-switching.el
blob: 27d5f4206336da278cb84390f5aa0022cc35c379 (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
166
167
168
169
170
171
172
173
174
175
;;; test-org-drill-font-switching.el --- Tests for org-drill display management -*- lexical-binding: t; -*-

;;; Commentary:
;; Tests that org-drill automatically manages display settings (fonts, modeline)
;; and restores them when the session ends.
;;
;; These are unit tests for the pure logic functions, testing them in isolation
;; without requiring the full org-drill package.

;;; Code:

(require 'ert)

;; Define the functions we're testing (extracted from org-drill-config.el)

(defvar cj/org-drill-previous-preset nil
  "Stores the font preset active before starting org-drill.")

(defvar cj/org-drill-previous-modeline-format nil
  "Stores the modeline format active before starting org-drill.")

(defvar fontaine-current-preset nil
  "Current fontaine preset (mocked for testing).")

(defvar mode-line-format '("Mock modeline")
  "Mock modeline format for testing.")

(defvar org-drill-hide-modeline-during-session t
  "Whether to hide modeline during drill sessions.")

(defun fontaine-set-preset (preset)
  "Mock function: Set fontaine preset to PRESET."
  (setq fontaine-current-preset preset))

(defun cj/org-drill-setup-display ()
  "Set up display for drill sessions: larger fonts and hidden modeline."
  (unless cj/org-drill-previous-preset
    (setq cj/org-drill-previous-preset fontaine-current-preset))
  (fontaine-set-preset 'EBook)
  (when org-drill-hide-modeline-during-session
    (unless cj/org-drill-previous-modeline-format
      (setq cj/org-drill-previous-modeline-format mode-line-format))
    (setq mode-line-format nil)))

(defun cj/org-drill-restore-display ()
  "Restore display settings after drill session ends."
  (when cj/org-drill-previous-preset
    (fontaine-set-preset cj/org-drill-previous-preset)
    (setq cj/org-drill-previous-preset nil))
  (when cj/org-drill-previous-modeline-format
    (setq mode-line-format cj/org-drill-previous-modeline-format)
    (setq cj/org-drill-previous-modeline-format nil)))

;;; Font Management Tests

(ert-deftest test-org-drill-display/saves-current-preset ()
  "Test that starting org-drill saves the current font preset."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'default))
    (cj/org-drill-setup-display)
    (should (eq cj/org-drill-previous-preset 'default))))

(ert-deftest test-org-drill-display/switches-to-ebook ()
  "Test that starting org-drill switches to EBook preset."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'default))
    (cj/org-drill-setup-display)
    (should (eq fontaine-current-preset 'EBook))))

(ert-deftest test-org-drill-display/restores-previous-preset ()
  "Test that ending org-drill restores the previous font preset."
  (let ((cj/org-drill-previous-preset 'default)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'EBook))
    (cj/org-drill-restore-display)
    (should (eq fontaine-current-preset 'default))))

(ert-deftest test-org-drill-display/clears-saved-preset-after-restore ()
  "Test that restoring display clears the saved preset."
  (let ((cj/org-drill-previous-preset 'default)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'EBook))
    (cj/org-drill-restore-display)
    (should (null cj/org-drill-previous-preset))))

;;; Modeline Management Tests

(ert-deftest test-org-drill-display/hides-modeline ()
  "Test that starting org-drill hides the modeline when configured."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'default)
        (mode-line-format '("Mock modeline"))
        (org-drill-hide-modeline-during-session t))
    (cj/org-drill-setup-display)
    (should (null mode-line-format))
    (should (equal cj/org-drill-previous-modeline-format '("Mock modeline")))))

(ert-deftest test-org-drill-display/respects-modeline-config ()
  "Test that modeline hiding respects the configuration variable."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'default)
        (mode-line-format '("Mock modeline"))
        (org-drill-hide-modeline-during-session nil))
    (cj/org-drill-setup-display)
    (should (equal mode-line-format '("Mock modeline")))
    (should (null cj/org-drill-previous-modeline-format))))

(ert-deftest test-org-drill-display/restores-modeline ()
  "Test that ending org-drill restores the modeline."
  (let ((cj/org-drill-previous-preset 'default)
        (cj/org-drill-previous-modeline-format '("Mock modeline"))
        (fontaine-current-preset 'EBook)
        (mode-line-format nil))
    (cj/org-drill-restore-display)
    (should (equal mode-line-format '("Mock modeline")))
    (should (null cj/org-drill-previous-modeline-format))))

;;; Boundary Cases

(ert-deftest test-org-drill-display/does-not-save-preset-twice ()
  "Test that calling setup twice doesn't overwrite the saved preset."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'default))
    ;; First call saves 'default
    (cj/org-drill-setup-display)
    (should (eq cj/org-drill-previous-preset 'default))

    ;; Manually change current preset (simulating a preset change during drill)
    (setq fontaine-current-preset 'FiraCode)

    ;; Second call should NOT update saved preset
    (cj/org-drill-setup-display)
    (should (eq cj/org-drill-previous-preset 'default))
    (should-not (eq cj/org-drill-previous-preset 'FiraCode))))

(ert-deftest test-org-drill-display/restore-with-nil-previous-preset ()
  "Test that restore does nothing when no preset was saved."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'EBook))
    (cj/org-drill-restore-display)
    ;; Should remain at EBook (no restore happened)
    (should (eq fontaine-current-preset 'EBook))
    (should (null cj/org-drill-previous-preset))))

;;; Integration Tests

(ert-deftest test-org-drill-display/full-cycle ()
  "Test complete cycle: save -> switch -> restore."
  (let ((cj/org-drill-previous-preset nil)
        (cj/org-drill-previous-modeline-format nil)
        (fontaine-current-preset 'FiraCode)
        (mode-line-format '("Original modeline"))
        (org-drill-hide-modeline-during-session t))
    ;; Step 1: Start drill (save state, switch to EBook, hide modeline)
    (cj/org-drill-setup-display)
    (should (eq cj/org-drill-previous-preset 'FiraCode))
    (should (eq fontaine-current-preset 'EBook))
    (should (equal cj/org-drill-previous-modeline-format '("Original modeline")))
    (should (null mode-line-format))

    ;; Step 2: End drill (restore everything)
    (cj/org-drill-restore-display)
    (should (eq fontaine-current-preset 'FiraCode))
    (should (null cj/org-drill-previous-preset))
    (should (equal mode-line-format '("Original modeline")))
    (should (null cj/org-drill-previous-modeline-format))))

(provide 'test-org-drill-font-switching)
;;; test-org-drill-font-switching.el ends here