diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-05 04:31:20 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-05 04:31:20 -0500 |
| commit | bc75218917e8e01bc67a2582d3fb2bac32bd28fe (patch) | |
| tree | e11fdd78dd60c2fc20b10f5cd405b048d08f3c19 | |
| parent | 08fbd97864ef86ed127e0d6a5fb3005c53db47f8 (diff) | |
| download | org-drill-bc75218917e8e01bc67a2582d3fb2bac32bd28fe.tar.gz org-drill-bc75218917e8e01bc67a2582d3fb2bac32bd28fe.zip | |
test: add minibuffer prompt, relearn-item, and progress-message coverage
10 ERT tests covering:
- org-drill--make-minibuffer-prompt: status char (N/Y/o/!/F),
cram-mode shows C, done-entries count, prompt-text passthrough
- org-drill-relearn-item: resets DRILL_LAST_INTERVAL to 0,
unschedules the entry (days-ahead = 0 path through smart-reschedule)
- org-drill-progress-message: emits on multiples of 50, silent
otherwise, includes the COLLECTED count
| -rw-r--r-- | tests/test-org-drill-prompt-and-misc.el | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/tests/test-org-drill-prompt-and-misc.el b/tests/test-org-drill-prompt-and-misc.el new file mode 100644 index 0000000..d684c9a --- /dev/null +++ b/tests/test-org-drill-prompt-and-misc.el @@ -0,0 +1,145 @@ +;;; test-org-drill-prompt-and-misc.el --- Tests for prompt formatting and miscellaneous helpers -*- lexical-binding: t; -*- + +;;; Commentary: +;; Tests for several smaller helpers users see indirectly: +;; +;; - `org-drill--make-minibuffer-prompt': formats the live status line +;; that appears at the top of every drill prompt — `Y 3 0 5 12 ...' +;; showing card status / done / failed / mature / new / prompt. +;; - `org-drill-relearn-item': resets the current item's interval to 0 +;; so it gets drilled again. +;; - `org-drill-progress-message': progress bar shown during the +;; collection scan, only updates every 50 scans. + +;;; Code: + +(require 'ert) +(require 'cl-lib) +(require 'org) +(require 'org-drill) + +;;;; Helpers + +(defmacro with-fresh-drill-entry (&rest body) + (declare (indent 0)) + `(with-temp-buffer + (let ((org-startup-folded nil)) + (insert "* Question :drill:\nbody\n") + (org-mode) + (goto-char (point-min)) + ,@body))) + +(defmacro with-fixed-now (&rest body) + `(cl-letf (((symbol-function 'current-time) + (lambda () (encode-time 0 0 12 5 5 2026)))) + ,@body)) + +(defun make-marker-at (pos) + (let ((m (make-marker))) (set-marker m pos) m)) + +;;;; org-drill--make-minibuffer-prompt + +(ert-deftest test-org-drill--make-minibuffer-prompt-includes-status-character () + "A :new entry shows `N' as the leading status char." + (with-fresh-drill-entry + (with-fixed-now + (let* ((session (org-drill-session)) + (prompt (org-drill--make-minibuffer-prompt session "test"))) + (should (string-match-p "\\bN\\b" (substring-no-properties prompt))))))) + +(ert-deftest test-org-drill--make-minibuffer-prompt-cram-shows-C () + "Cram mode displays `C' regardless of the underlying status." + (with-fresh-drill-entry + (with-fixed-now + (let ((session (org-drill-session))) + (oset session cram-mode t) + (let ((prompt (org-drill--make-minibuffer-prompt session "test"))) + (should (string-match-p "\\bC\\b" (substring-no-properties prompt)))))))) + +(ert-deftest test-org-drill--make-minibuffer-prompt-failed-shows-F () + (with-temp-buffer + (let ((org-startup-folded nil)) + (insert "* Question :drill:\nbody\n") + (org-mode) + (goto-char (point-min)) + (org-schedule nil "2026-04-30") + (org-set-property "DRILL_LAST_QUALITY" "1") + (org-set-property "DRILL_LAST_INTERVAL" "5") + (org-set-property "DRILL_TOTAL_REPEATS" "3") + (with-fixed-now + (let* ((session (org-drill-session)) + (prompt (org-drill--make-minibuffer-prompt session "test"))) + (should (string-match-p "\\bF\\b" (substring-no-properties prompt)))))))) + +(ert-deftest test-org-drill--make-minibuffer-prompt-includes-done-count () + "Done count appears in the prompt as a numeric field." + (with-fresh-drill-entry + (with-fixed-now + (let ((session (org-drill-session))) + (oset session done-entries + (list (make-marker-at 1) (make-marker-at 1) (make-marker-at 1))) + (let ((prompt (org-drill--make-minibuffer-prompt session "..."))) + ;; 3 done items should appear as " 3 " somewhere + (should (string-match-p "\\b3\\b" (substring-no-properties prompt)))))))) + +(ert-deftest test-org-drill--make-minibuffer-prompt-passes-through-prompt-text () + "The user's prompt text shows up at the end." + (with-fresh-drill-entry + (with-fixed-now + (let* ((session (org-drill-session)) + (result (org-drill--make-minibuffer-prompt session "type-your-answer"))) + (should (string-match-p "type-your-answer" result)))))) + +;;;; org-drill-relearn-item + +(ert-deftest test-org-drill-relearn-item-resets-interval-to-zero () + "Relearning sets DRILL_LAST_INTERVAL back to 0 — the card behaves as new." + (with-fresh-drill-entry + (org-drill-store-item-data 30 5 0 5 4.0 2.5) + (with-fixed-now + (org-drill-relearn-item)) + ;; After relearn: last-interval should be 0 + (should (= 0 (string-to-number + (org-entry-get (point) "DRILL_LAST_INTERVAL")))))) + +(ert-deftest test-org-drill-relearn-item-removes-scheduled-stamp () + "Relearning unschedules the entry (days-ahead = 0 path)." + (with-fresh-drill-entry + (org-drill-store-item-data 30 5 0 5 4.0 2.5) + (org-schedule nil "2026-06-01") + (with-fixed-now + (org-drill-relearn-item)) + (should (null (org-entry-get (point) "SCHEDULED"))))) + +;;;; org-drill-progress-message + +(ert-deftest test-org-drill-progress-message-on-multiple-of-50-emits-message () + "Every 50th scan triggers a `Collecting due drill items...' message." + (let ((message-log-max nil) + (got-message nil)) + (cl-letf (((symbol-function 'message) + (lambda (fmt &rest args) (setq got-message (apply #'format fmt args))))) + (org-drill-progress-message 5 50) + (should got-message) + (should (string-match-p "Collecting due drill items" got-message))))) + +(ert-deftest test-org-drill-progress-message-on-non-multiple-stays-silent () + "Scans that aren't multiples of 50 don't update the message." + (let ((got-message nil)) + (cl-letf (((symbol-function 'message) + (lambda (fmt &rest _) (setq got-message fmt)))) + (org-drill-progress-message 5 17) ; 17 % 50 != 0 + (should (null got-message))))) + +(ert-deftest test-org-drill-progress-message-includes-collected-count () + "The message includes the COLLECTED count." + (let ((got-message nil)) + (cl-letf (((symbol-function 'message) + (lambda (fmt &rest args) + (setq got-message (apply #'format fmt args))))) + (org-drill-progress-message 42 50) + (should (string-match-p "42" got-message))))) + +(provide 'test-org-drill-prompt-and-misc) + +;;; test-org-drill-prompt-and-misc.el ends here |
